You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
84 lines
1.9 KiB
84 lines
1.9 KiB
//========= Copyright Valve Corporation, All rights reserved. ============//
|
|
//
|
|
// Purpose:
|
|
//
|
|
// $NoKeywords: $
|
|
//
|
|
//=============================================================================//
|
|
|
|
// These classes let you write your own allocators to be used with new and delete.
|
|
// If you have an allocator: VAllocator *pAlloc, you can call new and delete like this:
|
|
//
|
|
// ptr = VNew(pAlloc) ClassName;
|
|
// VDelete(pAlloc, ptr);
|
|
//
|
|
// Note: allocating and freeing arrays of objects will not work using VAllocators.
|
|
|
|
|
|
|
|
#ifndef VALLOCATOR_H
|
|
#define VALLOCATOR_H
|
|
|
|
|
|
class VAllocator
|
|
{
|
|
public:
|
|
virtual void* Alloc(unsigned long size)=0;
|
|
virtual void Free(void *ptr)=0;
|
|
};
|
|
|
|
|
|
// This allocator just uses malloc and free.
|
|
class VStdAllocator : public VAllocator
|
|
{
|
|
public:
|
|
virtual void* Alloc(unsigned long size);
|
|
virtual void Free(void *ptr);
|
|
};
|
|
extern VStdAllocator g_StdAllocator;
|
|
|
|
|
|
|
|
// Use these to allocate classes through VAllocator.
|
|
// Allocating arrays of classes is not supported.
|
|
#define VNew(pAlloc) new
|
|
#define VDelete(pAlloc, ptr) delete ptr
|
|
|
|
// Used internally.. just makes sure we call the right operator new.
|
|
class DummyAllocatorHelper
|
|
{
|
|
public:
|
|
int x;
|
|
};
|
|
|
|
inline void* operator new(size_t size, void *ptr, DummyAllocatorHelper *asdf)
|
|
{
|
|
(void)asdf; // Suppress unused-variable compiler warnings.
|
|
(void)size;
|
|
return ptr;
|
|
}
|
|
|
|
inline void operator delete(void *ptrToDelete, void *ptr, DummyAllocatorHelper *asdf)
|
|
{
|
|
(void)asdf; // Suppress unused-variable compiler warnings.
|
|
(void)ptr;
|
|
(void)ptrToDelete;
|
|
}
|
|
|
|
// Use these to manually construct and destruct lists of objects.
|
|
template<class T>
|
|
inline void VAllocator_CallConstructors(T *pObjects, int count=1)
|
|
{
|
|
for(int i=0; i < count; i++)
|
|
new(&pObjects[i], (DummyAllocatorHelper*)0) T;
|
|
}
|
|
|
|
template<class T>
|
|
inline void VAllocator_CallDestructors(T *pObjects, int count)
|
|
{
|
|
for(int i=0; i < count; i++)
|
|
pObjects[i].~T();
|
|
}
|
|
|
|
#endif
|
|
|