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.
2020-08-04 13:13:01 -04:00

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