21 #ifndef RAPIDJSON_INTERNAL_STACK_H_
22 #define RAPIDJSON_INTERNAL_STACK_H_
33 template <
typename Allocator>
38 Stack(Allocator* allocator,
size_t stackCapacity) : allocator_(allocator), ownAllocator_(0), stack_(0), stackTop_(0), stackEnd_(0), initialCapacity_(stackCapacity) {
42 #if RAPIDJSON_HAS_CXX11_RVALUE_REFS
44 : allocator_(rhs.allocator_),
45 ownAllocator_(rhs.ownAllocator_),
47 stackTop_(rhs.stackTop_),
48 stackEnd_(rhs.stackEnd_),
49 initialCapacity_(rhs.initialCapacity_)
52 rhs.ownAllocator_ = 0;
56 rhs.initialCapacity_ = 0;
64 #if RAPIDJSON_HAS_CXX11_RVALUE_REFS
65 Stack& operator=(Stack&& rhs) {
70 allocator_ = rhs.allocator_;
71 ownAllocator_ = rhs.ownAllocator_;
73 stackTop_ = rhs.stackTop_;
74 stackEnd_ = rhs.stackEnd_;
75 initialCapacity_ = rhs.initialCapacity_;
78 rhs.ownAllocator_ = 0;
82 rhs.initialCapacity_ = 0;
88 void Clear() { stackTop_ = stack_; }
93 Allocator::Free(stack_);
105 RAPIDJSON_FORCEINLINE T* Push(
size_t count = 1) {
107 if (stackTop_ +
sizeof(T) * count >= stackEnd_)
110 T* ret =
reinterpret_cast<T*
>(stackTop_);
111 stackTop_ +=
sizeof(T) * count;
116 T* Pop(
size_t count) {
118 stackTop_ -= count *
sizeof(T);
119 return reinterpret_cast<T*
>(stackTop_);
125 return reinterpret_cast<T*
>(stackTop_ -
sizeof(T));
129 T* Bottom() {
return (T*)stack_; }
131 Allocator& GetAllocator() {
return *allocator_; }
132 bool Empty()
const {
return stackTop_ == stack_; }
133 size_t GetSize()
const {
return static_cast<size_t>(stackTop_ - stack_); }
134 size_t GetCapacity()
const {
return static_cast<size_t>(stackEnd_ - stack_); }
138 void Expand(
size_t count) {
144 newCapacity = initialCapacity_;
146 newCapacity = GetCapacity();
147 newCapacity += (newCapacity + 1) / 2;
149 size_t newSize = GetSize() +
sizeof(T) * count;
150 if (newCapacity < newSize)
151 newCapacity = newSize;
156 void Resize(
size_t newCapacity) {
157 const size_t size = GetSize();
158 stack_ = (
char*)allocator_->Realloc(stack_, GetCapacity(), newCapacity);
159 stackTop_ = stack_ + size;
160 stackEnd_ = stack_ + newCapacity;
164 Allocator::Free(stack_);
170 Stack& operator=(
const Stack&);
172 Allocator* allocator_;
173 Allocator* ownAllocator_;
177 size_t initialCapacity_;
183 #endif // RAPIDJSON_STACK_H_