31 #if !defined(THEOLIZER_INTERNAL_CORE_H) 32 #define THEOLIZER_INTERNAL_CORE_H 34 #include "core_switcher.h" 46 #pragma warning(disable:4127 4251) 49 #ifndef THEOLIZER_INTERNAL_DOXYGEN 74 template<
typename tType,
class tEnable=
void>
75 class TheolizerNonKeepStepPrimary
79 TheolizerNonKeepStepPrimary(tType& iTarget) : mTarget(iTarget) { }
83 tType
const&
get()
const {
return mTarget; }
84 operator tType
const&()
const {
return get(); }
89 template<
typename tPo
interType>
90 class TheolizerNonKeepStepPrimary
95 std::is_pointer<tPointerType>::value
96 && std::is_class<typename std::remove_pointer<tPointerType>::type>::value
100 tPointerType& mPointer;
101 typedef typename std::remove_pointer<tPointerType>::type Type;
103 TheolizerNonKeepStepPrimary(tPointerType& iPointer) : mPointer(iPointer) { }
108 Type
const*
get()
const {
return mPointer; }
109 operator Type
const*()
const {
return get(); }
110 Type
const* operator->()
const {
return mPointer; }
120 template<
class tClassType,
class tEnable=
void>
121 struct TheolizerNonKeepStep :
public theolizer::internal::TheolizerNonKeepStepPrimary<tClassType>
123 static const bool kIsTheolizerNonKeepStep=
true;
124 typedef tClassType Type;
127 typedef theolizer::internal::TrackingMode TrackingMode;
128 typedef TheolizerNonKeepStep<Type> This;
132 template<
typename, std::size_t...>
friend struct theolizer::internal::ArrayManager;
133 Type& getData() {
return *mTarget; }
143 typedef theolizer::internal::TheolizerNonKeepStepPrimary<tClassType> Base;
146 explicit TheolizerNonKeepStep(Type& iTarget) :
153 explicit TheolizerNonKeepStep(This& iNext) :
154 Base(*iNext.mTarget),
156 mTarget(iNext.mTarget)
160 explicit TheolizerNonKeepStep(This&& iNext) :
161 Base(*iNext.mTarget),
163 mTarget(iNext.mTarget)
167 TheolizerNonKeepStep() :
175 template<
bool tIsRegister, TrackingMode tTrackingMode,
class tBaseSerializer>
176 void save(tBaseSerializer& iSerializer)
178 THEOLIZER_INTERNAL_VER_DEBUG((std::cout <<
"TheolizerNonKeepStep<tClassType>" << std::endl;));
179 theolizer::internal::Switcher<tBaseSerializer, Type, tIsRegister, tTrackingMode>::
180 save(iSerializer, *mTarget);
183 template<
bool tIsRegister, TrackingMode tTrackingMode,
class tBaseSerializer>
184 void load(tBaseSerializer& iSerializer)
186 theolizer::internal::Switcher<tBaseSerializer, Type, tIsRegister, tTrackingMode>::
187 load(iSerializer, *mTarget);
202 template<
typename tPrimitiveType,
class tThis,
class tEnable=
void>
203 class TheolizerNonKeepStepSpecial { };
207 template<
typename tArithmeticType,
class tThis>
208 class TheolizerNonKeepStepSpecial
212 theolizer::internal::EnableIf<std::is_arithmetic<tArithmeticType>::value>
215 typedef tArithmeticType Type;
219 TheolizerNonKeepStepSpecial(Type iData=0) : mData(iData) { }
220 Type& getData() {
return mData; }
222 virtual This& operator=(Type iRhs)=0;
223 virtual ~TheolizerNonKeepStepSpecial() { }
228 template<
typename tStringType,
class tThis>
229 struct TheolizerNonKeepStepSpecial
233 theolizer::internal::EnableIf<theolizer::internal::IsString<tStringType>::value>
234 > :
public tStringType
237 TheolizerNonKeepStepSpecial(tStringType
const& iString=tStringType()) : tStringType(iString){}
238 TheolizerNonKeepStepSpecial(tStringType&& iString) : tStringType(std::move(iString)) { }
239 tStringType& getData() {
return *
this; }
244 using tStringType::begin;
245 using tStringType::end;
246 using tStringType::rbegin;
247 using tStringType::rend;
250 using tStringType::resize;
251 using tStringType::clear;
254 using tStringType::operator[];
255 using tStringType::at;
258 using tStringType::operator+=;
259 using tStringType::append;
260 using tStringType::push_back;
261 using tStringType::assign;
262 using tStringType::insert;
263 using tStringType::erase;
264 using tStringType::replace;
265 using tStringType::swap;
266 using tStringType::pop_back;
276 template<
typename tPrimitiveType>
277 struct THEOLIZER_INTERNAL_DLL TheolizerNonKeepStep
280 theolizer::internal::EnableIf<theolizer::internal::IsPrimitive<tPrimitiveType>::value>
281 > :
public theolizer::internal::TheolizerNonKeepStepSpecial
284 TheolizerNonKeepStep<tPrimitiveType>
287 static const bool kIsTheolizerNonKeepStep=
true;
288 typedef tPrimitiveType Type;
291 typedef TheolizerNonKeepStep<Type> This;
292 typedef theolizer::internal::TheolizerNonKeepStepSpecial<tPrimitiveType, This> Base;
293 typedef theolizer::internal::TrackingMode TrackingMode;
298 template<
typename, std::size_t...>
friend struct theolizer::internal::ArrayManager;
299 Type& getData() {
return mValue; }
315 unsigned mUpVersionCount;
319 explicit TheolizerNonKeepStep(Type& iTarget);
322 explicit TheolizerNonKeepStep(This& iNext);
325 explicit TheolizerNonKeepStep(This&& iNext);
328 TheolizerNonKeepStep();
331 This& operator=(Type iRhs);
334 void set(Type iValue,
bool iDoSucceed);
338 void succeed(Type iValue,
bool iDoSucceed);
342 ~TheolizerNonKeepStep();
346 Type
get()
const {
return mValue; }
347 operator Type()
const {
return get(); }
348 bool getDoSucceed()
const {
return mDoSucceed; }
352 Type
get() {
return Type(); }
353 operator Type() {
return get(); }
359 template<
bool tIsRegister, TrackingMode tTrackingMode,
class tBaseSerializer>
360 void save(tBaseSerializer& iSerializer)
362 THEOLIZER_INTERNAL_VER_DEBUG((
363 std::cout <<
"TheolizerNonKeepStep<tPrimitiveType>::save(" << mValue <<
") " 364 << (
void*)mTarget << std::endl;
366 if (tTrackingMode == TrackingMode::etmDefault)
368 iSerializer.savePrimitive(mValue);
373 BaseSerializer::AutoRestoreSave aAutoRestoreSave
376 theolizer::internal::emOrder,
380 theolizer::internal::SerializeInfo& aSerializeInfo=
381 iSerializer.registerObject
390 theolizer::internal::SerializeInfo& aSerializeInfo=
391 iSerializer.registerObject
400 std::size_t aTypeIndex = theolizer::internal::kInvalidSize;
401 if (iSerializer.mCheckMode == theolizer::CheckMode::TypeCheckInData)
403 aTypeIndex = theolizer::internal::getTypeIndex<tPrimitiveType>();
407 BaseSerializer::AutoRestoreSaveStructure aAutoRestoreSaveStructure
410 theolizer::internal::emOrder,
411 theolizer::internal::Structure::Pointee,
413 aSerializeInfo.mObjectId,
418 iSerializer.writePreElement();
419 iSerializer.saveControl(aSerializeInfo.mObjectId);
423 iSerializer.writePreElement();
424 iSerializer.savePrimitive(mValue);
430 template<
bool tIsRegister, TrackingMode tTrackingMode,
class tBaseSerializer>
431 void load(tBaseSerializer& iSerializer)
434 if (tTrackingMode == TrackingMode::etmDefault)
436 iSerializer.loadPrimitive(mValue);
441 BaseSerializer::AutoRestoreLoad aAutoRestoreLoad(iSerializer);
445 std::size_t aTypeIndex = theolizer::internal::kInvalidSize;
446 if (iSerializer.mCheckMode == theolizer::CheckMode::TypeCheckInData)
448 aTypeIndex = theolizer::internal::getTypeIndex<tPrimitiveType>();
452 size_t aObjectId= theolizer::internal::kInvalidSize;
453 BaseSerializer::AutoRestoreLoadStructure aAutoRestoreLoadStructure
456 theolizer::internal::emOrder,
457 theolizer::internal::Structure::Pointee,
462 iSerializer.readPreElement();
463 iSerializer.loadControl(aObjectId);
465 iSerializer.recoverObject
468 reinterpret_cast<void*&>(mTarget),
476 iSerializer.readPreElement();
477 iSerializer.loadPrimitive(mValue);
480 THEOLIZER_INTERNAL_VER_DEBUG((
481 std::cout <<
"TheolizerNonKeepStep<tPrimitiveType>::load(" << mValue <<
") " 482 << (
void*)mTarget << std::endl;
487 #endif // THEOLIZER_INTERNAL_DOXYGEN 493 #ifndef THEOLIZER_INTERNAL_DOXYGEN 499 #define THEOLIZER_INTERNAL_NON_KEEP_STEP(dType) \ 500 TheolizerNonKeepStep<typename std::remove_reference<THEOLIZER_INTERNAL_UNPAREN dType>::type> 513 virtual void writeMetaData
515 BaseSerializer& iSerializer,
516 VersionNoList
const* iVersionNoList=
nullptr 520 virtual char const* getName()
const {
return "";}
521 virtual std::size_t getTypeIndex()
const {
return 0;}
522 virtual bool isBaseClass()
const {
return false;}
523 virtual Destinations
const& getDestinations()
const = 0;
530 template<
class tVersionType>
531 class Element :
public ElementBase
534 typedef typename tVersionType::Serializer Serializer;
540 virtual size_t getTypeIndex()
const =0;
541 virtual void saveElement(Serializer& iSerializer, tVersionType& iInstance)
const=0;
542 virtual void loadElement(Serializer& iSerializer, tVersionType& iInstance)
const=0;
543 virtual ~HolderBase() { }
548 template<
typename tTypeFunc,
typename tSaveFunc,
typename tLoadFunc>
549 struct Holder :
public HolderBase
555 Holder(tTypeFunc iTypeFunc, tSaveFunc iSaveFunc, tLoadFunc iLoadFunc) :
556 mTypeFunc(iTypeFunc),
557 mSaveFunc(iSaveFunc),
563 virtual size_t getTypeIndex()
const 568 virtual void saveElement(Serializer& iSerializer,
569 tVersionType& iInstance)
const 571 mSaveFunc(iSerializer, iInstance);
573 virtual void loadElement(Serializer& iSerializer,
574 tVersionType& iInstance)
const 576 mLoadFunc(iSerializer, iInstance);
582 char const*
const mName;
583 bool const mIsBaseClass;
584 Destinations mDestinations;
585 std::unique_ptr<HolderBase> mHolder;
586 char const*
const mNextName;
587 TrackingMode mTrackingMode;
603 template<
typename tTypeFunc,
typename tSaveFunc,
typename tLoadFunc>
606 char const*
const iName,
608 std::initializer_list<Destination>
const& iDestinationList,
612 char const*
const iNextName,
613 TrackingMode iTrackingMode,
616 mIsBaseClass(iIsBaseClass),
617 mDestinations(iDestinationList),
620 new Holder<tTypeFunc, tSaveFunc, tLoadFunc>
627 mNextName(iNextName),
628 mTrackingMode(iTrackingMode),
629 mVersionNo(iVersionNo)
633 Element(Element&& iRhs) noexcept :
635 mIsBaseClass (iRhs.mIsBaseClass),
636 mDestinations(std::move(iRhs.mDestinations)),
637 mHolder (std::move(iRhs.mHolder)),
638 mNextName (iRhs.mNextName),
639 mTrackingMode(iRhs.mTrackingMode),
640 mVersionNo (iRhs.mVersionNo)
645 const bool isSentinel()
const {
return mName ==
nullptr;}
647 char const* getName()
const {
return mName;}
648 Destinations
const& getDestinations()
const 650 return mDestinations;
652 bool isBaseClass()
const {
return mIsBaseClass;}
653 size_t getTypeIndex()
const 655 return mHolder->getTypeIndex();
657 void saveElement(Serializer& iSerializer, tVersionType& iInstance)
const 659 mHolder->saveElement(iSerializer, iInstance);
661 void loadElement(Serializer& iSerializer, tVersionType& iInstance)
const 663 mHolder->loadElement(iSerializer, iInstance);
670 BaseSerializer& iSerializer,
671 VersionNoList
const* iVersionNoList
675 iSerializer.writePreElement();
676 BaseSerializer::AutoRestoreSave aAutoRestoreSave(iSerializer, emOrder,
true);
679 auto aTypeIndex=getTypeIndex();
680 auto aTypeInfo=TypeInfoList::getInstance().getList()[aTypeIndex];
683 iSerializer.writePreElement();
684 iSerializer.saveControl(mName);
687 iSerializer.writePreElement();
688 iSerializer.saveControl(mNextName);
691 iSerializer.writePreElement();
692 iSerializer.saveControl(aTypeInfo->getTypeKind());
695 iSerializer.writePreElement();
696 iSerializer.saveControl(aTypeInfo->getTypeName(*iVersionNoList));
699 iSerializer.writePreElement();
700 iSerializer.saveControl(mVersionNo);
703 iSerializer.writePreElement();
704 iSerializer.saveControl(mTrackingMode);
720 #define THEOLIZER_INTERNAL_REGISTER_BASE(dSpec, dTrack, dId, dType, dVerNo, dName, dVer)\ 728 typedef THEOLIZER_INTERNAL_UNPAREN dType Type; \ 729 theolizer::internal:: \ 730 RegisterType<tBaseSerializer, Type, ::tTheolizerVersion, true>::getInstance();\ 731 return theolizer::internal::getTypeIndex<Type>(); \ 734 [](tBaseSerializer& iSerializer, TheolizerVersion& iInstance) \ 736 typedef THEOLIZER_INTERNAL_UNPAREN dVer VerType; \ 737 THEOLIZER_INTERNAL_SAVE(iSerializer, \ 738 static_cast<VerType&>(iInstance), dTrack); \ 741 [](tBaseSerializer& iSerializer, TheolizerVersion& iInstance) \ 743 typedef THEOLIZER_INTERNAL_UNPAREN dVer VerType; \ 744 THEOLIZER_INTERNAL_LOAD(iSerializer, \ 745 static_cast<VerType&>(iInstance), dTrack); \ 750 theolizer::internal::etmDefault, \ 759 #define THEOLIZER_INTERNAL_REGISTER_MBASE(dSpec, dTrack, dType, dVerNo, dName, dVer)\ 767 typedef THEOLIZER_INTERNAL_UNPAREN dType Type; \ 768 theolizer::internal:: \ 769 RegisterType<tBaseSerializer, Type, ::tTheolizerVersion, true>::getInstance();\ 770 return theolizer::internal::getTypeIndex<Type>(); \ 772 [](tBaseSerializer& iSerializer, TheolizerVersion& iInstance){}, \ 773 [](tBaseSerializer& iSerializer, TheolizerVersion& iInstance){}, \ 775 theolizer::internal::etmDefault, \ 781 #define THEOLIZER_INTERNAL_REGISTER_ELEMENT(dName,dNextName,dTrack,dDest,dType,dVerNo,dVer)\ 783 THEOLIZER_INTERNAL_STRINGIZE(THEOLIZER_INTERNAL_UNPAREN dName),\ 785 {THEOLIZER_INTERNAL_UNPAREN dDest}, \ 789 using Type=THEOLIZER_INTERNAL_UNPAREN dType; \ 790 return theolizer::internal::getTypeIndex<Type>(); \ 793 [](tBaseSerializer& iSerializer, TheolizerVersion& iInstance) \ 795 THEOLIZER_INTERNAL_SAVE(iSerializer, \ 796 iInstance.THEOLIZER_INTERNAL_UNPAREN dName, dTrack); \ 799 [](tBaseSerializer& iSerializer, TheolizerVersion& iInstance) \ 801 THEOLIZER_INTERNAL_LOAD(iSerializer, \ 802 iInstance.THEOLIZER_INTERNAL_UNPAREN dName, dTrack); \ 807 theolizer::internal::dTrack, \ 814 #define THEOLIZER_INTERNAL_REGISTER_SENTINEL(dVersion) \ 819 [](){return size_t(0);}, \ 820 [](tBaseSerializer& iSerializer, dVersion& iInstance){}, \ 821 [](tBaseSerializer& iSerializer, dVersion& iInstance){}, \ 823 theolizer::internal::etmDefault, \ 842 template<
typename tBaseType>
843 struct EnumElement :
public ElementBase
845 std::vector<char const*> mSymbols;
846 std::vector<tBaseType> mValues;
847 tBaseType mPrevValue;
850 std::initializer_list<char const*> iSymbols,
851 std::initializer_list<tBaseType> iValues,
852 tBaseType iPrevValue) :
855 mPrevValue(iPrevValue)
858 const bool isSentinel()
const {
return *mSymbols[0] == 0;}
863 BaseSerializer& iSerializer,
869 iSerializer.writePreElement();
870 BaseSerializer::AutoRestoreSave aAutoRestoreSave(iSerializer,emOrder,
true);
871 for (
auto symbol : mSymbols)
873 iSerializer.writePreElement();
874 std::string aSymbol(symbol);
875 iSerializer.saveControl(aSymbol);
880 iSerializer.writePreElement();
881 BaseSerializer::AutoRestoreSave aAutoRestoreSave(iSerializer,emOrder,
true);
882 for (
auto value : mValues)
884 iSerializer.writePreElement();
885 iSerializer.saveControl(value);
890 iSerializer.writePreElement();
891 iSerializer.saveControl(mPrevValue);
896 Destinations mDestinations;
897 Destinations
const& getDestinations()
const {
return mDestinations;}
914 #define THEOLIZER_INTERNAL_VERTYPE_I(dClass, dVersionNo) \ 915 THEOLIZER_INTERNAL_UNPAREN dClass::TheolizerVersion<tBaseSerializer, dVersionNo> 918 #define THEOLIZER_INTERNAL_VERTYPE_N(dType, dVersionNo) \ 919 TheolizerNonIntrusive<THEOLIZER_INTERNAL_UNPAREN dType>:: \ 920 TheolizerVersion<tBaseSerializer, dVersionNo> 931 #define THEOLIZER_INTERNAL_UNREFERENCE(dType) \ 932 typename std::remove_reference<THEOLIZER_INTERNAL_UNPAREN dType>::type 941 #define THEOLIZER_INTERNAL_BASE_N(dSpec, dTrack, dId, dType, dName) \ 942 THEOLIZER_INTERNAL_VERSION_B(dSpec, dTrack, dId, dType, 0, dName, \ 943 (TheolizerBase<THEOLIZER_INTERNAL_UNPAREN dType>), \ 944 TS:_THEOLIZER_INTERNAL_BASE_N(dSpec,dTrack,dId,dType,dName)) 947 #define THEOLIZER_INTERNAL_BASE_N_DEL(dSpec, dTrack, dId, dType, dName) \ 948 THEOLIZER_INTERNAL_VERSION_B_DEL(dSpec, dTrack, dId, dType, 0, dName, \ 949 (TheolizerBase<THEOLIZER_INTERNAL_UNPAREN dType>), \ 950 TS:_THEOLIZER_INTERNAL_BASE_N(dSpec,dTrack,dId,dType,dName)) 956 #define THEOLIZER_INTERNAL_BASE_KI(dSpec, dTrack, dId, dType, dVerNo, dName)\ 957 THEOLIZER_INTERNAL_VERSION_B(dSpec, dTrack, dId, dType, dVerNo, dName, \ 958 (THEOLIZER_INTERNAL_VERTYPE_I(dType, dVerNo)), \ 959 TS:_THEOLIZER_INTERNAL_BASE_KI(dSpec,dTrack,dId,dType,dVerNo,dName)) 962 #define THEOLIZER_INTERNAL_BASE_KI_DEL(dSpec, dTrack, dId, dType, dVerNo, dName)\ 963 THEOLIZER_INTERNAL_VERSION_B_DEL(dSpec, dTrack, dId, dType, dVerNo, dName,\ 964 (THEOLIZER_INTERNAL_VERTYPE_I(dType, dVerNo)), \ 965 TS:_THEOLIZER_INTERNAL_BASE_KI(dSpec,dTrack,dId,dType,dVerNo,dName)) 971 #define THEOLIZER_INTERNAL_BASE_KN(dSpec, dTrack, dId, dType, dVerNo, dName)\ 972 THEOLIZER_INTERNAL_VERSION_B(dSpec, dTrack, dId, dType, dVerNo, dName, \ 973 (THEOLIZER_INTERNAL_VERTYPE_N(dType, dVerNo)), \ 974 TS:_THEOLIZER_INTERNAL_BASE_KN(dSpec,dTrack,dId,dType,dVerNo,dName)) 977 #define THEOLIZER_INTERNAL_BASE_KN_DEL(dSpec, dTrack, dId, dType, dVerNo, dName)\ 978 THEOLIZER_INTERNAL_VERSION_B_DEL(dSpec, dTrack, dId, dType, dVerNo, dName,\ 979 (THEOLIZER_INTERNAL_VERTYPE_N(dType, dVerNo)), \ 980 TS:_THEOLIZER_INTERNAL_BASE_KN(dSpec,dTrack,dId,dType,dVerNo,dName)) 986 #define THEOLIZER_INTERNAL_ELEMENT_N(dName, dNextName, dTrack, dDest, dType)\ 987 THEOLIZER_INTERNAL_VERSION_EN(dName, dNextName, dTrack, dDest, dType, \ 988 (THEOLIZER_INTERNAL_NON_KEEP_STEP(dType)), \ 989 TS:_THEOLIZER_INTERNAL_ELEMENT_N(dName,dNextName,dTrack,\\dDest,\\dType)) 992 #define THEOLIZER_INTERNAL_ELEMENT_N_DEL(dName, dNextName, dTrack, dDest, dType)\ 993 THEOLIZER_INTERNAL_VERSION_EN_DEL(dName, dNextName, dTrack, dDest, dType,\ 994 (THEOLIZER_INTERNAL_NON_KEEP_STEP(dType)), \ 995 TS:_THEOLIZER_INTERNAL_ELEMENT_N(dName,dNextName,dTrack,\\dDest,\\dType)) 999 #define THEOLIZER_INTERNAL_NONE(dDef) 1000 #define THEOLIZER_INTERNAL_DEF(dDef) THEOLIZER_INTERNAL_UNPAREN dDef 1006 #define THEOLIZER_INTERNAL_ELEMENT_KI(dName, dNextName, dTrack, dDest, dType, dVerNo)\ 1007 THEOLIZER_INTERNAL_VERSION_EV(dName, dNextName, dTrack, dDest, dType, dVerNo,\ 1008 (THEOLIZER_INTERNAL_VERTYPE_I(dType, dVerNo)), \ 1009 TS:_THEOLIZER_INTERNAL_ELEMENT_KI(dName,dNextName,dTrack,\\dDest,\\dType,dVerNo), NONE) 1012 #define THEOLIZER_INTERNAL_ELEMENT_KI_DEL(dName, dNextName, dTrack, dDest, dType, dVerNo)\ 1013 THEOLIZER_INTERNAL_VERSION_EV_DEL(dName, dNextName, dTrack, dDest, dType, dVerNo,\ 1014 (THEOLIZER_INTERNAL_VERTYPE_I(dType, dVerNo)), \ 1015 TS:_THEOLIZER_INTERNAL_ELEMENT_KI(dName,dNextName,dTrack,\\dDest,\\dType,dVerNo)) 1021 #define THEOLIZER_INTERNAL_ELEMENT_KN(dName, dNextName, dTrack, dDest, dType, dVerNo)\ 1022 THEOLIZER_INTERNAL_VERSION_EV(dName, dNextName, dTrack, dDest, dType, dVerNo,\ 1023 (THEOLIZER_INTERNAL_VERTYPE_N(dType, dVerNo)), \ 1024 TS:_THEOLIZER_INTERNAL_ELEMENT_KN(dName,dNextName,dTrack,\\dDest,\\dType,dVerNo), DEF) 1027 #define THEOLIZER_INTERNAL_ELEMENT_KN_DEL(dName, dNextName, dTrack, dDest, dType, dVerNo)\ 1028 THEOLIZER_INTERNAL_VERSION_EV_DEL(dName, dNextName, dTrack, dDest, dType, dVerNo,\ 1029 (THEOLIZER_INTERNAL_VERTYPE_N(dType, dVerNo)), \ 1030 TS:_THEOLIZER_INTERNAL_ELEMENT_KN(dName,dNextName,dTrack,\\dDest,\\dType,dVerNo)) 1037 #define THEOLIZER_INTERNAL_ELEMENT_AN(dName, dNextName, dTrack, dDest, dType, ...) \ 1038 THEOLIZER_INTERNAL_VERSION_EV(dName, dNextName, dTrack, dDest, \ 1039 (theolizer::internal::Array<THEOLIZER_INTERNAL_UNPAREN dType, __VA_ARGS__>), 0,\ 1040 (typename theolizer::internal::ArrayManager< \ 1041 THEOLIZER_INTERNAL_NON_KEEP_STEP(dType), __VA_ARGS__>::template \ 1042 TheolizerVersion<tBaseSerializer, THEOLIZER_GENERATED_VERSION_NO>),\ 1043 TS:_THEOLIZER_INTERNAL_ELEMENT_AN(dName,dNextName,dTrack,\\dDest,\\dType,__VA_ARGS__),\ 1047 #define THEOLIZER_INTERNAL_ELEMENT_AN_DEL(dName, dNextName, dTrack, dDest, dType, ...)\ 1048 THEOLIZER_INTERNAL_VERSION_EV_DEL(dName, dNextName, dTrack, dDest, \ 1049 (theolizer::internal::Array<THEOLIZER_INTERNAL_UNPAREN dType, __VA_ARGS__>), 0,\ 1050 (typename theolizer::internal::ArrayManager< \ 1051 THEOLIZER_INTERNAL_NON_KEEP_STEP(dType), __VA_ARGS__>::template \ 1052 TheolizerVersion<tBaseSerializer, THEOLIZER_GENERATED_VERSION_NO>),\ 1053 TS:_THEOLIZER_INTERNAL_ELEMENT_AN(dName,dNextName,dTrack,\\dDest,\\dType,__VA_ARGS__)) 1059 #define THEOLIZER_INTERNAL_ELEMENT_AKI(dName, dNextName, dTrack, dDest, dType, dVerNo, ...)\ 1060 THEOLIZER_INTERNAL_VERSION_EV(dName, dNextName, dTrack, dDest, \ 1061 (theolizer::internal::Array<THEOLIZER_INTERNAL_UNPAREN dType, __VA_ARGS__>), dVerNo,\ 1062 (typename theolizer::internal::ArrayManager< \ 1063 THEOLIZER_INTERNAL_VERTYPE_I(dType, dVerNo), __VA_ARGS__>::template\ 1064 TheolizerVersion<tBaseSerializer, THEOLIZER_GENERATED_VERSION_NO>),\ 1065 TS:_THEOLIZER_INTERNAL_ELEMENT_AKI(dName,dNextName,dTrack,\\dDest,\\dType,dVerNo,__VA_ARGS__), NONE) 1068 #define THEOLIZER_INTERNAL_ELEMENT_AKI_DEL(dName, dNextName, dTrack, dDest, dType, dVerNo, ...)\ 1069 THEOLIZER_INTERNAL_VERSION_EV_DEL(dName, dNextName, dTrack, dDest, \ 1070 (theolizer::internal::Array<THEOLIZER_INTERNAL_UNPAREN dType, __VA_ARGS__>), dVerNo,\ 1071 (typename theolizer::internal::ArrayManager< \ 1072 THEOLIZER_INTERNAL_VERTYPE_I(dType, dVerNo), __VA_ARGS__>::template\ 1073 TheolizerVersion<tBaseSerializer, THEOLIZER_GENERATED_VERSION_NO>),\ 1074 TS:_THEOLIZER_INTERNAL_ELEMENT_AKI(dName,dNextName,dTrack,\\dDest,\\dType,dVerNo,__VA_ARGS__)) 1080 #define THEOLIZER_INTERNAL_ELEMENT_AKN(dName, dNextName, dTrack, dDest, dType, dVerNo, ...)\ 1081 THEOLIZER_INTERNAL_VERSION_EV(dName, dNextName, dTrack, dDest, \ 1082 (theolizer::internal::Array<THEOLIZER_INTERNAL_UNPAREN dType, __VA_ARGS__>), dVerNo,\ 1083 (typename theolizer::internal::ArrayManager< \ 1084 THEOLIZER_INTERNAL_VERTYPE_N(dType, dVerNo), __VA_ARGS__>::template\ 1085 TheolizerVersion<tBaseSerializer, THEOLIZER_GENERATED_VERSION_NO>),\ 1086 TS:_THEOLIZER_INTERNAL_ELEMENT_AKN(dName,dNextName,dTrack,\\dDest,\\dType,dVerNo,__VA_ARGS__), DEF) 1089 #define THEOLIZER_INTERNAL_ELEMENT_AKN_DEL(dName, dNextName, dTrack, dDest, dType, dVerNo, ...)\ 1090 THEOLIZER_INTERNAL_VERSION_EV_DEL(dName, dNextName, dTrack, dDest, \ 1091 (theolizer::internal::Array<THEOLIZER_INTERNAL_UNPAREN dType, __VA_ARGS__>), dVerNo,\ 1092 (typename theolizer::internal::ArrayManager< \ 1093 THEOLIZER_INTERNAL_VERTYPE_N(dType, dVerNo), __VA_ARGS__>::template\ 1094 TheolizerVersion<tBaseSerializer, THEOLIZER_GENERATED_VERSION_NO>),\ 1095 TS:_THEOLIZER_INTERNAL_ELEMENT_AKN(dName,dNextName,dTrack,\\dDest,\\dType,dVerNo,__VA_ARGS__)) 1099 #define THEOLIZER_INTERNAL_MAKE_CLASS_TYPE(dType) \ 1100 theolizer::internal::ClassTypeInfo \ 1102 typename std::conditional \ 1104 theolizer::internal::IsNonIntrusive<THEOLIZER_INTERNAL_UNPAREN dType>::value,\ 1105 TheolizerNonIntrusive<THEOLIZER_INTERNAL_UNPAREN dType>, \ 1106 THEOLIZER_INTERNAL_UNPAREN dType \ 1118 template<
class tClass>
1119 class RegisterToBaseClass
1121 RegisterToBaseClass()
1123 theolizer::internal::RegisterType
1127 ::tTheolizerVersion,
1141 template<
class tClassType>
1142 bool ClassTypeInfo<tClassType>::saveTypeInstance
1144 BaseSerializer& iSerializer,
1145 tClassType*& iPointer,
1146 std::type_index iStdTypeIndex
1149 unsigned aVersionNo=iSerializer.mVersionNoList.at(BaseTypeInfo::mTypeIndex);
1151 if (getTargetStdTypeIndex() == iStdTypeIndex)
1154 && (iSerializer.mCheckMode != CheckMode::InMemory))
1157 std::string aTypeName=getTypeName(iSerializer.mVersionNoList);
1158 iSerializer.saveControl(aTypeName);
1163 iSerializer.saveControl(BaseTypeInfo::mTypeIndex);
1166 iSerializer.writePreElement();
1168 tClassType::Theolizer::saveClass
1177 for (
auto&& aDrivedClass : mDrivedClassList)
1179 if (aDrivedClass->saveTypeInstance(iSerializer, iPointer, iStdTypeIndex))
1192 THEOLIZER_INTERNAL_OVERLOAD((!std::is_constructible<tClassType>::value))
1194 tClassType* createClass(tClassType
const*)
1202 THEOLIZER_INTERNAL_OVERLOAD((std::is_constructible<tClassType>::value))
1204 tClassType* createClass(tClassType
const*)
1206 return new tClassType();
1212 THEOLIZER_INTERNAL_OVERLOAD((!std::is_constructible<tClassType>::value))
1214 tClassType* createClass2()
1222 THEOLIZER_INTERNAL_OVERLOAD((std::is_constructible<tClassType>::value))
1224 tClassType* createClass2()
1226 return new tClassType();
1233 template<
class tClassType>
1234 bool ClassTypeInfo<tClassType>::loadTypeInstance
1236 BaseSerializer& iSerializer,
1237 tClassType*& iPointer,
1238 TypeIndexList& iTypeIndexList
1241 typedef typename tClassType::TheolizerTarget TheolizerTarget;
1243 std::size_t aFoundTypeIndex=0;
1245 bool aDoRelease=
true;
1246 for (
auto aTypeIndex : iTypeIndexList)
1248 if (aTypeIndex != BaseTypeInfo::mTypeIndex)
1254 aFoundTypeIndex=aTypeIndex;
1258 if ((iPointer !=
nullptr)
1259 && (std::type_index(
typeid(*iPointer))
1260 == TypeInfoList::getInstance().getList()[aTypeIndex]->getStdTypeIndex(
true)))
1270 if (iSerializer.mRefProcessing)
1274 THEOLIZER_INTERNAL_WRONG_USING(
1275 "Type of this instance(%1%) is different from saved.",
1276 getNameByTypeInfo(
typeid(*iPointer)));
1286 if (!iSerializer.mIsShared)
1294 if (tClassType::Theolizer::kIsAuto)
1298 iPointer=
reinterpret_cast<tClassType*
>(createClass2<TheolizerTarget>());
1304 if (!iSerializer.readPreElement())
1306 THEOLIZER_INTERNAL_DATA_ERROR(u8
"Format Error.");
1311 AutoRestoreIsShared aAutoRestoreIsShared(iSerializer,
false);
1314 tClassType::Theolizer::loadClass
1318 iSerializer.mVersionNoList.at(aFoundTypeIndex)
1324 for (
auto&& aDrivedClass : mDrivedClassList)
1326 if (aDrivedClass->loadTypeInstance(iSerializer, iPointer, iTypeIndexList))
1338 template<
class tClassType>
1339 void const* ClassTypeInfo<tClassType>::getDerivedPointer
1341 typename tClassType::TheolizerTarget* iBasePointer
1344 if (getTargetStdTypeIndex() == std::type_index(
typeid(*iBasePointer)))
1345 return iBasePointer;
1347 for (
auto&& aDrivedClass : mDrivedClassList)
1349 void const* ret=aDrivedClass->getDerivedPointer(iBasePointer);
1361 #endif // THEOLIZER_INTERNAL_DOXYGEN 1370 #pragma warning(pop) 1373 #endif // THEOLIZER_INTERNAL_CORE_H