21#include <bsoncxx/config/private/prelude.hpp>
24BSONCXX_INLINE_NAMESPACE_BEGIN
26template <
typename T, std::
size_t size>
29 stack() : _bucket_index(0), _bucket_size(size), _is_empty(
true) {
37 while (!_buckets.empty()) {
38 operator delete(_buckets.back());
51 template <
typename... Args>
52 void emplace_back(Args &&... args) {
59 new (_get_ptr()) T(std::forward<Args>(args)...);
68 if (!_buckets.empty()) {
69 _bucket_iter = _buckets.begin();
75 typename std::aligned_storage<
sizeof(T),
alignof(T)>::type _object_memory[size];
77 std::list<T *> _buckets;
79 typename std::list<T *>::iterator _bucket_iter;
86 if (_bucket_size == size) {
87 return reinterpret_cast<T *
>(_object_memory) + _bucket_index;
89 return *(_bucket_iter) + _bucket_index;
94 if (_bucket_index == _bucket_size - 1) {
98 if (_buckets.empty()) {
100 _buckets.emplace_back(
101 reinterpret_cast<T *
>(
operator new(
sizeof(T) * _bucket_size)));
103 _bucket_iter = _buckets.begin();
104 }
else if (_bucket_size != size * 2) {
106 auto tmp_iter = _bucket_iter;
108 if (++tmp_iter == _buckets.end()) {
109 _buckets.emplace_back(
110 reinterpret_cast<T *
>(
operator new(
sizeof(T) * _bucket_size)));
122 if (_bucket_index == 0) {
123 if (_bucket_size == size) {
129 _bucket_index = _bucket_size - 1;
131 if (_bucket_iter != _buckets.begin()) {
141BSONCXX_INLINE_NAMESPACE_END
144#include <bsoncxx/config/private/postlude.hpp>