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. #include "core/utils/Error.hpp"
  6. namespace Core {
  7. namespace Internal {
  8. template<typename T, typename S>
  9. class BaseStack final {
  10. S data{};
  11. public:
  12. template<typename... Args>
  13. BaseStack& push(Args&&... args) {
  14. data.add(Core::forward<Args>(args)...);
  15. return *this;
  16. }
  17. void clear() {
  18. data.clear();
  19. }
  20. void pop() {
  21. assert(data.getLength() > 0);
  22. data.removeBySwap(data.getLength() - 1);
  23. }
  24. bool isEmpty() const {
  25. return data.getLength() == 0;
  26. }
  27. T& peek() {
  28. assert(data.getLength() > 0);
  29. return data[data.getLength() - 1];
  30. }
  31. const T& peek() const {
  32. assert(data.getLength() > 0);
  33. return data[data.getLength() - 1];
  34. }
  35. void toString(BufferString& s) const {
  36. s.append(data);
  37. }
  38. };
  39. }
  40. template<typename T>
  41. using ListStack = Internal::BaseStack<T, List<T>>;
  42. template<typename T, size_t N>
  43. using ArrayStack = Internal::BaseStack<T, ArrayList<T, N>>;
  44. }
  45. #endif