Coding/Cvars
Classes that handle Cvars are defined in daemon/src/common/Cvar.h
.
Contents
Registering Cvars from the sources
Instantiate an object of the correct class with static storage.
Example
static Cvar::Cvar<std::string> some_cvar( "cvar_name", "Cvar description", Cvar::NONE, "default value" ); Log::Debug("The value of the cvar is %s", some_cvar.Get()); // Also possible is *some_cvar instead of Get
Cvar types
Cvar::Cvar
Allows to define cvars that can hold simple values, while it is a template it requires a parser and serializer for the type it should contain.
By default, these types are supported out of the box:
-
Cvar::Cvar<bool>
-
Cvar::Cvar<int>
-
Cvar::Cvar<float>
-
Cvar::Cvar<std::string>
Cvar::Callback
This is a curiously recurring wrapper that allows execution of arbitrary code on cvar changes.
Example
static Cvar::Callback<Cvar::Cvar<std::string>> best( "best", "Who is the best?", Cvar::NONE, "", [](const std::string& name){ Log::Notice("%s is the best", name); } );
Cvar::Callback
This is a curiously recurring wrapper that allows execution of arbitrary code on cvar changes.
Example
static Cvar::Callback<Cvar::Cvar<std::string>> best( "best", "Who is the best?", Cvar::NONE, "", [](const std::string& name){ Log::Notice("%s is the best", name); } );
Cvar::Modified
This is a curiously recurring wrapper that allows querying whether the value has changed.
Cvar::Range
This is a curiously recurring wrapper that limits cvars whose value_type has a meaningful ordering relation to be within the given range.
Example
static Cvar::Range<Cvar::Cvar<int>> percent( "percent", "%", Cvar::NONE, 100, // default 0, // min 100 // max (inclusive) );
Customizing
Creating customized cvar types with special restrictions is pretty straightforward.
Example (Combining existing classes)
static Cvar::Range<Cvar::Callback<Cvar::Cvar<int>>> bottles_of_beer( "bottles_of_beer", "Number of bottles of beer on the wall", Cvar::NONE, 99, 0, 99, [](int n) { Log::Notice("%-2d bottles of beer on the wall, %2d bottles of beer.", n, n); if ( n > 0 ) { Log::Notice("Take one down, pass it around, %3d bottles of beer on the wall...", n-1); bottles_of_beer.Set(n-1); } } );
Example (Custom class)
class HexCvar : public Cvar::Cvar<std::string> { private: ::Cvar::OnValueChangedResult Validate(const value_type& value) override { if ( std::all_of( value.begin(), value.end(), Str::cisxdigit ) ) { return { true, "" }; } return { false, "Must be hex!" }; } }; static HexCvar cvar_hex( "cl_hexString", "Must be hex", Cvar::NONE, "" );