#ifndef STACK_H #define STACK_H #include "data/ArrayList.h" #include "data/List.h" namespace Core { namespace Internal { template class BaseStack final { S data; public: // returns true on error template check_return bool push(Args&&... args) { return data.add(Core::forward(args)...); } void clear() { data.clear(); } // returns true on error check_return bool pop() { // removeBySwap is checked return data.removeBySwap(data.getLength() - 1); } bool isEmpty() const { return data.getLength() == 0; } T& peek() { return data[data.getLength() - 1]; } const T& peek() const { return data[data.getLength() - 1]; } // returns true on error template check_return bool toString(ArrayString& s) const { return s.append(data); } }; } template using ListStack = Internal::BaseStack>; template using ArrayStack = Internal::BaseStack>; } #endif