#ifndef REFLECTIVE_RAPIDJSON_TRAITS #define REFLECTIVE_RAPIDJSON_TRAITS #include #include #include #include #include #include #include namespace ReflectiveRapidJSON { namespace Traits = ::CppUtilities::Traits; // define structs and macros to allow treating custom data types as std::map, std::set, ... /// \brief \brief The TreatAsMapOrHash class allows treating custom classes as std::map or std::unordered_map. template struct TreatAsMapOrHash : public Traits::Bool {}; /// \brief \brief The TreatAsMultiMapOrHash class allows treating custom classes as std::multimap or std::unordered_multimap. template struct TreatAsMultiMapOrHash : public Traits::Bool {}; /// \brief \brief The TreatAsSet class allows treating custom classes as std::set or std::unordered_set. template struct TreatAsSet : public Traits::Bool {}; /// \brief \brief The TreatAsMultiSet class allows treating custom classes as std::multiset or std::unordered_multiset. template struct TreatAsMultiSet : public Traits::Bool {}; #define REFLECTIVE_RAPIDJSON_TREAT_AS_MAP_OR_HASH(T) \ template <> struct TreatAsMapOrHash : public Traits::Bool {} #define REFLECTIVE_RAPIDJSON_TREAT_AS_MULTI_MAP_OR_HASH(T) \ template <> struct TreatAsMultiMapOrHash : public Traits::Bool {} #define REFLECTIVE_RAPIDJSON_TREAT_AS_SET(T) \ template <> struct TreatAsSet : public Traits::Bool {} #define REFLECTIVE_RAPIDJSON_TREAT_AS_MULTI_SET(T) \ template <> struct TreatAsMultiSet : public Traits::Bool {} // define traits to check for arrays, sets and maps template using IsMapOrHash = Traits::Any, Traits::IsSpecializationOf, TreatAsMapOrHash>; template using IsMultiMapOrHash = Traits::Any, Traits::IsSpecializationOf, TreatAsMultiMapOrHash>; template using IsSet = Traits::Any, Traits::IsSpecializationOf, TreatAsSet>; template using IsMultiSet = Traits::Any, Traits::IsSpecializationOf, TreatAsMultiSet>; template using IsArrayOrSet = Traits::Any< Traits::All, Traits::Not>, Traits::Not>, Traits::Not>, Traits::Not>>, TreatAsSet, TreatAsMultiSet>; template using IsArray = Traits::All, Traits::Not>, Traits::Not>, Traits::Not>, Traits::Not>, Traits::Not>>; template using IsIteratableExceptString = Traits::All, Traits::Not>, Traits::Not>>; template using IsVariant = Traits::All>; } // namespace ReflectiveRapidJSON #endif // REFLECTIVE_RAPIDJSON_TRAITS