This repository has been archived on 2024-06-13. You can view files and clone it, but cannot push or open issues or pull requests.
nekohook/modules/source2013/sdk/game/shared/saverestore_utlrbtree.h
2020-08-04 13:13:01 -04:00

134 lines
4.1 KiB
C++

//========= 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 UTLRBTREE, int FIELD_TYPE>
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<FIELD_TYPE>::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<FIELD_TYPE>::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 <int FIELD_TYPE>
class CUtlRBTreeDataopsInstantiator {
public:
template <class UTLRBTREE>
static ISaveRestoreOps *GetDataOps(UTLRBTREE *) {
static CUtlRBTreeDataOps<UTLRBTREE, FIELD_TYPE> ops;
return &ops;
}
};
//-------------------------------------
#define SaveUtlRBTree(pSave, pUtlRBTree, fieldtype) \
CUtlRBTreeDataopsInstantiator<fieldtype>::GetDataOps(pUtlRBTree) \
->Save(pUtlRBTree, pSave);
#define RestoreUtlRBTree(pRestore, pUtlRBTree, fieldtype) \
CUtlRBTreeDataopsInstantiator<fieldtype>::GetDataOps(pUtlRBTree) \
->Restore(pUtlRBTree, pRestore);
//-------------------------------------
#define DEFINE_UTLRBTREE(name, fieldtype) \
{ \
FIELD_CUSTOM, #name, {offsetof(classNameTypedef, name), 0}, 1, \
FTYPEDESC_SAVE, NULL, \
CUtlRBTreeDataopsInstantiator<fieldtype>::GetDataOps( \
&(((classNameTypedef *)0)->name)), \
NULL \
}
#endif // SAVERESTORE_UTLRBTREE_H