// step1/memory_pool.h
#include <new>
#include <stddef.h>
#include <assert.h>
template <size_t Sz>
class MemoryPool
{
public:
static void* allocate()
{
void* pvResult = s_pMemoryPool;
if (pvResult == 0)
{
return ::operator new(Sz >= sizeof(BlockList)
? Sz : sizeof(BlockList),
std::nothrow);
}
s_pMemoryPool = s_pMemoryPool->m_pNext;
return pvResult;
}
static void deallocate(void* pvReturn)
{
assert(pvReturn != NULL);
BlockList* pBlockList = reinterpret_cast<BlockList*>(pvReturn);
pBlockList->m_pNext = s_pMemoryPool;
s_pMemoryPool = pBlockList;
}
private:
static struct BlockList { BlockList* m_pNext; }* s_pMemoryPool;
};
template <size_t Sz>
typename MemoryPool<Sz>::BlockList*
MemoryPool<Sz>::s_pMemoryPool = NULL;