Anchor.h ArchiveSize.h InputArchive.h InputArchive.h OutputArchive.h OutputArchive.h terse::Anchor terse //CopyrightEpicGames,Inc.AllRightsReserved. #pragmaonce namespaceterse{ //Anchorisavirtual,utilitytypeonly(meaningitdoesnotwriteorreadanydatafromthestream) //Itonlycapturesthecurrentpositioninthestream(intoanin-memoryvariableonly),atthetime //whentheanchorisencounteredintheserializationprocess. //AnAnchorcanbeassociatedwithanArchiveSizetype,andArchiveSizewilluseitasthebaseoffset //fromwhichtocalculateitsownsize. template<typenameTOffset> structAnchor{ usingValueType=TOffset; usingOnMoveCallback=void(*)(Anchor*,void*); mutableValueTypevalue; OnMoveCallbackonMoveCallback; void*onMoveCallbackData; Anchor():value{},onMoveCallback{nullptr},onMoveCallbackData{nullptr}{ } ~Anchor()=default; Anchor(constAnchor&)=delete; Anchor&operator=(constAnchor&)=delete; Anchor(Anchor&&rhs):value{},onMoveCallback{nullptr},onMoveCallbackData{nullptr}{ std::swap(value,rhs.value); std::swap(onMoveCallback,rhs.onMoveCallback); std::swap(onMoveCallbackData,rhs.onMoveCallbackData); if(onMoveCallback){ onMoveCallback(this,onMoveCallbackData); } } Anchor&operator=(Anchor&&rhs){ std::swap(value,rhs.value); std::swap(onMoveCallback,rhs.onMoveCallback); std::swap(onMoveCallbackData,rhs.onMoveCallbackData); if(onMoveCallback){ onMoveCallback(this,onMoveCallbackData); } return*this; } voidonMove(OnMoveCallbackcallback,void*data){ onMoveCallback=callback; onMoveCallbackData=data; } }; }//namespaceterse