10#ifndef SMALLSTACK_TYPE_HPP
11#define SMALLSTACK_TYPE_HPP
18template <
typename Titem,
typename Tindex, Tindex Tgrowth_step, Tindex Tmax_size>
21 inline SimplePool() : first_unused(0), first_free(0) {}
27 inline Titem &
Get(Tindex index) {
return this->data[index]; }
35 Tindex index = this->FindFirstFree();
36 if (index < Tmax_size) {
37 this->data[index].valid =
true;
38 this->first_free = index + 1;
39 this->first_unused = std::max(this->first_unused, this->first_free);
50 this->data[index].valid =
false;
51 this->first_free = std::min(this->first_free, index);
56 inline Tindex FindFirstFree()
58 Tindex index = this->first_free;
59 for (; index < this->first_unused; index++) {
60 if (!this->data[index].valid)
return index;
63 if (index >= this->data.size() && index < Tmax_size) {
64 this->data.resize(index + 1);
76 std::vector<SimplePoolPoolItem> data;
83template <
typename Titem,
typename Tindex>
120template <
typename Titem,
typename Tindex, auto Tinval
id_value, Tindex Tgrowth_step, Tindex Tmax_size>
123 static constexpr Titem Tinvalid{Tinvalid_value};
147 while (this->
next != Tmax_size) this->
Pop();
163 if (
this == &other)
return *
this;
164 while (this->
next != Tmax_size) this->
Pop();
178 inline void Push(
const Titem &item)
180 if (this->
value != Tinvalid) {
181 Tindex new_item = SmallStack::GetPool().
Create();
182 if (new_item != Tmax_size) {
187 this->
next = new_item;
178 inline void Push(
const Titem &item) {
…}
199 Titem ret = this->
value;
200 if (this->
next == Tmax_size) {
201 this->
value = Tinvalid;
209 if (popped.
next != Tmax_size) {
210 ++(SmallStack::GetPool().
Get(popped.
next).branch_count);
226 return this->
value == Tinvalid && this->
next == Tmax_size;
236 if (item == Tinvalid || item == this->
value)
return true;
237 if (this->
next != Tmax_size) {
241 static_cast<const Item *
>(&SmallStack::GetPool().
Get(in_list->
next)));
242 if (in_list->
value == item)
return true;
243 }
while (in_list->
next != Tmax_size);
249 static SmallStackPool &GetPool()
251 static SmallStackPool pool;
260 if (this->
next != Tmax_size) {
261 ++(SmallStack::GetPool().
Get(this->
next).branch_count);
A simplified pool which stores values instead of pointers and doesn't redefine operator new/delete.
Titem & Get(Tindex index)
Get the item at position index.
Tindex Create()
Create a new item and return its index.
void Destroy(Tindex index)
Destroy (or rather invalidate) the item at the given index.
Minimal stack that uses a pool to avoid pointers.
SmallStack(const Titem &value=Tinvalid)
Constructor for a stack with one or two items in it.
SmallStack(const SmallStack &other)
Shallow copy the stack, marking the first item as branched.
void Branch()
Create a branch in the pool if necessary.
void Push(const Titem &item)
Pushes a new item onto the stack if there is still space in the underlying pool.
~SmallStack()
Remove the head of stack and all other items members that are unique to it.
Titem Pop()
Pop an item from the stack.
SmallStack & operator=(const SmallStack &other)
Shallow copy the stack, marking the first item as branched.
bool Contains(const Titem &item) const
Check if the given item is contained in the stack.
bool IsEmpty() const
Check if the stack is empty.
Base class for SmallStack.
Titem value
Value of current item.
Tindex next
Pool index of next item.
SmallStackItem(const Titem &value, Tindex next)
Create a new item.
SmallStack item that can be kept in a pool.
Tindex branch_count
Number of branches in the tree structure this item is parent of.