//========= Copyright Valve Corporation, All rights reserved. ============// // // Purpose: // // $NoKeywords: $ //=============================================================================// #ifndef SAVERESTORE_BITSTRING_H #define SAVERESTORE_BITSTRING_H #include "isaverestore.h" #if defined(_WIN32) #pragma once #endif //------------------------------------- template class CVarBitVecSaveRestoreOps : public CDefSaveRestoreOps { public: CVarBitVecSaveRestoreOps() {} // save data type interface virtual void Save(const SaveRestoreFieldInfo_t &fieldInfo, ISave *pSave) { BITSTRING *pBitString = (BITSTRING *)fieldInfo.pField; int numBits = pBitString->GetNumBits(); pSave->WriteInt(&numBits); pSave->WriteInt(pBitString->Base(), pBitString->GetNumDWords()); } virtual void Restore(const SaveRestoreFieldInfo_t &fieldInfo, IRestore *pRestore) { BITSTRING *pBitString = (BITSTRING *)fieldInfo.pField; int numBits = pRestore->ReadInt(); if (!pBitString->IsFixedSize()) pBitString->Resize(numBits); else { Assert(pBitString->GetNumBits() >= numBits); pBitString->ClearAll(); } int numIntsInStream = CalcNumIntsForBits(numBits); int readSize = MIN(pBitString->GetNumDWords(), numIntsInStream); pRestore->ReadInt(pBitString->Base(), numIntsInStream); numIntsInStream -= readSize; while (numIntsInStream-- > 0) { int ignored; pRestore->ReadInt(&ignored, 1); } } virtual void MakeEmpty(const SaveRestoreFieldInfo_t &fieldInfo) { BITSTRING *pBitString = (BITSTRING *)fieldInfo.pField; pBitString->ClearAll(); } virtual bool IsEmpty(const SaveRestoreFieldInfo_t &fieldInfo) { BITSTRING *pBitString = (BITSTRING *)fieldInfo.pField; return pBitString->IsAllClear(); } }; //------------------------------------- template ISaveRestoreOps *GetBitstringDataOps(BITSTRING *) { static CVarBitVecSaveRestoreOps ops; return &ops; } //------------------------------------- #define SaveBitString(pSave, pBitString, fieldtype) \ CDataopsInstantiator::GetDataOps(pBitString) \ ->Save(pBitString, pSave); #define RestoreBitString(pRestore, pBitString, fieldtype) \ CDataopsInstantiator::GetDataOps(pBitString) \ ->Restore(pBitString, pRestore); //------------------------------------- #define DEFINE_BITSTRING(name) \ { \ FIELD_CUSTOM, #name, {offsetof(classNameTypedef, name), 0}, 1, \ FTYPEDESC_SAVE, NULL, \ GetBitstringDataOps(&(((classNameTypedef *)0)->name)), NULL \ } #endif // SAVERESTORE_BITSTRING_H