Stack.hpp 1.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657
  1. #ifndef CORE_STACK_HPP
  2. #define CORE_STACK_HPP
  3. #include "core/data/ArrayList.hpp"
  4. #include "core/data/List.hpp"
  5. namespace Core {
  6. namespace Internal {
  7. template<typename T, typename S>
  8. class BaseStack final {
  9. S data{};
  10. public:
  11. template<typename... Args>
  12. check_return Error push(Args&&... args) {
  13. return data.add(Core::forward<Args>(args)...);
  14. }
  15. void clear() {
  16. data.clear();
  17. }
  18. check_return Error pop() {
  19. i64 index = data.getLength();
  20. if(index <= 0) {
  21. return Error::INVALID_STATE;
  22. }
  23. return data.removeBySwap(index - 1);
  24. }
  25. bool isEmpty() const {
  26. return data.getLength() == 0;
  27. }
  28. T& peek() {
  29. return data[data.getLength() - 1];
  30. }
  31. const T& peek() const {
  32. return data[data.getLength() - 1];
  33. }
  34. template<typename String>
  35. check_return Error toString(String& 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