diff --git a/src/common/Cvar.h b/src/common/Cvar.h index 9acc5ce1a1..7f95846a11 100644 --- a/src/common/Cvar.h +++ b/src/common/Cvar.h @@ -169,7 +169,8 @@ namespace Cvar { /* * Modified allow to query atomically if the cvar has been modified and the new value. - * (resets the modified flag to false) + * (GetModifiedValue() resets the modified flag to false.) + * The modified flag is set to true on construction (before the cvar has been read the first time). */ template class Modified : public Base { @@ -177,14 +178,13 @@ namespace Cvar { using value_type = typename Base::value_type; template - Modified(std::string name, std::string description, int flags, value_type defaultValue, Args ... args); + Modified(std::string name, std::string description, int flags, value_type defaultValue, Args&& ... args); template - Modified(NoRegisterTag, std::string name, std::string description, int flags, value_type defaultValue, Args ... args); + Modified(NoRegisterTag, std::string name, std::string description, int flags, value_type defaultValue, Args&& ... args); virtual OnValueChangedResult OnValueChanged(Str::StringRef newValue); - //TODO change it when we have optional - bool GetModifiedValue(value_type& value); + Util::optional GetModifiedValue(); private: bool modified; @@ -199,9 +199,9 @@ namespace Cvar { using value_type = typename Base::value_type; template - Range(std::string name, std::string description, int flags, value_type defaultValue, value_type min, value_type max, Args ... args); + Range(std::string name, std::string description, int flags, value_type defaultValue, value_type min, value_type max, Args&& ... args); template - Range(NoRegisterTag, std::string name, std::string description, int flags, value_type defaultValue, value_type min, value_type max, Args ... args); + Range(NoRegisterTag, std::string name, std::string description, int flags, value_type defaultValue, value_type min, value_type max, Args&& ... args); private: virtual OnValueChangedResult Validate(const value_type& value); @@ -348,15 +348,15 @@ namespace Cvar { template template - Modified::Modified(std::string name, std::string description, int flags, value_type defaultValue, Args ... args) - : Base(NoRegisterTag(), std::move(name), std::move(description), flags, std::move(defaultValue), std::forward(args) ...), modified(false) { + Modified::Modified(std::string name, std::string description, int flags, typename Modified::value_type defaultValue, Args&& ... args) + : Base(NoRegisterTag(), std::move(name), std::move(description), flags, std::move(defaultValue), std::forward(args) ...), modified(true) { Cvar::Register(); } template template - Modified::Modified(NoRegisterTag, std::string name, std::string description, int flags, value_type defaultValue, Args ... args) - : Base(NoRegisterTag(), std::move(name), std::move(description), flags, std::move(defaultValue), std::forward(args) ...), modified(false) { + Modified::Modified(NoRegisterTag, std::string name, std::string description, int flags, typename Modified::value_type defaultValue, Args&& ... args) + : Base(NoRegisterTag(), std::move(name), std::move(description), flags, std::move(defaultValue), std::forward(args) ...), modified(true) { } template @@ -370,25 +370,26 @@ namespace Cvar { } template - bool Modified::GetModifiedValue(value_type& value) { - value = this->Get(); - bool res = modified; - modified = false; - return res; + Util::optional::value_type> Modified::GetModifiedValue() { + if (modified) { + modified = false; + return {this->Get()}; + } + return Util::nullopt; } // Range template template - Range::Range(std::string name, std::string description, int flags, value_type defaultValue, value_type min, value_type max, Args ... args) + Range::Range(std::string name, std::string description, int flags, value_type defaultValue, value_type min, value_type max, Args&& ... args) : Base(NoRegisterTag(), std::move(name), std::move(description), flags, std::move(defaultValue), std::forward(args) ...), min(min), max(max) { Cvar::Register(); } template template - Range::Range(NoRegisterTag, std::string name, std::string description, int flags, value_type defaultValue, value_type min, value_type max, Args ... args) + Range::Range(NoRegisterTag, std::string name, std::string description, int flags, value_type defaultValue, value_type min, value_type max, Args&& ... args) : Base(NoRegisterTag(), std::move(name), std::move(description), flags, std::move(defaultValue), std::forward(args) ...), min(min), max(max) { }