//========= Copyright Valve Corporation, All rights reserved. ============// // // Purpose: // //=============================================================================// #ifndef SAVERESTORE_UTLRBTREE_H #define SAVERESTORE_UTLRBTREE_H #include "isaverestore.h" #include "saverestore_utlclass.h" #include "utlrbtree.h" #if defined(_WIN32) #pragma once #endif //------------------------------------- template class CUtlRBTreeDataOps : public CDefSaveRestoreOps { public: CUtlRBTreeDataOps() { UTLCLASS_SAVERESTORE_VALIDATE_TYPE(FIELD_TYPE); } virtual void Save(const SaveRestoreFieldInfo_t &fieldInfo, ISave *pSave) { datamap_t *pTreeTypeDatamap = CTypedescDeducer::Deduce((UTLRBTREE *)NULL); typedescription_t dataDesc = { (fieldtype_t)FIELD_TYPE, "elem", {0, 0}, 1, FTYPEDESC_SAVE, NULL, NULL, NULL, pTreeTypeDatamap, -1, }; datamap_t dataMap = {&dataDesc, 1, "urb", NULL, false, false, 0, #ifdef _DEBUG true #endif }; UTLRBTREE *pUtlRBTree = (UTLRBTREE *)fieldInfo.pField; pSave->StartBlock(); int nElems = pUtlRBTree->Count(); pSave->WriteInt(&nElems, 1); typename UTLRBTREE::IndexType_t i = pUtlRBTree->FirstInorder(); while (i != pUtlRBTree->InvalidIndex()) { typename UTLRBTREE::ElemType_t &elem = pUtlRBTree->Element(i); pSave->WriteAll(&elem, &dataMap); i = pUtlRBTree->NextInorder(i); } pSave->EndBlock(); } virtual void Restore(const SaveRestoreFieldInfo_t &fieldInfo, IRestore *pRestore) { datamap_t *pTreeTypeDatamap = CTypedescDeducer::Deduce((UTLRBTREE *)NULL); typedescription_t dataDesc = { (fieldtype_t)FIELD_TYPE, "elems", {0, 0}, 1, FTYPEDESC_SAVE, NULL, NULL, NULL, pTreeTypeDatamap, -1, }; datamap_t dataMap = {&dataDesc, 1, "uv", NULL, false, false, 0, #ifdef _DEBUG true #endif }; UTLRBTREE *pUtlRBTree = (UTLRBTREE *)fieldInfo.pField; pRestore->StartBlock(); int nElems = pRestore->ReadInt(); typename UTLRBTREE::ElemType_t temp; while (nElems--) { pRestore->ReadAll(&temp, &dataMap); pUtlRBTree->Insert(temp); } pRestore->EndBlock(); } virtual void MakeEmpty(const SaveRestoreFieldInfo_t &fieldInfo) { UTLRBTREE *pUtlRBTree = (UTLRBTREE *)fieldInfo.pField; pUtlRBTree->RemoveAll(); } virtual bool IsEmpty(const SaveRestoreFieldInfo_t &fieldInfo) { UTLRBTREE *pUtlRBTree = (UTLRBTREE *)fieldInfo.pField; return (pUtlRBTree->Count() == 0); } }; //------------------------------------- template class CUtlRBTreeDataopsInstantiator { public: template static ISaveRestoreOps *GetDataOps(UTLRBTREE *) { static CUtlRBTreeDataOps ops; return &ops; } }; //------------------------------------- #define SaveUtlRBTree(pSave, pUtlRBTree, fieldtype) \ CUtlRBTreeDataopsInstantiator::GetDataOps(pUtlRBTree) \ ->Save(pUtlRBTree, pSave); #define RestoreUtlRBTree(pRestore, pUtlRBTree, fieldtype) \ CUtlRBTreeDataopsInstantiator::GetDataOps(pUtlRBTree) \ ->Restore(pUtlRBTree, pRestore); //------------------------------------- #define DEFINE_UTLRBTREE(name, fieldtype) \ { \ FIELD_CUSTOM, #name, {offsetof(classNameTypedef, name), 0}, 1, \ FTYPEDESC_SAVE, NULL, \ CUtlRBTreeDataopsInstantiator::GetDataOps( \ &(((classNameTypedef *)0)->name)), \ NULL \ } #endif // SAVERESTORE_UTLRBTREE_H