3 #include <utils/messageException.h>
4 #include <memory/memoryStructure.h>
12 template <
typename T>
class StackObserver;
13 template <
typename T>
class StackModifier;
55 std::ostringstream ss;
56 ss << this->
msg << std::endl;
57 ss <<
" Allocated size: " <<
allocated << std::endl;
58 ss <<
" Free space: " <<
freeSpace << std::endl;
130 constexpr
void push(
const T& symbol);
135 constexpr
void push(T&& symbol);
140 constexpr
void pushs(
const std::vector<T>& symbol);
145 constexpr
void pushs(std::vector<T>&& symbol);
154 [[nodiscard]]
const T&
top()
const;
161 [[nodiscard]] std::optional<T>
top_opt()
const;
168 [[nodiscard]] std::vector<T>
tops(
size_t nb)
const;
174 [[nodiscard]] std::optional<std::vector<T>>
tops_opt(
size_t nb)
const;
185 void pops(
size_t nb);
190 [[nodiscard]] constexpr
bool empty() const noexcept;
198 constexpr
void allocate();
199 constexpr
void allocate(
size_t additionalSize);
200 constexpr
void shrink();
201 constexpr
void disableFree();
202 constexpr
void enableFree();
203 void setSizeFactor(
size_t newSizeFactor);
204 constexpr
void free();
209 bool enabledFree = true;
210 size_t sizeFactor = 2;
220 freeSpace(other.freeSpace),
222 enabledFree(other.enabledFree),
223 sizeFactor(other.sizeFactor)
228 size(std::move(other.size)),
229 freeSpace(std::move(other.freeSpace)),
230 stack(std::move(other.stack)),
231 enabledFree(std::move(other.enabledFree)),
232 sizeFactor(std::move(other.sizeFactor))
239 freeSpace = other.freeSpace;
241 enabledFree = other.enabledFree;
242 sizeFactor = other.sizeFactor;
250 size = std::move(other.size);
251 freeSpace = std::move(other.freeSpace);
252 stack = std::move(other.stack);
253 enabledFree = std::move(other.enabledFree);
254 sizeFactor = std::move(other.sizeFactor);
265 stack[size] = symbol;
276 stack[size] = std::move(symbol);
283 while(freeSpace < symbols.size()) {
287 for(
const T& symbol: symbols) {
288 stack[size] = symbol;
292 freeSpace -= symbols.size();
297 while(freeSpace < symbols.size()) {
301 for(T& symbol: symbols) {
302 stack[size] = std::move(symbol);
306 freeSpace -= symbols.size();
312 stack.resize(sizeFactor*stack.size());
313 freeSpace = stack.size() - size;
317 constexpr
void Stack<T>::allocate(
size_t additionalSize) {
318 stack.resize(stack.size() + additionalSize);
319 freeSpace = stack.size() - size;
322 template <
typename T>
327 return stack[size-1];
330 template <
typename T>
335 return {stack[size - 1]};
338 template <
typename T>
343 return {stack.begin() +
static_cast<long>(size) -
static_cast<long>(nb), stack.begin() +
static_cast<long>(size)};
346 template <
typename T>
351 return {std::vector<T>{stack.begin() +
static_cast<long>(size) -
static_cast<long>(nb), stack.begin() +
static_cast<long>(size)}};
354 template <
typename T>
367 template <
typename T>
380 template <
typename T>
385 template <
typename T>
392 template <
typename T>
394 if((sizeFactor*sizeFactor-1)*size < freeSpace) {
395 stack.resize(std::max(MinAllocatedStackSize, stack.size()/sizeFactor));
396 freeSpace = stack.size() - size;
400 template <
typename T>
401 constexpr
void Stack<T>::shrink() {
402 stack.resize(std::max(size, MinAllocatedStackSize));
406 template <
typename T>
407 constexpr
void Stack<T>::disableFree() {
411 template <
typename T>
412 constexpr
void Stack<T>::enableFree() {
417 template <
typename T>
418 void Stack<T>::setSizeFactor(
size_t newSizeFactor) {
419 if(newSizeFactor < 2) {
420 throw InvalidFactorException(
"Size factor is too small in Stack<T>::setSizeFactor(size_t). Must be > 1.", newSizeFactor);
422 sizeFactor = newSizeFactor;
428 template <
typename T>
441 [[nodiscard]] constexpr
size_t getSize()
const {
return this->memory->size; }
445 [[nodiscard]] constexpr
size_t getFreeSpace()
const {
return this->memory->freeSpace; }
449 [[nodiscard]] constexpr
size_t getAllocatedSize()
const {
return this->memory->stack.size(); }
453 [[nodiscard]] constexpr
const std::vector<T>&
getStack()
const {
return this->memory->stack; }
457 [[nodiscard]] constexpr
bool getEnabledFree()
const {
return this->memory->enabledFree; }
461 [[nodiscard]] constexpr
size_t getSizeFactor()
const {
return this->memory->sizeFactor; }
467 template <
typename T>
481 constexpr
void allocate()
const { this->memory->allocate(); }
485 constexpr
void allocate(
size_t additionalSize)
const { this->memory->allocate(additionalSize); }
489 constexpr
void shrink()
const { this->memory->shrink(); }
493 constexpr
void disableFree()
const { this->memory->disableFree(); }
497 constexpr
void enableFree()
const { this->memory->enableFree(); }
503 constexpr
void setSizeFactor(
size_t newSizeFactor) { this->memory->setSizeFactor(newSizeFactor); }