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

73 lines
2.0 KiB
C++

//========= 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