123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657 |
- #ifndef CORE_STACK_H
- #define CORE_STACK_H
- #include "data/ArrayList.h"
- #include "data/List.h"
- namespace Core {
- namespace Internal {
- template<typename T, typename S>
- class BaseStack final {
- S data;
- public:
- // returns a nullptr on error and calls the error callback
- template<typename... Args>
- check_return T* push(Args&&... args) {
- return data.add(Core::forward<Args>(args)...);
- }
- void clear() {
- data.clear();
- }
- // returns true on error and calls the error callback
- 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 and calls the error callback
- template<int L>
- check_return bool toString(ArrayString<L>& s) const {
- return s.append(data);
- }
- };
- }
- template<typename T>
- using ListStack = Internal::BaseStack<T, List<T>>;
- template<typename T, int N>
- using ArrayStack = Internal::BaseStack<T, ArrayList<T, N>>;
- }
- #endif
|