hl2_src-leak-2017/src/public/tier1/utlallocation.h

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