Cogs.Core
Variables.h
1#pragma once
2
3#include "Utilities/ValueVariant.h"
4
5#include "Foundation/Reflection/Type.h"
6
7#include <unordered_map>
8
9namespace Cogs::Core
10{
11 class ResourceStore;
12
14 enum class VariableFlags
15 {
16 None = 0,
17 Empty = 1 << 0,
18 Static = 1 << 1
19 };
20
21 ENABLE_ENUM_FLAGS(VariableFlags);
22
26 struct COGSCORE_DLL_API Variable
27 {
29 Variable() = default;
30
37 Variable(StringView name, StringView value) : name(name.to_string())
38 {
39 setValue(value);
40 }
41
49 void operator=(const StringView & value) { setValue(value); }
50
56 Variable & setValue(const StringView & value);
57
58 Variable & setBool(bool value) { this->value = ValueVariant(value); setValid(); return *this; }
59 Variable & setFloat(float value) { this->value = ValueVariant(value); setValid(); return *this; }
60 Variable & setDouble(double value) { this->value = ValueVariant(value); setValid(); return *this; }
61 Variable & setInt(int value) { this->value = ValueVariant(value); setValid(); return *this; }
62 Variable & setVec2(glm::vec2 value) { this->value = ValueVariant(value); setValid(); return *this; }
63 Variable & setVec3(glm::vec3 value) { this->value = ValueVariant(value); setValid(); return *this; }
64 Variable & setVec4(glm::vec4 value) { this->value = ValueVariant(value); setValid(); return *this; }
65
67 const StringView getName() const { return name; }
68 void setName(const StringView & str) { name = str.to_string(); }
69
70 void setStatic() { variableFlags |= VariableFlags::Static; }
71
73 const StringView getValue(StringView defaultValue = "") const { return value.getString(defaultValue); }
74 const char * getCString() const { return getValue().data(); }
75 bool getBool(bool defaultValue = false) const { return value.getBool(defaultValue); }
76 float getFloat(float defaultValue = 0.0f) const { return value.getFloat(defaultValue); }
77 double getDouble(double defaultValue = 0.0) const { return value.getDouble(defaultValue); }
78 int getInt(int defaultValue = 0) const { return value.getInt(defaultValue); }
79 glm::vec2 getVec2(glm::vec2 defaultValue = {}) const { return value.getVec2(defaultValue); }
80 glm::vec3 getVec3(glm::vec3 defaultValue = {}) const { return value.getVec3(defaultValue); }
81 glm::vec4 getVec4(glm::vec4 defaultValue = {}) const { return value.getVec4(defaultValue); }
82
83 bool isEmpty() const { return (variableFlags & VariableFlags::Empty) != VariableFlags::None; }
84 bool isStatic() const { return (variableFlags & VariableFlags::Static) != VariableFlags::None; }
85
86 explicit operator bool() const { return !isEmpty(); }
87
88 ParsedDataType getType() const { return value.getType(); }
89
90 private:
91 void setValid() { variableFlags &= ~VariableFlags::Empty; }
92
93 std::string name;
94 ValueVariant value;
95 std::string stringValue;
96 VariableFlags variableFlags = VariableFlags::Empty;
97 };
98
102 class COGSCORE_DLL_API Variables
103 {
104 public:
105 Variables(const char ** variables, int count);
106
107 void initialize(const ResourceStore & resourceStore);
108
109 Variable * set(const StringView & name, const StringView & value) { return &get(name)->setValue(value); }
110 Variable * set(const StringView & name, const char * value) { return &get(name)->setValue(value); }
111 Variable * set(const StringView & name, int value) { return &get(name)->setInt(value); }
112 Variable * set(const StringView & name, float value) { return &get(name)->setFloat(value); }
113 Variable * set(const StringView & name, double value) { return &get(name)->setDouble(value); }
114 Variable * set(const StringView & name, bool value) { return &get(name)->setBool(value); }
115 Variable * set(const StringView & name, glm::vec2 value) { return &get(name)->setVec2(value); }
116 Variable * set(const StringView & name, glm::vec3 value) { return &get(name)->setVec3(value); }
117 Variable * set(const StringView & name, glm::vec4 value) { return &get(name)->setVec4(value); }
118
120 const Variable * get(const StringView & name) const;
121
123 Variable* getIfExists(const StringView& name);
124
126 Variable * get(const StringView & name);
127
129 bool erase(const StringView & name);
130
132 bool exist(const StringView & name) { return variables.count(name.hash()); }
133
134 const StringView get(const StringView & name, StringView defaultValue) const;
135 const char * get(const StringView & name, const char * defaultValue) const { return get(name, StringView(defaultValue)).data(); }
136 bool get(const StringView & name, bool defaultValue) const { return get(name)->getBool(defaultValue); }
137 float get(const StringView & name, float defaultValue) const { return get(name)->getFloat(defaultValue); }
138 double get(const StringView & name, double defaultValue) const { return get(name)->getDouble(defaultValue); }
139 int get(const StringView & name, int defaultValue) const { return get(name)->getInt(defaultValue); }
140 glm::vec2 get(const StringView & name, glm::vec2 defaultValue) const { return get(name)->getVec2(defaultValue); }
141 glm::vec3 get(const StringView & name, glm::vec3 defaultValue) const { return get(name)->getVec3(defaultValue); }
142 glm::vec4 get(const StringView & name, glm::vec4 defaultValue) const { return get(name)->getVec4(defaultValue); }
143
144 bool getOrAdd(const StringView & name, bool defaultValue)
145 {
146 auto v = get(name);
147
148 if (v->isEmpty()) v->setBool(defaultValue);
149
150 return v->getBool(defaultValue);
151 }
152
153 void getMatchingVariables(std::vector<const Variable*>& vars, const StringView& keyPrefix);
154
155 Variable & operator[](const StringView & key);
156
157 std::unordered_map<size_t, Variable> & getVariables() { return variables; }
158
159 private:
161 std::unordered_map<size_t, Variable> variables;
162
165 };
166}
Provides handling of reading and caching of external resources.
Manages runtime variables for the engine.
Definition: Variables.h:103
std::unordered_map< size_t, Variable > variables
Variable store.
Definition: Variables.h:161
Variable empty
Empty variable, returned on invalid queries.
Definition: Variables.h:164
bool exist(const StringView &name)
Check if a variable exists.
Definition: Variables.h:132
Provides a weakly referenced view over the contents of a string.
Definition: StringView.h:24
constexpr const char * data() const noexcept
Get the sequence of characters referenced by the string view.
Definition: StringView.h:171
std::string to_string() const
String conversion method.
Definition: StringView.cpp:9
constexpr size_t hash() const noexcept
Get the hash code of the string.
Definition: StringView.h:200
Contains the Engine, Renderer, resource managers and other systems needed to run Cogs....
VariableFlags
Variable flags, specifying variable behavior.
Definition: Variables.h:15
Runtime control variable.
Definition: Variables.h:27
const StringView getValue(StringView defaultValue="") const
Get the value string.
Definition: Variables.h:73
Variable()=default
Default constructs a Variable instance. By default holds no value.
void operator=(const StringView &value)
Overloaded assignment operator to allow assigning a variable directly from a string.
Definition: Variables.h:49
Variable(StringView name, StringView value)
Constructs a variable with the given name and value.
Definition: Variables.h:37
const StringView getName() const
Get the name of the variable.
Definition: Variables.h:67