1 #ifndef REFLECTIVE_RAPIDJSON_TRAITS
2 #define REFLECTIVE_RAPIDJSON_TRAITS
4 #include <c++utilities/misc/traits.h>
9 #include <unordered_map>
10 #include <unordered_set>
14 namespace Traits = ::CppUtilities::Traits;
30 #define REFLECTIVE_RAPIDJSON_TREAT_AS_MAP_OR_HASH(T) \
31 template <> struct TreatAsMapOrHash<T> : public Traits::Bool<true> { \
33 #define REFLECTIVE_RAPIDJSON_TREAT_AS_MULTI_MAP_OR_HASH(T) \
34 template <> struct TreatAsMultiMapOrHash<T> : public Traits::Bool<true> { \
36 #define REFLECTIVE_RAPIDJSON_TREAT_AS_SET(T) \
37 template <> struct TreatAsSet<T> : public Traits::Bool<true> { \
39 #define REFLECTIVE_RAPIDJSON_TREAT_AS_MULTI_SET(T) \
40 template <> struct TreatAsMultiSet<T> : public Traits::Bool<true> { \
44 template <
typename Type>
46 = Traits::Any<Traits::IsSpecializationOf<Type, std::map>, Traits::IsSpecializationOf<Type, std::unordered_map>,
TreatAsMapOrHash<Type>>;
47 template <
typename Type>
48 using IsMultiMapOrHash = Traits::Any<Traits::IsSpecializationOf<Type, std::multimap>, Traits::IsSpecializationOf<Type, std::unordered_multimap>,
50 template <
typename Type>
51 using IsSet = Traits::Any<Traits::IsSpecializationOf<Type, std::set>, Traits::IsSpecializationOf<Type, std::unordered_set>,
TreatAsSet<Type>>;
52 template <
typename Type>
54 = Traits::Any<Traits::IsSpecializationOf<Type, std::multiset>, Traits::IsSpecializationOf<Type, std::unordered_multiset>,
TreatAsMultiSet<Type>>;
55 template <
typename Type>
56 using IsArrayOrSet = Traits::Any<Traits::All<Traits::IsIteratable<Type>, Traits::Not<Traits::IsSpecializationOf<Type, std::basic_string>>,
57 Traits::Not<IsMapOrHash<Type>>, Traits::Not<IsMultiMapOrHash<Type>>>,
59 template <
typename Type>
60 using IsArray = Traits::All<Traits::IsIteratable<Type>, Traits::Not<Traits::IsSpecializationOf<Type, std::basic_string>>,
61 Traits::Not<IsMapOrHash<Type>>, Traits::Not<IsSet<Type>>, Traits::Not<IsMultiSet<Type>>>;
62 template <
typename Type>
63 using IsIteratableExceptString = Traits::All<Traits::IsIteratable<Type>, Traits::Not<Traits::IsSpecializationOf<Type, std::basic_string>>>;
67 #endif // REFLECTIVE_RAPIDJSON_TRAITS