1 #ifndef RAPIDJSON_ALLOCATORS_H_
2 #define RAPIDJSON_ALLOCATORS_H_
50 static const bool kNeedFree =
true;
51 void* Malloc(
size_t size) {
return malloc(size); }
52 void* Realloc(
void* originalPtr,
size_t originalSize,
size_t newSize) { (void)originalSize;
return realloc(originalPtr, newSize); }
53 static void Free(
void *ptr) { free(ptr); }
75 template <
typename BaseAllocator = CrtAllocator>
85 chunkHead_(0), chunk_capacity_(chunkSize), userBuffer_(0), baseAllocator_(baseAllocator), ownBaseAllocator_(0)
88 ownBaseAllocator_ = baseAllocator_ =
new BaseAllocator();
89 AddChunk(chunk_capacity_);
102 MemoryPoolAllocator(
void *buffer,
size_t size,
size_t chunkSize = kDefaultChunkCapacity, BaseAllocator* baseAllocator = 0) :
103 chunkHead_(0), chunk_capacity_(chunkSize), userBuffer_(buffer), baseAllocator_(baseAllocator), ownBaseAllocator_(0)
107 chunkHead_ =
reinterpret_cast<ChunkHeader*
>(buffer);
108 chunkHead_->capacity = size -
sizeof(ChunkHeader);
109 chunkHead_->size = 0;
110 chunkHead_->next = 0;
118 delete ownBaseAllocator_;
123 while(chunkHead_ != 0 && chunkHead_ != userBuffer_) {
124 ChunkHeader* next = chunkHead_->next;
125 baseAllocator_->Free(chunkHead_);
135 for (ChunkHeader* c = chunkHead_; c != 0; c = c->next)
136 capacity += c->capacity;
145 for (ChunkHeader* c = chunkHead_; c != 0; c = c->next)
153 if (chunkHead_->size + size > chunkHead_->capacity)
154 AddChunk(chunk_capacity_ > size ? chunk_capacity_ : size);
156 void *buffer =
reinterpret_cast<char *
>(chunkHead_ + 1) + chunkHead_->size;
157 chunkHead_->size += size;
162 void*
Realloc(
void* originalPtr,
size_t originalSize,
size_t newSize) {
163 if (originalPtr == 0)
167 if (originalSize >= newSize)
171 if (originalPtr == (
char *)(chunkHead_ + 1) + chunkHead_->size - originalSize) {
172 size_t increment =
static_cast<size_t>(newSize - originalSize);
174 if (chunkHead_->size + increment <= chunkHead_->capacity) {
175 chunkHead_->size += increment;
181 void* newBuffer =
Malloc(newSize);
183 return memcpy(newBuffer, originalPtr, originalSize);
187 static void Free(
void *ptr) { (void)ptr; }
198 void AddChunk(
size_t capacity) {
199 ChunkHeader* chunk =
reinterpret_cast<ChunkHeader*
>(baseAllocator_->Malloc(
sizeof(ChunkHeader) + capacity));
200 chunk->capacity = capacity;
202 chunk->next = chunkHead_;
206 static const int kDefaultChunkCapacity = 64 * 1024;
217 ChunkHeader *chunkHead_;
218 size_t chunk_capacity_;
220 BaseAllocator* baseAllocator_;
221 BaseAllocator* ownBaseAllocator_;
226 #endif // RAPIDJSON_ENCODINGS_H_