git repos / blockattack-game

blame: source/code/Libs/include/cereal/external/rapidjson/internal/stack.h

normal view · raw

7a956470 sago007 2016-02-14 17:09 1
#ifndef RAPIDJSON_INTERNAL_STACK_H_
7a956470 sago007 2016-02-14 17:09 2
#define RAPIDJSON_INTERNAL_STACK_H_
7a956470 sago007 2016-02-14 17:09 3
7a956470 sago007 2016-02-14 17:09 4
namespace rapidjson {
7a956470 sago007 2016-02-14 17:09 5
namespace internal {
7a956470 sago007 2016-02-14 17:09 6
7a956470 sago007 2016-02-14 17:09 7
///////////////////////////////////////////////////////////////////////////////
7a956470 sago007 2016-02-14 17:09 8
// Stack
7a956470 sago007 2016-02-14 17:09 9
7a956470 sago007 2016-02-14 17:09 10
//! A type-unsafe stack for storing different types of data.
7a956470 sago007 2016-02-14 17:09 11
/*! \tparam Allocator Allocator for allocating stack memory.
7a956470 sago007 2016-02-14 17:09 12
*/
7a956470 sago007 2016-02-14 17:09 13
template <typename Allocator>
7a956470 sago007 2016-02-14 17:09 14
class Stack {
7a956470 sago007 2016-02-14 17:09 15
public:
7a956470 sago007 2016-02-14 17:09 16
	Stack(Allocator* allocator, size_t stack_capacity) : allocator_(allocator), own_allocator_(0), stack_(0), stack_top_(0), stack_end_(0), stack_capacity_(stack_capacity) {
7a956470 sago007 2016-02-14 17:09 17
		RAPIDJSON_ASSERT(stack_capacity_ > 0);
7a956470 sago007 2016-02-14 17:09 18
		if (!allocator_)
7a956470 sago007 2016-02-14 17:09 19
			own_allocator_ = allocator_ = new Allocator();
7a956470 sago007 2016-02-14 17:09 20
		stack_top_ = stack_ = (char*)allocator_->Malloc(stack_capacity_);
7a956470 sago007 2016-02-14 17:09 21
		stack_end_ = stack_ + stack_capacity_;
7a956470 sago007 2016-02-14 17:09 22
	}
7a956470 sago007 2016-02-14 17:09 23
7a956470 sago007 2016-02-14 17:09 24
	~Stack() {
7a956470 sago007 2016-02-14 17:09 25
		Allocator::Free(stack_);
7a956470 sago007 2016-02-14 17:09 26
		delete own_allocator_; // Only delete if it is owned by the stack
7a956470 sago007 2016-02-14 17:09 27
	}
7a956470 sago007 2016-02-14 17:09 28
7a956470 sago007 2016-02-14 17:09 29
	void Clear() { /*stack_top_ = 0;*/ stack_top_ = stack_; }
7a956470 sago007 2016-02-14 17:09 30
7a956470 sago007 2016-02-14 17:09 31
	template<typename T>
7a956470 sago007 2016-02-14 17:09 32
	T* Push(size_t count = 1) {
7a956470 sago007 2016-02-14 17:09 33
		 // Expand the stack if needed
7a956470 sago007 2016-02-14 17:09 34
		if (stack_top_ + sizeof(T) * count >= stack_end_) {
7a956470 sago007 2016-02-14 17:09 35
			size_t new_capacity = stack_capacity_ * 2;
7a956470 sago007 2016-02-14 17:09 36
			size_t size = GetSize();
7a956470 sago007 2016-02-14 17:09 37
			size_t new_size = GetSize() + sizeof(T) * count;
7a956470 sago007 2016-02-14 17:09 38
			if (new_capacity < new_size)
7a956470 sago007 2016-02-14 17:09 39
				new_capacity = new_size;
7a956470 sago007 2016-02-14 17:09 40
			stack_ = (char*)allocator_->Realloc(stack_, stack_capacity_, new_capacity);
7a956470 sago007 2016-02-14 17:09 41
			stack_capacity_ = new_capacity;
7a956470 sago007 2016-02-14 17:09 42
			stack_top_ = stack_ + size;
7a956470 sago007 2016-02-14 17:09 43
			stack_end_ = stack_ + stack_capacity_;
7a956470 sago007 2016-02-14 17:09 44
		}
7a956470 sago007 2016-02-14 17:09 45
		T* ret = (T*)stack_top_;
7a956470 sago007 2016-02-14 17:09 46
		stack_top_ += sizeof(T) * count;
7a956470 sago007 2016-02-14 17:09 47
		return ret;
7a956470 sago007 2016-02-14 17:09 48
	}
7a956470 sago007 2016-02-14 17:09 49
7a956470 sago007 2016-02-14 17:09 50
	template<typename T>
7a956470 sago007 2016-02-14 17:09 51
	T* Pop(size_t count) {
7a956470 sago007 2016-02-14 17:09 52
		RAPIDJSON_ASSERT(GetSize() >= count * sizeof(T));
7a956470 sago007 2016-02-14 17:09 53
		stack_top_ -= count * sizeof(T);
7a956470 sago007 2016-02-14 17:09 54
		return (T*)stack_top_;
7a956470 sago007 2016-02-14 17:09 55
	}
7a956470 sago007 2016-02-14 17:09 56
7a956470 sago007 2016-02-14 17:09 57
	template<typename T>
7a956470 sago007 2016-02-14 17:09 58
	T* Top() { 
7a956470 sago007 2016-02-14 17:09 59
		RAPIDJSON_ASSERT(GetSize() >= sizeof(T));
7a956470 sago007 2016-02-14 17:09 60
		return (T*)(stack_top_ - sizeof(T));
7a956470 sago007 2016-02-14 17:09 61
	}
7a956470 sago007 2016-02-14 17:09 62
7a956470 sago007 2016-02-14 17:09 63
	template<typename T>
7a956470 sago007 2016-02-14 17:09 64
	T* Bottom() { return (T*)stack_; }
7a956470 sago007 2016-02-14 17:09 65
7a956470 sago007 2016-02-14 17:09 66
	Allocator& GetAllocator() { return *allocator_; }
7a956470 sago007 2016-02-14 17:09 67
	size_t GetSize() const { return stack_top_ - stack_; }
7a956470 sago007 2016-02-14 17:09 68
	size_t GetCapacity() const { return stack_capacity_; }
7a956470 sago007 2016-02-14 17:09 69
7a956470 sago007 2016-02-14 17:09 70
private:
7a956470 sago007 2016-02-14 17:09 71
	Allocator* allocator_;
7a956470 sago007 2016-02-14 17:09 72
	Allocator* own_allocator_;
7a956470 sago007 2016-02-14 17:09 73
	char *stack_;
7a956470 sago007 2016-02-14 17:09 74
	char *stack_top_;
7a956470 sago007 2016-02-14 17:09 75
	char *stack_end_;
7a956470 sago007 2016-02-14 17:09 76
	size_t stack_capacity_;
7a956470 sago007 2016-02-14 17:09 77
};
7a956470 sago007 2016-02-14 17:09 78
7a956470 sago007 2016-02-14 17:09 79
} // namespace internal
7a956470 sago007 2016-02-14 17:09 80
} // namespace rapidjson
7a956470 sago007 2016-02-14 17:09 81
7a956470 sago007 2016-02-14 17:09 82
#endif // RAPIDJSON_STACK_H_
1970-01-01 00:00 83