108 lines
2.5 KiB
C++
108 lines
2.5 KiB
C++
//========= 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
|