Luanti 5.15.0-dev
 
Loading...
Searching...
No Matches
settings.h
Go to the documentation of this file.
1// Luanti
2// SPDX-License-Identifier: LGPL-2.1-or-later
3// Copyright (C) 2010-2013 celeron55, Perttu Ahola <celeron55@gmail.com>
4
5#pragma once
6
8#include "util/string.h"
9#include "util/basic_macros.h"
10#include <string>
11#include <map>
12#include <mutex>
13
14class Settings;
15struct NoiseParams;
16
17// Global objects
18extern Settings *g_settings; // Same as Settings::getLayer(SL_GLOBAL);
19extern std::string g_settings_path;
21extern bool g_first_run;
22
23// Type for a settings changed callback function
24typedef void (*SettingsChangedCallback)(const std::string &name, void *data);
25
26typedef std::vector<
27 std::pair<
29 void *
30 >
32
33typedef std::unordered_map<std::string, SettingsCallbackList> SettingsCallbackMap;
34
37 VALUETYPE_FLAG // Doesn't take any arguments
38};
39
49
50// Describes the global setting layers, SL_GLOBAL is where settings are read from
57
58// Implements the hierarchy a settings object may be part of
60public:
61 /*
62 * A settings object that may be part of another hierarchy can
63 * occupy the index 0 as a fallback. If not set you can use 0 on your own.
64 */
65 SettingsHierarchy(Settings *fallback = nullptr);
66
68
69 Settings *getLayer(int layer) const;
70
71private:
72 friend class Settings;
73 Settings *getParent(int layer) const;
74 void onLayerCreated(int layer, Settings *obj);
75 void onLayerRemoved(int layer);
76
77 std::vector<Settings*> layers;
78};
79
80struct ValueSpec {
81 ValueSpec(ValueType a_type, const char *a_help=NULL)
82 {
83 type = a_type;
84 help = a_help;
85 }
86
88 const char *help;
89};
90
92 SettingsEntry() = default;
93
94 SettingsEntry(const std::string &value_) :
95 value(value_)
96 {}
97
99 group(group_),
100 is_group(true)
101 {}
102
103 std::string value = "";
104 Settings *group = nullptr;
105 bool is_group = false;
106};
107
108typedef std::unordered_map<std::string, SettingsEntry> SettingEntries;
109
110class Settings {
111public:
112 /* These functions operate on the global hierarchy! */
113 static Settings *createLayer(SettingsLayer sl, std::string_view end_tag = "");
114 static Settings *getLayer(SettingsLayer sl);
115
116
117 Settings(std::string_view end_tag = "") :
118 m_end_tag(end_tag)
119 {}
120 Settings(std::string_view end_tag, SettingsHierarchy *h, int settings_layer);
121 ~Settings();
122
123 Settings & operator=(const Settings &other);
124
125 /***********************
126 * Reading and writing *
127 ***********************/
128
129 // Read configuration file. Returns success.
130 bool readConfigFile(const char *filename);
131 //Updates configuration file. Returns success.
132 bool updateConfigFile(const char *filename);
133 // NOTE: Types of allowed_options are ignored. Returns success.
134 bool parseCommandLine(int argc, char *argv[],
135 const std::map<std::string, ValueSpec> &allowed_options);
136 bool parseConfigLines(std::istream &is);
137 void writeLines(std::ostream &os, u32 tab_depth=0) const;
138
139 /***********
140 * Getters *
141 ***********/
142
143 Settings *getGroup(const std::string &name) const;
144 const std::string &get(const std::string &name) const;
145 bool getBool(const std::string &name) const;
146 u16 getU16(const std::string &name) const;
147 s16 getS16(const std::string &name) const;
148 u32 getU32(const std::string &name) const;
149 s32 getS32(const std::string &name) const;
150 u64 getU64(const std::string &name) const;
151 float getFloat(const std::string &name) const;
152 float getFloat(const std::string &name, float min, float max) const;
153 v2f getV2F(const std::string &name) const;
154 std::optional<v3f> getV3F(const std::string &name) const;
155 u32 getFlagStr(const std::string &name, const FlagDesc *flagdesc,
156 u32 *flagmask) const;
157 bool getNoiseParams(const std::string &name, NoiseParams &np) const;
158 bool getNoiseParamsFromValue(const std::string &name, NoiseParams &np) const;
159 bool getNoiseParamsFromGroup(const std::string &name, NoiseParams &np) const;
160
161 // return all keys used in this object
162 std::vector<std::string> getNames() const;
163 // check if setting exists anywhere in the hierarchy
164 bool exists(const std::string &name) const;
165 // check if setting exists in this object ("locally")
166 bool existsLocal(const std::string &name) const;
167
168
169 /***************************************
170 * Getters that don't throw exceptions *
171 ***************************************/
172
173 bool getGroupNoEx(const std::string &name, Settings *&val) const;
174 bool getNoEx(const std::string &name, std::string &val) const;
175 bool getFlag(const std::string &name) const;
176 bool getU16NoEx(const std::string &name, u16 &val) const;
177 bool getS16NoEx(const std::string &name, s16 &val) const;
178 bool getU32NoEx(const std::string &name, u32 &val) const;
179 bool getS32NoEx(const std::string &name, s32 &val) const;
180 bool getU64NoEx(const std::string &name, u64 &val) const;
181 bool getFloatNoEx(const std::string &name, float &val) const;
182 bool getV2FNoEx(const std::string &name, v2f &val) const;
183 bool getV3FNoEx(const std::string &name, std::optional<v3f> &val) const;
184
185 // Like other getters, but handling each flag individualy:
186 // 1) Read default flags (or 0)
187 // 2) Override using user-defined flags
188 bool getFlagStrNoEx(const std::string &name, u32 &val,
189 const FlagDesc *flagdesc) const;
190
191
192 /***********
193 * Setters *
194 ***********/
195
196 // N.B. Groups not allocated with new must be set to NULL in the settings
197 // tree before object destruction.
198 bool setEntry(const std::string &name, const void *entry,
199 bool set_group);
200 bool set(const std::string &name, const std::string &value);
201 bool setDefault(const std::string &name, const std::string &value);
202 bool setGroup(const std::string &name, const Settings &group);
203 bool setBool(const std::string &name, bool value);
204 bool setS16(const std::string &name, s16 value);
205 bool setU16(const std::string &name, u16 value);
206 bool setS32(const std::string &name, s32 value);
207 bool setU64(const std::string &name, u64 value);
208 bool setFloat(const std::string &name, float value);
209 bool setV2F(const std::string &name, v2f value);
210 bool setV3F(const std::string &name, v3f value);
211 bool setFlagStr(const std::string &name, u32 flags,
212 const FlagDesc *flagdesc = nullptr, u32 flagmask = U32_MAX);
213 bool setNoiseParams(const std::string &name, const NoiseParams &np);
214
215 // remove a setting
216 bool remove(const std::string &name);
217
218 /*****************
219 * Miscellaneous *
220 *****************/
221
222 void setDefault(const std::string &name, const FlagDesc *flagdesc, u32 flags);
223 const FlagDesc *getFlagDescFallback(const std::string &name) const;
224
225 void registerChangedCallback(const std::string &name,
226 SettingsChangedCallback cbf, void *userdata = NULL);
227 size_t deregisterAllChangedCallbacks(const void *userdata);
228
230
231 // Returns the settings layer this object is.
232 // If within the global hierarchy you can cast this to enum SettingsLayer
233 inline int getLayer() const { return m_settingslayer; }
234
235private:
236 /***********************
237 * Reading and writing *
238 ***********************/
239
240 SettingsParseEvent parseConfigObject(const std::string &line,
241 std::string &name, std::string &value);
242 bool updateConfigObject(std::istream &is, std::ostream &os,
243 u32 tab_depth=0);
244
245 static bool checkNameValid(std::string_view name);
246 static bool checkValueValid(std::string_view value);
247 static std::string getMultiline(std::istream &is, size_t *num_lines=NULL);
248 static void printEntry(std::ostream &os, const std::string &name,
249 const SettingsEntry &entry, u32 tab_depth=0);
250
251 /***********
252 * Getters *
253 ***********/
254 Settings *getParent() const;
255
256 const SettingsEntry &getEntry(const std::string &name) const;
257
258 // Allow TestSettings to run sanity checks using private functions.
259 friend class TestSettings;
260 // For sane mutex locking when iterating
261 friend class LuaSettings;
262
263 void clearNoLock();
264
265 void doCallbacks(const std::string &name) const;
266
269 std::string m_end_tag;
270
271 mutable std::mutex m_callback_mutex;
272
273 // All methods that access m_settings/m_defaults directly should lock this.
274 mutable std::mutex m_mutex;
275
278
279 static std::unordered_map<std::string, const FlagDesc *> s_flags;
280};
#define DISABLE_CLASS_COPY(C)
Definition basic_macros.h:26
Definition l_settings.h:13
Definition settings.h:59
Settings * getParent(int layer) const
Definition settings.cpp:45
SettingsHierarchy(Settings *fallback=nullptr)
Definition settings.cpp:31
std::vector< Settings * > layers
Definition settings.h:77
void onLayerCreated(int layer, Settings *obj)
Definition settings.cpp:58
Settings * getLayer(int layer) const
Definition settings.cpp:37
void onLayerRemoved(int layer)
Definition settings.cpp:76
Definition settings.h:110
v2f getV2F(const std::string &name) const
Definition settings.cpp:534
static bool checkValueValid(std::string_view value)
Definition settings.cpp:155
bool setGroup(const std::string &name, const Settings &group)
Definition settings.cpp:871
SettingsCallbackMap m_callbacks
Definition settings.h:268
std::mutex m_callback_mutex
Definition settings.h:271
bool getFloatNoEx(const std::string &name, float &val) const
Definition settings.cpp:716
bool getFlag(const std::string &name) const
Definition settings.cpp:706
bool getU32NoEx(const std::string &name, u32 &val) const
Definition settings.cpp:748
bool getV3FNoEx(const std::string &name, std::optional< v3f > &val) const
Definition settings.cpp:791
void doCallbacks(const std::string &name) const
Definition settings.cpp:1072
bool setS32(const std::string &name, s32 value)
Definition settings.cpp:899
u64 getU64(const std::string &name) const
Definition settings.cpp:527
static std::unordered_map< std::string, const FlagDesc * > s_flags
Definition settings.h:279
bool getU64NoEx(const std::string &name, u64 &val) const
Definition settings.cpp:769
~Settings()
Definition settings.cpp:109
bool readConfigFile(const char *filename)
Definition settings.cpp:192
bool getS32NoEx(const std::string &name, s32 &val) const
Definition settings.cpp:758
bool setU16(const std::string &name, u16 value)
Definition settings.cpp:893
bool remove(const std::string &name)
Definition settings.cpp:964
int m_settingslayer
Definition settings.h:277
Settings * getGroup(const std::string &name) const
Definition settings.cpp:467
bool getS16NoEx(const std::string &name, s16 &val) const
Definition settings.cpp:738
bool getNoiseParamsFromValue(const std::string &name, NoiseParams &np) const
Definition settings.cpp:590
bool getGroupNoEx(const std::string &name, Settings *&val) const
Definition settings.cpp:684
int getLayer() const
Definition settings.h:233
u32 getU32(const std::string &name) const
Definition settings.cpp:503
s32 getS32(const std::string &name) const
Definition settings.cpp:508
bool getNoEx(const std::string &name, std::string &val) const
Definition settings.cpp:695
void writeLines(std::ostream &os, u32 tab_depth=0) const
Definition settings.cpp:242
void registerChangedCallback(const std::string &name, SettingsChangedCallback cbf, void *userdata=NULL)
Definition settings.cpp:1034
bool setDefault(const std::string &name, const std::string &value)
Definition settings.cpp:863
std::vector< std::string > getNames() const
Definition settings.cpp:666
const SettingsEntry & getEntry(const std::string &name) const
Definition settings.cpp:450
size_t deregisterAllChangedCallbacks(const void *userdata)
Definition settings.cpp:1041
bool getV2FNoEx(const std::string &name, v2f &val) const
Definition settings.cpp:780
bool updateConfigFile(const char *filename)
Definition settings.cpp:368
std::optional< v3f > getV3F(const std::string &name) const
Definition settings.cpp:545
const std::string & get(const std::string &name) const
Definition settings.cpp:476
SettingsParseEvent parseConfigObject(const std::string &line, std::string &name, std::string &value)
Definition settings.cpp:984
bool getFlagStrNoEx(const std::string &name, u32 &val, const FlagDesc *flagdesc) const
Definition settings.cpp:802
bool setBool(const std::string &name, bool value)
Definition settings.cpp:881
float getFloat(const std::string &name) const
Definition settings.cpp:514
Settings * getParent() const
Definition settings.cpp:444
bool set(const std::string &name, const std::string &value)
Definition settings.cpp:852
static std::string getMultiline(std::istream &is, size_t *num_lines=NULL)
Definition settings.cpp:166
bool getBool(const std::string &name) const
Definition settings.cpp:485
bool setS16(const std::string &name, s16 value)
Definition settings.cpp:887
Settings(std::string_view end_tag="")
Definition settings.h:117
bool parseConfigLines(std::istream &is)
Definition settings.cpp:202
std::string m_end_tag
Definition settings.h:269
void clearNoLock()
Definition settings.cpp:1012
bool setFloat(const std::string &name, float value)
Definition settings.cpp:913
bool setEntry(const std::string &name, const void *entry, bool set_group)
Definition settings.cpp:824
std::mutex m_mutex
Definition settings.h:274
bool setNoiseParams(const std::string &name, const NoiseParams &np)
Definition settings.cpp:947
static void printEntry(std::ostream &os, const std::string &name, const SettingsEntry &entry, u32 tab_depth=0)
Definition settings.cpp:259
bool exists(const std::string &name) const
Definition settings.cpp:648
Settings & operator=(const Settings &other)
Definition settings.cpp:120
void removeSecureSettings()
Definition settings.cpp:1059
bool getNoiseParams(const std::string &name, NoiseParams &np) const
Definition settings.cpp:579
bool setV3F(const std::string &name, v3f value)
Definition settings.cpp:927
bool existsLocal(const std::string &name) const
Definition settings.cpp:658
u16 getU16(const std::string &name) const
Definition settings.cpp:491
static bool checkNameValid(std::string_view name)
Definition settings.cpp:140
bool setFlagStr(const std::string &name, u32 flags, const FlagDesc *flagdesc=nullptr, u32 flagmask=U32_MAX)
Definition settings.cpp:935
bool setV2F(const std::string &name, v2f value)
Definition settings.cpp:919
bool getU16NoEx(const std::string &name, u16 &val) const
Definition settings.cpp:727
SettingEntries m_settings
Definition settings.h:267
u32 getFlagStr(const std::string &name, const FlagDesc *flagdesc, u32 *flagmask) const
Definition settings.cpp:551
s16 getS16(const std::string &name) const
Definition settings.cpp:497
bool updateConfigObject(std::istream &is, std::ostream &os, u32 tab_depth=0)
Definition settings.cpp:282
SettingsHierarchy * m_hierarchy
Definition settings.h:276
static Settings * createLayer(SettingsLayer sl, std::string_view end_tag="")
Definition settings.cpp:86
bool getNoiseParamsFromGroup(const std::string &name, NoiseParams &np) const
Definition settings.cpp:620
bool setU64(const std::string &name, u64 value)
Definition settings.cpp:905
const FlagDesc * getFlagDescFallback(const std::string &name) const
Definition settings.cpp:1028
bool parseCommandLine(int argc, char *argv[], const std::map< std::string, ValueSpec > &allowed_options)
Definition settings.cpp:388
Definition test_settings.cpp:12
core::vector2d< f32 > v2f
Definition irr_v2d.h:11
core::vector3df v3f
Definition irr_v3d.h:11
#define U32_MAX
Definition irrlichttypes.h:23
static OptionList allowed_options
Definition main.cpp:126
Settings * g_settings
Definition settings.cpp:22
bool g_first_run
Is set to true if the engine runs for the first time.
Definition settings.cpp:25
std::vector< std::pair< SettingsChangedCallback, void * > > SettingsCallbackList
Definition settings.h:31
std::unordered_map< std::string, SettingsEntry > SettingEntries
Definition settings.h:108
SettingsLayer
Definition settings.h:51
@ SL_GLOBAL
Definition settings.h:54
@ SL_GAME
Definition settings.h:53
@ SL_DEFAULTS
Definition settings.h:52
@ SL_TOTAL_COUNT
Definition settings.h:55
void(* SettingsChangedCallback)(const std::string &name, void *data)
Definition settings.h:24
std::string g_settings_path
Definition settings.cpp:24
SettingsParseEvent
Definition settings.h:40
@ SPE_KVPAIR
Definition settings.h:44
@ SPE_MULTILINE
Definition settings.h:47
@ SPE_GROUP
Definition settings.h:46
@ SPE_INVALID
Definition settings.h:42
@ SPE_COMMENT
Definition settings.h:43
@ SPE_END
Definition settings.h:45
@ SPE_NONE
Definition settings.h:41
std::unordered_map< std::string, SettingsCallbackList > SettingsCallbackMap
Definition settings.h:33
ValueType
Definition settings.h:35
@ VALUETYPE_FLAG
Definition settings.h:37
@ VALUETYPE_STRING
Definition settings.h:36
Definition string.h:68
Definition noise.h:119
Definition settings.h:91
std::string value
Definition settings.h:103
SettingsEntry(const std::string &value_)
Definition settings.h:94
bool is_group
Definition settings.h:105
Settings * group
Definition settings.h:104
SettingsEntry(Settings *group_)
Definition settings.h:98
SettingsEntry()=default
Definition settings.h:80
const char * help
Definition settings.h:88
ValueSpec(ValueType a_type, const char *a_help=NULL)
Definition settings.h:81
ValueType type
Definition settings.h:87