18 constexpr undo_stack(undo_stack
const &)
noexcept =
default;
19 constexpr undo_stack(undo_stack &&)
noexcept =
default;
20 constexpr undo_stack &operator=(undo_stack
const &)
noexcept =
default;
21 constexpr undo_stack &operator=(undo_stack &&)
noexcept =
default;
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
30 [[nodiscard]]
constexpr bool can_undo()
const noexcept
35 template<
typename... Args>
36 [[nodiscard]]
constexpr value_type
const &undo(Args &&...args)
noexcept
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
71 _stack.erase(_stack.begin() + _cursor, _stack.end());
73 if (_stack.size() > _max_depth) {
74 _stack.erase(_stack.begin());
78 _cursor = _stack.size();
#define hi_assert(expression,...)
Assert if expression is true.
Definition assert.hpp:199