From d0c283254bdad8d303422140a059190eeadc2cc7 Mon Sep 17 00:00:00 2001 From: "Philipp A. Hartmann" Date: Thu, 30 Oct 2014 18:21:27 +0100 Subject: [PATCH 1/2] Stack<>: add _ suffix to member ownAllocator_ For consistency, all member variables should follow the same pattern. --- include/rapidjson/internal/stack.h | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/include/rapidjson/internal/stack.h b/include/rapidjson/internal/stack.h index fbf05b4..24ad4bc 100644 --- a/include/rapidjson/internal/stack.h +++ b/include/rapidjson/internal/stack.h @@ -35,23 +35,23 @@ class Stack { public: // Optimization note: Do not allocate memory for stack_ in constructor. // Do it lazily when first Push() -> Expand() -> Resize(). - Stack(Allocator* allocator, size_t stackCapacity) : allocator_(allocator), ownAllocator(0), stack_(0), stackTop_(0), stackEnd_(0), initialCapacity_(stackCapacity) { + Stack(Allocator* allocator, size_t stackCapacity) : allocator_(allocator), ownAllocator_(0), stack_(0), stackTop_(0), stackEnd_(0), initialCapacity_(stackCapacity) { RAPIDJSON_ASSERT(stackCapacity > 0); if (!allocator_) - ownAllocator = allocator_ = RAPIDJSON_NEW(Allocator()); + ownAllocator_ = allocator_ = RAPIDJSON_NEW(Allocator()); } #if RAPIDJSON_HAS_CXX11_RVALUE_REFS Stack(Stack&& rhs) : allocator_(rhs.allocator_), - ownAllocator(rhs.ownAllocator), + ownAllocator_(rhs.ownAllocator_), stack_(rhs.stack_), stackTop_(rhs.stackTop_), stackEnd_(rhs.stackEnd_), initialCapacity_(rhs.initialCapacity_) { rhs.allocator_ = 0; - rhs.ownAllocator = 0; + rhs.ownAllocator_ = 0; rhs.stack_ = 0; rhs.stackTop_ = 0; rhs.stackEnd_ = 0; @@ -70,14 +70,14 @@ public: Destroy(); allocator_ = rhs.allocator_; - ownAllocator = rhs.ownAllocator; + ownAllocator_ = rhs.ownAllocator_; stack_ = rhs.stack_; stackTop_ = rhs.stackTop_; stackEnd_ = rhs.stackEnd_; initialCapacity_ = rhs.initialCapacity_; rhs.allocator_ = 0; - rhs.ownAllocator = 0; + rhs.ownAllocator_ = 0; rhs.stack_ = 0; rhs.stackTop_ = 0; rhs.stackEnd_ = 0; @@ -162,7 +162,7 @@ private: void Destroy() { Allocator::Free(stack_); - RAPIDJSON_DELETE(ownAllocator); // Only delete if it is owned by the stack + RAPIDJSON_DELETE(ownAllocator_); // Only delete if it is owned by the stack } // Prohibit copy constructor & assignment operator. @@ -170,7 +170,7 @@ private: Stack& operator=(const Stack&); Allocator* allocator_; - Allocator* ownAllocator; + Allocator* ownAllocator_; char *stack_; char *stackTop_; char *stackEnd_; From e8f5d9f8ef8728bafce71e241aa4c1a5c5a768da Mon Sep 17 00:00:00 2001 From: "Philipp A. Hartmann" Date: Thu, 30 Oct 2014 18:40:58 +0100 Subject: [PATCH 2/2] MemoryPoolAllocator, Stack: lazily allocate Allocators In order to make the constructors more efficient, especially in the context of C++11 move semantics, the (dynamic) allocations in MemoryPoolAllocator and Stack should be performed lazily. Move the allocations to the first use of the allocator in both classes. --- include/rapidjson/allocators.h | 5 ++--- include/rapidjson/internal/stack.h | 8 ++++---- 2 files changed, 6 insertions(+), 7 deletions(-) diff --git a/include/rapidjson/allocators.h b/include/rapidjson/allocators.h index 04fab68..0d7b664 100644 --- a/include/rapidjson/allocators.h +++ b/include/rapidjson/allocators.h @@ -104,9 +104,6 @@ public: MemoryPoolAllocator(size_t chunkSize = kDefaultChunkCapacity, BaseAllocator* baseAllocator = 0) : chunkHead_(0), chunk_capacity_(chunkSize), userBuffer_(0), baseAllocator_(baseAllocator), ownBaseAllocator_(0) { - if (!baseAllocator_) - ownBaseAllocator_ = baseAllocator_ = RAPIDJSON_NEW(BaseAllocator()); - AddChunk(chunk_capacity_); } //! Constructor with user-supplied buffer. @@ -216,6 +213,8 @@ private: /*! \param capacity Capacity of the chunk in bytes. */ void AddChunk(size_t capacity) { + if (!baseAllocator_) + ownBaseAllocator_ = baseAllocator_ = RAPIDJSON_NEW(BaseAllocator()); ChunkHeader* chunk = reinterpret_cast(baseAllocator_->Malloc(sizeof(ChunkHeader) + capacity)); chunk->capacity = capacity; chunk->size = 0; diff --git a/include/rapidjson/internal/stack.h b/include/rapidjson/internal/stack.h index 24ad4bc..b7d7449 100644 --- a/include/rapidjson/internal/stack.h +++ b/include/rapidjson/internal/stack.h @@ -37,8 +37,6 @@ public: // Do it lazily when first Push() -> Expand() -> Resize(). Stack(Allocator* allocator, size_t stackCapacity) : allocator_(allocator), ownAllocator_(0), stack_(0), stackTop_(0), stackEnd_(0), initialCapacity_(stackCapacity) { RAPIDJSON_ASSERT(stackCapacity > 0); - if (!allocator_) - ownAllocator_ = allocator_ = RAPIDJSON_NEW(Allocator()); } #if RAPIDJSON_HAS_CXX11_RVALUE_REFS @@ -140,9 +138,11 @@ private: void Expand(size_t count) { // Only expand the capacity if the current stack exists. Otherwise just create a stack with initial capacity. size_t newCapacity; - if (stack_ == 0) + if (stack_ == 0) { + if (!allocator_) + ownAllocator_ = allocator_ = RAPIDJSON_NEW(Allocator()); newCapacity = initialCapacity_; - else { + } else { newCapacity = GetCapacity(); newCapacity += (newCapacity + 1) / 2; }