#ifndef GUI_ISTATESETTINGS_H #define GUI_ISTATESETTINGS_H #include namespace GUI { template class IStateSettings { public: virtual void saveState(const W* widget) = 0; virtual void restoreState(W* widget) const = 0; }; template class [[nodiscard]] StateSaver final { public: StateSaver(IStateSettings& s, W* w) : m_Settings{s}, m_Widget{w} { m_Settings.restoreState(m_Widget); } StateSaver(const StateSaver&) = delete; StateSaver(StateSaver&&) = delete; ~StateSaver() { m_Settings.saveState(m_Widget); } StateSaver& operator=(const StateSaver&) = delete; StateSaver& operator=(StateSaver&&) = delete; private: IStateSettings& m_Settings; W* m_Widget; }; template > StateSaver(I&, W*) -> StateSaver; } // namespace GUI #endif // GUI_ISTATESETTINGS_H