@@ -884,54 +884,6 @@ namespace cereal
884
884
(has_non_member_load<T, InputArchive>::value && has_non_member_save<T, OutputArchive>::value) ||
885
885
(has_non_member_versioned_load<T, InputArchive>::value && has_non_member_versioned_save<T, OutputArchive>::value)> {};
886
886
887
- // ######################################################################
888
- namespace detail
889
- {
890
- template <class T , class OutputArchive >
891
- struct count_output_serializers : std::integral_constant<int ,
892
- has_member_save<T, OutputArchive>::value +
893
- has_non_member_save<T, OutputArchive>::value +
894
- has_member_serialize<T, OutputArchive>::value +
895
- has_non_member_serialize<T, OutputArchive>::value +
896
- has_member_save_minimal<T, OutputArchive>::value +
897
- has_non_member_save_minimal<T, OutputArchive>::value +
898
- /* -versioned---------------------------------------------------------*/
899
- has_member_versioned_save<T, OutputArchive>::value +
900
- has_non_member_versioned_save<T, OutputArchive>::value +
901
- has_member_versioned_serialize<T, OutputArchive>::value +
902
- has_non_member_versioned_serialize<T, OutputArchive>::value +
903
- has_member_versioned_save_minimal<T, OutputArchive>::value +
904
- has_non_member_versioned_save_minimal<T, OutputArchive>::value> {};
905
- }
906
-
907
- template <class T , class OutputArchive >
908
- struct is_output_serializable : std::integral_constant<bool ,
909
- detail::count_output_serializers<T, OutputArchive>::value == 1 > {};
910
-
911
- // ######################################################################
912
- namespace detail
913
- {
914
- template <class T , class InputArchive >
915
- struct count_input_serializers : std::integral_constant<int ,
916
- has_member_load<T, InputArchive>::value +
917
- has_non_member_load<T, InputArchive>::value +
918
- has_member_serialize<T, InputArchive>::value +
919
- has_non_member_serialize<T, InputArchive>::value +
920
- has_member_load_minimal<T, InputArchive>::value +
921
- has_non_member_load_minimal<T, InputArchive>::value +
922
- /* -versioned---------------------------------------------------------*/
923
- has_member_versioned_load<T, InputArchive>::value +
924
- has_non_member_versioned_load<T, InputArchive>::value +
925
- has_member_versioned_serialize<T, InputArchive>::value +
926
- has_non_member_versioned_serialize<T, InputArchive>::value +
927
- has_member_versioned_load_minimal<T, InputArchive>::value +
928
- has_non_member_versioned_load_minimal<T, InputArchive>::value> {};
929
- }
930
-
931
- template <class T , class InputArchive >
932
- struct is_input_serializable : std::integral_constant<bool ,
933
- detail::count_input_serializers<T, InputArchive>::value == 1 > {};
934
-
935
887
// ######################################################################
936
888
template <class T , class OutputArchive >
937
889
struct has_invalid_output_versioning : std::integral_constant<bool ,
@@ -970,15 +922,15 @@ namespace cereal
970
922
971
923
#undef CEREAL_MAKE_IS_SPECIALIZED_IMPL
972
924
973
- // ! Considered an error if specialization exists for more than one type
925
+ // ! Number of specializations detected
974
926
template <class T , class A >
975
- struct is_specialized_error : std::integral_constant<bool ,
976
- ( is_specialized_member_serialize<T, A>::value +
977
- is_specialized_member_load_save<T, A>::value +
978
- is_specialized_member_load_save_minimal<T, A>::value +
979
- is_specialized_non_member_serialize<T, A>::value +
980
- is_specialized_non_member_load_save<T, A>::value +
981
- is_specialized_non_member_load_save_minimal<T, A>::value) <= 1 > {};
927
+ struct count_specializations : std::integral_constant<int ,
928
+ is_specialized_member_serialize<T, A>::value +
929
+ is_specialized_member_load_save<T, A>::value +
930
+ is_specialized_member_load_save_minimal<T, A>::value +
931
+ is_specialized_non_member_serialize<T, A>::value +
932
+ is_specialized_non_member_load_save<T, A>::value +
933
+ is_specialized_non_member_load_save_minimal<T, A>::value> {};
982
934
} // namespace detail
983
935
984
936
// ! Check if any specialization exists for a type
@@ -991,7 +943,7 @@ namespace cereal
991
943
detail::is_specialized_non_member_load_save<T, A>::value ||
992
944
detail::is_specialized_non_member_load_save_minimal<T, A>::value>
993
945
{
994
- static_assert (detail::is_specialized_error <T, A>::value, " More than one explicit specialization detected for type." );
946
+ static_assert (detail::count_specializations <T, A>::value <= 1 , " More than one explicit specialization detected for type." );
995
947
};
996
948
997
949
// ! Create the static assertion for some specialization
@@ -1056,6 +1008,60 @@ namespace cereal
1056
1008
!(is_specialized_member_serialize<T, InputArchive>::value ||
1057
1009
is_specialized_member_load<T, InputArchive>::value))> {};
1058
1010
1011
+ // ######################################################################
1012
+ namespace detail
1013
+ {
1014
+ // ! The number of output serialization functions available
1015
+ /* ! If specialization is being used, we'll count only those; otherwise we'll count everything */
1016
+ template <class T , class OutputArchive >
1017
+ struct count_output_serializers : std::integral_constant<int ,
1018
+ count_specializations<T, OutputArchive>::value ? count_specializations<T, OutputArchive>::value :
1019
+ has_member_save<T, OutputArchive>::value +
1020
+ has_non_member_save<T, OutputArchive>::value +
1021
+ has_member_serialize<T, OutputArchive>::value +
1022
+ has_non_member_serialize<T, OutputArchive>::value +
1023
+ has_member_save_minimal<T, OutputArchive>::value +
1024
+ has_non_member_save_minimal<T, OutputArchive>::value +
1025
+ /* -versioned---------------------------------------------------------*/
1026
+ has_member_versioned_save<T, OutputArchive>::value +
1027
+ has_non_member_versioned_save<T, OutputArchive>::value +
1028
+ has_member_versioned_serialize<T, OutputArchive>::value +
1029
+ has_non_member_versioned_serialize<T, OutputArchive>::value +
1030
+ has_member_versioned_save_minimal<T, OutputArchive>::value +
1031
+ has_non_member_versioned_save_minimal<T, OutputArchive>::value> {};
1032
+ }
1033
+
1034
+ template <class T , class OutputArchive >
1035
+ struct is_output_serializable : std::integral_constant<bool ,
1036
+ detail::count_output_serializers<T, OutputArchive>::value == 1 > {};
1037
+
1038
+ // ######################################################################
1039
+ namespace detail
1040
+ {
1041
+ // ! The number of input serialization functions available
1042
+ /* ! If specialization is being used, we'll count only those; otherwise we'll count everything */
1043
+ template <class T , class InputArchive >
1044
+ struct count_input_serializers : std::integral_constant<int ,
1045
+ count_specializations<T, InputArchive>::value ? count_specializations<T, InputArchive>::value :
1046
+ has_member_load<T, InputArchive>::value +
1047
+ has_non_member_load<T, InputArchive>::value +
1048
+ has_member_serialize<T, InputArchive>::value +
1049
+ has_non_member_serialize<T, InputArchive>::value +
1050
+ has_member_load_minimal<T, InputArchive>::value +
1051
+ has_non_member_load_minimal<T, InputArchive>::value +
1052
+ /* -versioned---------------------------------------------------------*/
1053
+ has_member_versioned_load<T, InputArchive>::value +
1054
+ has_non_member_versioned_load<T, InputArchive>::value +
1055
+ has_member_versioned_serialize<T, InputArchive>::value +
1056
+ has_non_member_versioned_serialize<T, InputArchive>::value +
1057
+ has_member_versioned_load_minimal<T, InputArchive>::value +
1058
+ has_non_member_versioned_load_minimal<T, InputArchive>::value> {};
1059
+ }
1060
+
1061
+ template <class T , class InputArchive >
1062
+ struct is_input_serializable : std::integral_constant<bool ,
1063
+ detail::count_input_serializers<T, InputArchive>::value == 1 > {};
1064
+
1059
1065
// ######################################################################
1060
1066
// Base Class Support
1061
1067
namespace detail
0 commit comments