1 #ifndef SETTING_H_62B23520_7C8E_11DE_8A39_0800200C9A66
2 #define SETTING_H_62B23520_7C8E_11DE_8A39_0800200C9A66
4 #if defined(_MSC_VER) || \
5 (defined(__GNUC__) && (__GNUC__ == 3 && __GNUC_MINOR__ >= 4) || \
6 (__GNUC__ >= 4)) // GCC supports "pragma once" correctly since 3.4
12 #include "yaml-cpp/noncopyable.h"
15 class SettingChangeBase;
20 Setting() : m_value() {}
22 const T get() const { return m_value; }
23 std::unique_ptr<SettingChangeBase> set(const T& value);
24 void restore(const Setting<T>& oldSetting) { m_value = oldSetting.get(); }
30 class SettingChangeBase {
32 virtual ~SettingChangeBase() {}
33 virtual void pop() = 0;
37 class SettingChange : public SettingChangeBase {
39 SettingChange(Setting<T>* pSetting) : m_pCurSetting(pSetting) {
40 // copy old setting to save its state
41 m_oldSetting = *pSetting;
44 virtual void pop() { m_pCurSetting->restore(m_oldSetting); }
47 Setting<T>* m_pCurSetting;
48 Setting<T> m_oldSetting;
52 inline std::unique_ptr<SettingChangeBase> Setting<T>::set(const T& value) {
53 std::unique_ptr<SettingChangeBase> pChange(new SettingChange<T>(this));
58 class SettingChanges : private noncopyable {
61 ~SettingChanges() { clear(); }
65 m_settingChanges.clear();
69 for (setting_changes::const_iterator it = m_settingChanges.begin();
70 it != m_settingChanges.end(); ++it)
74 void push(std::unique_ptr<SettingChangeBase> pSettingChange) {
75 m_settingChanges.push_back(std::move(pSettingChange));
78 // like std::unique_ptr - assignment is transfer of ownership
79 SettingChanges& operator=(SettingChanges&& rhs) {
84 std::swap(m_settingChanges, rhs.m_settingChanges);
90 typedef std::vector<std::unique_ptr<SettingChangeBase>> setting_changes;
91 setting_changes m_settingChanges;
95 #endif // SETTING_H_62B23520_7C8E_11DE_8A39_0800200C9A66