#pragma once #include #include #include template class History final { public: void push(const T& item); T current() const; void go_back(); void go_forward(); bool can_go_back() { return m_current > 0; } bool can_go_forward() { return m_current + 1 < m_items.size(); } void clear(); private: Vector m_items; int m_current { -1 }; }; template inline void History::push(const T& item) { m_items.shrink(m_current + 1); m_items.append(item); m_current++; } template inline T History::current() const { if (m_current == -1) return {}; return m_items[m_current]; } template inline void History::go_back() { ASSERT(can_go_back()); m_current--; } template inline void History::go_forward() { ASSERT(can_go_forward()); m_current++; } template inline void History::clear() { m_items = {}; m_current = -1; }