Stack.h 1.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657
  1. #ifndef STACK_H
  2. #define STACK_H
  3. #include "data/ArrayList.h"
  4. #include "data/List.h"
  5. namespace Core {
  6. namespace Internal {
  7. template<typename T, typename S>
  8. class BaseStack final {
  9. S data;
  10. public:
  11. // returns true on error
  12. template<typename... Args>
  13. check_return bool push(Args&&... args) {
  14. return data.add(Core::forward<Args>(args)...);
  15. }
  16. void clear() {
  17. data.clear();
  18. }
  19. // returns true on error
  20. check_return bool pop() {
  21. // removeBySwap is checked
  22. return data.removeBySwap(data.getLength() - 1);
  23. }
  24. bool isEmpty() const {
  25. return data.getLength() == 0;
  26. }
  27. T& peek() {
  28. return data[data.getLength() - 1];
  29. }
  30. const T& peek() const {
  31. return data[data.getLength() - 1];
  32. }
  33. // returns true on error
  34. template<int L>
  35. check_return bool toString(ArrayString<L>& s) const {
  36. return s.append(data);
  37. }
  38. };
  39. }
  40. template<typename T>
  41. using ListStack = Internal::BaseStack<T, List<T>>;
  42. template<typename T, int N>
  43. using ArrayStack = Internal::BaseStack<T, ArrayList<T, N>>;
  44. }
  45. #endif