71 typedef std::size_t Record;
72 static const Record RecordSize =
sizeof(Record);
73 static const Record InvalidIndex = std::size_t(-1);
79 std::size_t firstFreeIndex;
81 std::size_t availUnits;
86 Block(std::size_t unitSize_, std::size_t numUnits)
88 , firstFreeIndex(InvalidIndex)
90 , availUnits(numUnits)
96 {
return availUnits == 0; }
99 {
return availUnits == maxUnits; }
105 firstFreeIndex = InvalidIndex;
110 assert(availUnits > 0);
112 if( firstFreeIndex != InvalidIndex )
114 assert(firstFreeIndex < endIndex);
115 Record* retval = block + firstFreeIndex;
116 firstFreeIndex = *retval;
123 block =
new Record[maxUnits*unitSize];
127 Record* retval = block + endIndex;
128 endIndex += unitSize;
130 assert(endIndex <= maxUnits*unitSize);
137 assert(availUnits <= maxUnits);
139 *ptr = firstFreeIndex;
140 firstFreeIndex = ptr - block;
141 assert( ptr >= block );
142 assert( ptr <= (block + endIndex) );
149 MemoryPool(std::size_t elemSize, std::size_t maxPageSize = 8192);
157 if( _freelist.empty() )
159 _freelist.push_back( _blocks.size() );
160 _blocks.push_back( Block(_recordsPerUnit, _maxUnits) );
163 const std::size_t index = _freelist.back();
164 Block& block = _blocks[index];
166 Record* retval = block.allocate();
171 _freelist.pop_back();
182 Record* unitPtr =
reinterpret_cast<Record*
>(ptr);
185 const std::size_t blockIndex = *unitPtr;
186 Block& block = _blocks[blockIndex];
189 _freelist.push_back(blockIndex);
191 block.deallocate(unitPtr);
194 if( block.isEmpty() && blockIndex > 0 )
199 std::vector<Block> _blocks;
200 std::vector<std::size_t> _freelist;
203 std::size_t _recordsPerUnit;
204 std::size_t _maxUnits;
void deallocate(void *p, std::size_t size)
Deallocates memory of size bytes.
Definition PoolAllocator.h:271
PoolAllocator(std::size_t maxSize, std::size_t align=16, std::size_t maxBlock=8192)
Contruct with maximum record size, alignment and block size.