11#include <promeki/config.h>
12#if PROMEKI_ENABLE_CORE
18PROMEKI_NAMESPACE_BEGIN
36template <
typename T>
class Stack {
42 Stack(
const Stack &other) : d(other.d) {}
45 Stack(Stack &&other) noexcept : d(std::move(other.d)) {}
51 Stack &operator=(
const Stack &other) {
57 Stack &operator=(Stack &&other)
noexcept {
58 d = std::move(other.d);
65 bool isEmpty()
const {
return d.empty(); }
68 size_t size()
const {
return d.size(); }
73 T &top() {
return d.top(); }
76 const T &top()
const {
return d.top(); }
79 const T &constTop()
const {
return d.top(); }
87 void push(
const T &value) {
96 void push(T &&value) {
97 d.push(std::move(value));
107 if (d.empty())
throw std::logic_error(
"Stack::pop on empty stack");
108 T val = std::move(d.top());
115 while (!d.empty()) d.pop();
123 void swap(Stack &other)
noexcept {
131 friend bool operator==(
const Stack &lhs,
const Stack &rhs) {
return lhs.d == rhs.d; }
134 friend bool operator!=(
const Stack &lhs,
const Stack &rhs) {
return lhs.d != rhs.d; }