hl2_src-leak-2017/src/game/shared/saverestore_utlrbtree.h

168 lines
3.5 KiB
C++

//========= Copyright Valve Corporation, All rights reserved. ============//
//
// Purpose:
//
//=============================================================================//
#ifndef SAVERESTORE_UTLRBTREE_H
#define SAVERESTORE_UTLRBTREE_H
#include "utlrbtree.h"
#include "isaverestore.h"
#include "saverestore_utlclass.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