135 lines
2.3 KiB
C++
135 lines
2.3 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
|