10#include <nlohmann/json.hpp>
12#include "enum_flags.h"
22 struct cvar_manager_t;
26 cvar_group_t(cvar_group_t&
parent, std::string_view name)
31 cvar_group_t(std::string_view name)
32 : cvar_group_t(global_group(), name)
37 static cvar_group_t& global_group()
noexcept
43 cvar_group_t* resolve_group_path(std::string_view
group_path)
45 throw "unimplemented";
51 friend struct cvar_manager_t;
53 std::vector<cvar_base_t*> m_children_cvars;
54 std::vector<cvar_group_t*> m_children_groups;
67 struct config_source_t
69 friend struct cvar_manager_t;
74 void set(cvar_flags flag)
noexcept { m_flags += flag; }
76 cvar_group_t& group()
const noexcept {
return m_group ? *m_group : resolve_group_path(); }
77 std::string_view name()
const noexcept {
return m_name; }
80 cvar_base_t(cvar_group_t& group, std::string_view name)
87 cvar_base_t(std::string_view
group_path, std::string_view name)
94 virtual nlohmann::json json()
const = 0;
95 virtual void json(nlohmann::json
const& json) = 0;
97 virtual ~cvar_base_t()
noexcept =
default;
101 friend struct cvar_manager_t;
103 std::string
const m_group_path;
104 mutable cvar_group_t* m_group =
nullptr;
105 std::string
const m_name;
108 config_source_t* m_current_source =
nullptr;
110 cvar_group_t& resolve_group_path()
const
112 auto group = cvar_group_t::global_group().resolve_group_path(m_group_path);
114 throw std::invalid_argument(
"group path does not resolve to any defined group");
115 return *(m_group = group);
119 template <
typename T>
120 struct cvar_t : cvar_base_t
122 using cvar_change_callback = std::function<
void(
cvar_t<T>&)>;
124 T
const& default_value()
const noexcept {
return m_default_value; }
126 template <
typename...
ARGS>
127 cvar_t(cvar_group_t& group, std::string_view name, T value,
ARGS&&...
args)
128 : cvar_base_t(group, name)
129 , m_default_value(std::move(value))
131 (this->set(std::forward<ARGS>(
args)), ...);
134 template <
typename...
ARGS>
137 , m_default_value(std::move(value))
139 (this->set(std::forward<ARGS>(
args)), ...);
142 template <
typename CALLBACK>
143 requires std::constructible_from<cvar_change_callback, CALLBACK>
149 explicit operator T
const& ()
const noexcept
151 return m_current_value;
155 virtual nlohmann::json json()
const override
157 return nlohmann::json{ m_current_value };
160 virtual void json(nlohmann::json
const& json)
override
162 m_current_value = json;
167 friend struct cvar_manager_t;
170 T
const m_default_value;
174 struct cvar_manager_t
constexpr auto bit_count
Equal to the number of bits in the type.
A (constexpr) value struct that represents a set of bits mapped to an enum (implemented as a bitset)