275 template <
typename T>
292 template <
typename T>
326 template <Common::StdCompat::formattable<
wchar_t> T>
332 template <Common::StdCompat::formattable<
wchar_t> T>
373 template <typename T>
375 const type_index& forTypeInfo = type_index{
typeid (T)})
376 requires (not same_as<T, void>);
399 template <
typename T>
401 template <
typename T>
411 template <
typename T>
413 template <
typename T>
419 nonvirtual type_index GetForType ()
const;
435 nonvirtual
String ToString ()
const;
438 [[deprecated (
"Since Stroika v3.0d7 - use overload with typeInfo third")]]
explicit TypeMappingDetails (
443 template <
typename T>
444 [[deprecated (
"Since Stroika v3.0d7 - use overload with typeInfo third")]]
TypeMappingDetails (
const type_index& forTypeInfo,
447 requires (not same_as<T, void>)
453 template <
typename T>
454 static FromGenericObjectMapperType mkGenericFromMapper_ (
const FromObjectMapperType<T>& fromObjectMapper);
455 template <
typename T>
456 static ToGenericObjectMapperType mkGenericToMapper_ (
const ToObjectMapperType<T>& toObjectMapper);
459 type_index fForType_;
460 FromGenericObjectMapperType fFromObjectMapper_;
461 ToGenericObjectMapperType fToObjectMapper_;
465 struct TypesRegistry;
471 nonvirtual TypesRegistry GetTypeMappingRegistry ()
const;
477 nonvirtual
void SetTypeMappingRegistry (
const TypesRegistry& s);
548 nonvirtual
void Add (
const TypeMappingDetails& s);
550 nonvirtual
void Add (
const TypesRegistry& s);
551 nonvirtual
void Add (
const ObjectVariantMapper& s);
552 template <
typename T>
553 nonvirtual
void Add (
const FromObjectMapperType<T>& fromObjectMapper,
const ToObjectMapperType<T>& toObjectMapper);
559 nonvirtual
void operator+= (
const TypeMappingDetails& rhs);
561 nonvirtual
void operator+= (
const TypesRegistry& rhs);
562 nonvirtual
void operator+= (
const ObjectVariantMapper& rhs);
584 template <
typename T,
typename... ARGS>
625 nonvirtual
void ResetToDefaultTypeRegistry ();
633 template <
typename CLASS>
634 struct ClassMapperOptions {
638 bool fOmitNullEntriesInFromObject{
true};
643 FromObjectMapperType<CLASS> fBeforeFrom;
648 ToObjectMapperType<CLASS> fBeforeTo;
658 ToObjectMapperType<CLASS> fAfterTo;
701 template <
typename CLASS>
748 template <
typename CLASS,
typename BASE_CLASS>
750 const ClassMapperOptions<CLASS>& mapperOptions = {});
757 template <
typename T>
772 template <IDefaultConstructForRead T>
774 template <
typename T>
775 nonvirtual
void ToObject (
const VariantValue& v, T* into)
const;
776 template <
typename T>
778 template <IDefaultConstructForRead T>
791 template <
typename T>
799 template <
typename T>
810 template <
typename T>
812 template <
typename T>
881 template <
typename T,
typename... ARGS>
900 template <
typename T>
902 const ClassMapperOptions<T>& options = {})
903 requires (is_class_v<T>);
906 template <
typename T>
908 const optional<TypeMappingDetails>& baseClass,
909 const optional<TypeMappingDetails>& furtherDerivedClass = nullopt)
910 requires (is_class_v<T>)
913 if (furtherDerivedClass and furtherDerivedClass->GetGenericFromObjectMapper ()) {
915 VariantValue vv = furtherDerivedClass->FromObjectMapper<T> () (mapper, objOfType);
916 *updateVariantValue = vv;
919 return MakeClassSerializer<T> (
921 ClassMapperOptions<T>{
922 .fBeforeFrom = baseClass and baseClass->GetGenericFromObjectMapper () ? baseClass->FromObjectMapper<T> () : nullptr,
923 .fBeforeTo = baseClass and baseClass->GetGenericToObjectMapper () ? baseClass->ToObjectMapper<T> () : nullptr,
924 .fAfterFrom = afterFrom,
925 .fAfterTo = furtherDerivedClass and furtherDerivedClass->GetGenericToObjectMapper () ? furtherDerivedClass->ToObjectMapper<T> () : nullptr},
930 template <
typename T>
931 static TypeMappingDetails MakeClassSerializer_ (
const Traversal::Iterable<StructFieldInfo>& fieldDescriptions,
932 const ClassMapperOptions<T>& options,
const ObjectVariantMapper* mapperToCheckAgainst)
933 requires (is_class_v<T>);
940 optional<String> fLowerBoundFieldName;
941 optional<String> fUpperBoundFieldName;
950 optional<TypeMappingDetails> fTMapper;
956 template <
typename ENUM_TYPE>
958 template <
typename ENUM_TYPE>
964 template <
typename ENUM_TYPE>
976 template <
typename ACTUAL_CONTAINTER_TYPE,
IDefaultConstructForRead KEY_TYPE =
typename ACTUAL_CONTAINTER_TYPE::key_type,
988 template <
typename ACTUAL_CONTAINTER_TYPE,
IDefaultConstructForRead KEY_TYPE =
typename ACTUAL_CONTAINTER_TYPE::key_type,
996 template <Containers::Adapters::IAddableTo ACTUAL_CONTAINER_TYPE>
1003 nonvirtual
String ToString ()
const;
1006 template <
typename T>
1007 nonvirtual
void AssertDependentTypesAlreadyInRegistry_ (T*);
1008 template <
typename DOMAIN_TYPE,
typename RANGE_TYPE>
1010 template <
typename T>
1012 template <
typename T,
typename TRAITS>
1014 template <
typename T,
typename KEY_TYPE,
typename TRAITS>
1016 template <
typename KEY_TYPE,
typename VALUE_TYPE>
1018 template <
typename T>
1019 nonvirtual
void AssertDependentTypesAlreadyInRegistry_ (optional<T>*);
1020 template <
typename T,
typename TRAITS>
1022 template <
typename T>
1023 nonvirtual
void AssertDependentTypesAlreadyInRegistry_ (
const Sequence<T>*);
1024 template <
typename T>
1025 nonvirtual
void AssertDependentTypesAlreadyInRegistry_ (
const Set<T>*);
1026 template <
typename T,
typename TRAITS>
1028 template <
typename T>
1029 nonvirtual
void AssertDependentTypesAlreadyInRegistry_ (
const vector<T>*);
1030 template <
typename T1,
typename T2>
1031 nonvirtual
void AssertDependentTypesAlreadyInRegistry_ (
const pair<T1, T2>*);
1032 template <
typename T>
1034 template <
typename T1,
typename T2>
1036 template <
typename T1>
1037 nonvirtual
void AssertDependentTypesAlreadyInRegistry_ (
const tuple<T1>*);
1038 template <
typename T1,
typename T2>
1039 nonvirtual
void AssertDependentTypesAlreadyInRegistry_ (
const tuple<T1, T2>*);
1040 template <
typename T1,
typename T2,
typename T3>
1041 nonvirtual
void AssertDependentTypesAlreadyInRegistry_ (
const tuple<T1, T2, T3>*);
1042 template <
typename T,
size_t SZ>
1043 nonvirtual
void AssertDependentTypesAlreadyInRegistry_ (
const T (*)[SZ]);
1046 template <
typename T>
1048 template <
typename DOMAIN_TYPE,
typename RANGE_TYPE>
1050 template <
typename T>
1052 template <
typename T,
typename TRAITS>
1054 template <
typename KEY_TYPE,
typename VALUE_TYPE>
1056 template <
typename T>
1058 template <
typename T>
1060 template <
typename T>
1062 template <
typename T,
typename KEY_TYPE,
typename TRAITS>
1064 template <
typename T,
typename TRAITS,
typename... ARGS>
1066 template <
typename T>
1068 template <
typename T>
1070 template <
typename T>
1072 template <
typename T,
typename KEY_TYPE,
typename TRAITS>
1074 template <
typename KEY_TYPE,
typename VALUE_TYPE>
1076 template <
typename T>
1078 template <
typename T>
1080 template <
typename T,
typename TRAITS>
1092 template <
typename T>
1094 template <
typename T1,
typename T2>
1096 template <
typename T>
1098 template <
typename T1,
typename T2>
1100 template <
typename T1>
1102 template <
typename T1,
typename T2>
1104 template <
typename T1,
typename T2,
typename T3>
1106 template <
typename T>
1108 requires (is_enum_v<T>);
1109 template <
typename T,
size_t SZ>
1113 template <
typename KEY_TYPE,
typename VALUE_TYPE,
typename ACTUAL_CONTAINER_TYPE>
1117 template <
typename RANGE_TYPE>
1121 template <
typename CLASS>
1122 static TypeMappingDetails MakeCommonSerializer_ForClassObject_ (
const type_index& forTypeInfo,
size_t sizeofObj,
1124 const ClassMapperOptions<CLASS>& options);
1125 template <
typename CLASS>
1126 static TypeMappingDetails MakeCommonSerializer_ForClassObject_and_check_ (
const type_index& forTypeInfo,
size_t sizeofObj,
1128 const ClassMapperOptions<CLASS>& options,
1132 nonvirtual TypeMappingDetails Lookup_ (
const type_index& forTypeInfo)
const;
1137 struct TypesRegistry {
1142 nonvirtual optional<TypeMappingDetails> Lookup (type_index t)
const;
1148 nonvirtual
void Add (
const TypeMappingDetails& typeMapDetails);
1158 nonvirtual
void operator+= (
const TypeMappingDetails& typeMapDetails);
1165 nonvirtual
String ToString ()
const;
1168 struct TypeMappingDetails_Extractor_ {
1169 auto operator() (
const TypeMappingDetails& t)
const -> type_index
1171 return t.GetForType ();
1175 KeyedCollection<TypeMappingDetails, type_index, TypeMappingDetails_Traits_> fSerializers_;
1179 TypesRegistry fTypeMappingRegistry_;
1204 [[deprecated (
"Since Stroika v3.0d8")]]
static constexpr NullFieldHandling eOmitNullFields = NullFieldHandling::eOmit;
1211 NullFieldHandling::eInclude;
1219 String fSerializedFieldName_;
1225 optional<StructFieldMetaInfo> fFieldMetaInfo_;
1231 optional<TypeMappingDetails> fOverrideTypeMapper_;
1254 [[deprecated (
"Since Stroika v3.0d8 - NullFieldHandling::eOmit is new default, use AddClass options arg "
1255 "ClassMapperOptions<T>{.fOmitNullEntriesInFromObject = false} for eInclude behevior")]]
StructFieldInfo (
const String& serializedFieldName,
1260 WeakAssert (fromObjectNullHandling == NullFieldHandling::eInclude);
1262 [[deprecated (
"Since Stroika v3.0d8 - NullFieldHandling::eOmit is new default, use AddClass options arg "
1263 "ClassMapperOptions<T>{.fOmitNullEntriesInFromObject = false} for eInclude behevior")]]
StructFieldInfo (
const String& serializedFieldName,
1265 const optional<TypeMappingDetails>& overrideTypeMapper,
1266 [[maybe_unused]] NullFieldHandling fromObjectNullHandling)
1267 :
StructFieldInfo{serializedFieldName, fieldMetaInfo, overrideTypeMapper}
1269 WeakAssert (fromObjectNullHandling == NullFieldHandling::eInclude);
1271 [[deprecated (
"Since Stroika v3.0d7 - dont use StructFieldInfo with missing filedMetaInfo - instead use type override of owning "
1272 "object)")]] StructFieldInfo (
const String& serializedFieldName, TypeMappingDetails overrideTypeMapper,
1273 [[maybe_unused]] NullFieldHandling fromObjectNullHandling = NullFieldHandling::eInclude)
1274 : fSerializedFieldName_{serializedFieldName}
1275 , fOverrideTypeMapper_{overrideTypeMapper}
1282 nonvirtual String GetSerializedFieldName ()
const;
1287 nonvirtual StructFieldMetaInfo GetStructFieldMetaInfo ()
const;
1292 nonvirtual optional<TypeMappingDetails> GetOverrideTypeMapper ()
const;
1295 friend class ObjectVariantMapper;