15 #ifndef RAPIDJSON_INTERNAL_STACK_H_
16 #define RAPIDJSON_INTERNAL_STACK_H_
18 #include "../allocators.h"
21 #if defined(__clang__)
23 RAPIDJSON_DIAG_OFF(
c++98-compat)
35 template <
typename Allocator>
40 Stack(
Allocator* allocator,
size_t stackCapacity) : allocator_(allocator), ownAllocator_(0), stack_(0), stackTop_(0), stackEnd_(0), initialCapacity_(stackCapacity) {
43 #if RAPIDJSON_HAS_CXX11_RVALUE_REFS
45 : allocator_(rhs.allocator_),
46 ownAllocator_(rhs.ownAllocator_),
48 stackTop_(rhs.stackTop_),
49 stackEnd_(rhs.stackEnd_),
50 initialCapacity_(rhs.initialCapacity_)
53 rhs.ownAllocator_ = 0;
57 rhs.initialCapacity_ = 0;
65 #if RAPIDJSON_HAS_CXX11_RVALUE_REFS
71 allocator_ = rhs.allocator_;
72 ownAllocator_ = rhs.ownAllocator_;
74 stackTop_ = rhs.stackTop_;
75 stackEnd_ = rhs.stackEnd_;
76 initialCapacity_ = rhs.initialCapacity_;
79 rhs.ownAllocator_ = 0;
83 rhs.initialCapacity_ = 0;
98 void Clear() { stackTop_ = stack_; }
103 Allocator::Free(stack_);
115 RAPIDJSON_FORCEINLINE
void Reserve(
size_t count = 1) {
122 RAPIDJSON_FORCEINLINE T*
Push(
size_t count = 1) {
124 return PushUnsafe<T>(count);
130 T* ret =
reinterpret_cast<T*
>(stackTop_);
131 stackTop_ +=
sizeof(T) * count;
138 stackTop_ -= count *
sizeof(T);
139 return reinterpret_cast<T*
>(stackTop_);
145 return reinterpret_cast<T*
>(stackTop_ -
sizeof(T));
151 return reinterpret_cast<T*
>(stackTop_ -
sizeof(T));
155 T*
End() {
return reinterpret_cast<T*
>(stackTop_); }
158 const T*
End()
const {
return reinterpret_cast<T*
>(stackTop_); }
161 T*
Bottom() {
return reinterpret_cast<T*
>(stack_); }
164 const T*
Bottom()
const {
return reinterpret_cast<T*
>(stack_); }
167 return allocator_ != 0;
175 bool Empty()
const {
return stackTop_ == stack_; }
176 size_t GetSize()
const {
return static_cast<size_t>(stackTop_ - stack_); }
177 size_t GetCapacity()
const {
return static_cast<size_t>(stackEnd_ - stack_); }
181 void Expand(
size_t count) {
187 newCapacity = initialCapacity_;
190 newCapacity += (newCapacity + 1) / 2;
192 size_t newSize =
GetSize() +
sizeof(T) * count;
193 if (newCapacity < newSize)
194 newCapacity = newSize;
199 void Resize(
size_t newCapacity) {
201 stack_ =
static_cast<char*
>(allocator_->Realloc(stack_,
GetCapacity(), newCapacity));
202 stackTop_ = stack_ + size;
203 stackEnd_ = stack_ + newCapacity;
207 Allocator::Free(stack_);
220 size_t initialCapacity_;
226 #if defined(__clang__)
230 #endif // RAPIDJSON_STACK_H_