22 constexpr undo_stack(
size_t max_depth) noexcept : _stack{}, _max_depth(max_depth), _cursor(0) {}
24 template<
typename... Args>
25 constexpr void emplace(Args &&... args)
noexcept
27 push(value_type{std::forward<Args>(args)...});
30 [[nodiscard]]
constexpr bool can_undo()
const noexcept
35 template<
typename... Args>
36 [[nodiscard]]
constexpr value_type
const &undo(Args &&...args)
noexcept
42 push(value_type{std::forward<Args>(args)...});
47 return _stack[--_cursor];
50 [[nodiscard]]
constexpr bool can_redo()
const noexcept
52 return (_cursor + 1) < _stack.size();
55 [[nodiscard]]
constexpr value_type
const &redo()
const noexcept
58 return _stack[++_cursor];
64 mutable size_t _cursor;
65 mutable bool _first_undo =
true;
67 template<forward_of<value_type> Value>
68 constexpr void push(Value &&value)
noexcept
73 if (_stack.
size() > _max_depth) {
77 _stack.
push_back(std::forward<Value>(value));
78 _cursor = _stack.
size();
#define hi_assert(expression,...)
Assert if expression is true.
Definition assert.hpp:199