//========= Copyright Valve Corporation, All rights reserved. ============// // // Purpose: // The CUtlAllocation class: // A single allocation in the style of CUtlMemory/CUtlString/CUtlBuffer // as compact as possible, no virtuals or extraneous data // to be used primarily to replace CUtlBuffer //============================================================================= #ifndef UTLALLOCATION_H #define UTLALLOCATION_H #ifdef _WIN32 #pragma once #endif #include "tier1/utlmemory.h" class CUtlAllocation { public: // constructor, destructor CUtlAllocation() { m_pMemory = NULL; } CUtlAllocation(const void *pMemory, int cub) { m_pMemory = NULL; Copy(pMemory, cub); } CUtlAllocation(CUtlAllocation const &src) { m_pMemory = NULL; Copy(src); } ~CUtlAllocation() { Purge(); } CUtlAllocation &operator=(CUtlAllocation const &src) { Copy(src); return *this; } bool operator==(CUtlAllocation const &src) { if (Count() != src.Count()) return false; return Q_memcmp(Base(), src.Base(), Count()) == 0; } void Copy(const void *pMemory, int cub) { if (cub == 0 || pMemory == NULL) { Purge(); return; } if (cub != Count()) { Purge(); m_pMemory = (ActualMemory_t *)malloc(cub + sizeof(int)); m_pMemory->cub = cub; } Q_memcpy(Base(), pMemory, cub); } // Gets the base address uint8 *Base() { if (m_pMemory == NULL) return NULL; return m_pMemory->rgub; } const uint8 *Base() const { if (m_pMemory == NULL) return NULL; return m_pMemory->rgub; } // Size int Count() const { if (m_pMemory == NULL) return 0; return m_pMemory->cub; } // Memory deallocation void Purge() { if (m_pMemory) free(m_pMemory); m_pMemory = NULL; } void Copy(const CUtlAllocation &alloc) { Copy(alloc.Base(), alloc.Count()); } void Swap(CUtlAllocation &alloc) { ActualMemory_t *pTemp = m_pMemory; m_pMemory = alloc.m_pMemory; alloc.m_pMemory = pTemp; } void Alloc(int cub) { Purge(); m_pMemory = (ActualMemory_t *)malloc(cub + sizeof(int)); m_pMemory->cub = cub; } private: struct ActualMemory_t { int cub; uint8 rgub[4]; // i'd prefer to make this 0 but the compiler whines // when i do }; ActualMemory_t *m_pMemory; }; #endif // UTLALLOCATION_H