Luanti 5.18.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
7#include "irrlichttypes.h"
8#include "irr_v2d.h"
9#include "irr_v3d.h"
10#include "util/basic_macros.h"
11#include <string>
12#include <string_view>
13#include <vector>
14#include <map>
15#include <unordered_map>
16#include <mutex>
17#include <optional>
18#include <utility> // std::move
19
20class Settings;
21struct NoiseParams;
22struct FlagDesc;
23
24// Global objects
25extern Settings *g_settings; // Same as Settings::getLayer(SL_GLOBAL);
26extern std::string g_settings_path;
28extern bool g_first_run;
30extern bool g_disable_mod_security;
31
32// Type for a settings changed callback function
33typedef void (*SettingsChangedCallback)(const std::string &name, void *data);
34
35typedef std::vector<
36 std::pair<
38 void *
39 >
41
42typedef std::unordered_map<std::string, SettingsCallbackList> SettingsCallbackMap;
43
46 VALUETYPE_FLAG // Doesn't take any arguments
47};
48
58
59// Describes the global setting layers, SL_GLOBAL is where settings are read from
66
67// Implements the hierarchy a settings object may be part of
69public:
70 /*
71 * A settings object that may be part of another hierarchy can
72 * occupy the index 0 as a fallback. If not set you can use 0 on your own.
73 */
74 SettingsHierarchy(Settings *fallback = nullptr);
75
77
78 Settings *getLayer(int layer) const;
79
80private:
81 friend class Settings;
82 Settings *getParent(int layer) const;
83 void onLayerCreated(int layer, Settings *obj);
84 void onLayerRemoved(int layer);
85
86 std::vector<Settings*> layers;
87};
88
89struct ValueSpec {
90 ValueSpec(ValueType a_type, const char *a_help=NULL)
91 {
92 type = a_type;
93 help = a_help;
94 }
95
97 const char *help;
98};
99
101 SettingsEntry() = default;
102
103 SettingsEntry(const std::string &value_) :
104 value(value_)
105 {}
106 SettingsEntry(std::string &&value_) :
107 value(std::move(value_))
108 {}
109
111 group(group_), is_group(true)
112 {}
113
114 std::string value;
115 Settings *group = nullptr;
116 bool is_group = false;
117};
118
119typedef std::unordered_map<std::string, SettingsEntry> SettingEntries;
120
121class Settings {
122public:
123 /* These functions operate on the global hierarchy! */
124 static Settings *createLayer(SettingsLayer sl, std::string_view end_tag = "");
125 static Settings *getLayer(SettingsLayer sl);
126 /**/
127
128 Settings(std::string_view end_tag = "") :
129 m_end_tag(end_tag)
130 {}
131 Settings(std::string_view end_tag, SettingsHierarchy *h, int settings_layer);
132 ~Settings();
133
134 Settings & operator=(const Settings &other);
135
136 /***********************
137 * Reading and writing *
138 ***********************/
139
140 // Read configuration file. Returns success.
141 bool readConfigFile(const char *filename);
142 // Updates configuration file. Returns success.
143 bool updateConfigFile(const char *filename);
144 // NOTE: Types of allowed_options are ignored. Returns success.
145 bool parseCommandLine(int argc, char *argv[],
146 const std::map<std::string, ValueSpec> &allowed_options);
147 // Parse configuraton from a stream. 'location' is for error logging.
148 bool parseConfigLines(std::istream &is, std::string_view location = {});
149 void writeLines(std::ostream &os, u32 tab_depth=0) const;
150
151 /***********
152 * Getters *
153 ***********/
154
155 Settings *getGroup(const std::string &name) const;
156 const std::string &get(const std::string &name) const;
157 bool getBool(const std::string &name) const;
158 u16 getU16(const std::string &name) const;
159 s16 getS16(const std::string &name) const;
160 u32 getU32(const std::string &name) const;
161 s32 getS32(const std::string &name) const;
162 u64 getU64(const std::string &name) const;
163 float getFloat(const std::string &name) const;
164 float getFloat(const std::string &name, float min, float max) const;
165 v2f getV2F(const std::string &name) const;
166 std::optional<v3f> getV3F(const std::string &name) const;
167 u32 getFlagStr(const std::string &name, const FlagDesc *flagdesc,
168 u32 *flagmask) const;
169 bool getNoiseParams(const std::string &name, NoiseParams &np) const;
170 bool getNoiseParamsFromValue(const std::string &name, NoiseParams &np) const;
171 bool getNoiseParamsFromGroup(const std::string &name, NoiseParams &np) const;
172
173 // return all keys used in this object
174 std::vector<std::string> getNames() const;
175 // check if setting exists anywhere in the hierarchy
176 bool exists(const std::string &name) const;
177 // check if setting exists in this object ("locally")
178 bool existsLocal(const std::string &name) const;
179
180
181 /***************************************
182 * Getters that don't throw exceptions *
183 ***************************************/
184
185 bool getGroupNoEx(const std::string &name, Settings *&val) const;
186 bool getNoEx(const std::string &name, std::string &val) const;
187 bool getFlag(const std::string &name) const;
188 bool getU16NoEx(const std::string &name, u16 &val) const;
189 bool getS16NoEx(const std::string &name, s16 &val) const;
190 bool getU32NoEx(const std::string &name, u32 &val) const;
191 bool getS32NoEx(const std::string &name, s32 &val) const;
192 bool getU64NoEx(const std::string &name, u64 &val) const;
193 bool getFloatNoEx(const std::string &name, float &val) const;
194 bool getV2FNoEx(const std::string &name, v2f &val) const;
195 bool getV3FNoEx(const std::string &name, std::optional<v3f> &val) const;
196
197 // Like other getters, but handling each flag individualy:
198 // 1) Read default flags (or 0)
199 // 2) Override using user-defined flags
200 bool getFlagStrNoEx(const std::string &name, u32 &val,
201 const FlagDesc *flagdesc) const;
202
203
204 /***********
205 * Setters *
206 ***********/
207
208 // N.B. Groups not allocated with new must be set to NULL in the settings
209 // tree before object destruction.
210 bool setEntry(const std::string &name, const void *entry,
211 bool set_group);
212 bool set(const std::string &name, const std::string &value);
213 bool setDefault(const std::string &name, const std::string &value);
214 bool setGroup(const std::string &name, const Settings &group);
215 bool setBool(const std::string &name, bool value);
216 bool setS16(const std::string &name, s16 value);
217 bool setU16(const std::string &name, u16 value);
218 bool setS32(const std::string &name, s32 value);
219 bool setU64(const std::string &name, u64 value);
220 bool setFloat(const std::string &name, float value);
221 bool setV2F(const std::string &name, v2f value);
222 bool setV3F(const std::string &name, v3f value);
223 bool setFlagStr(const std::string &name, u32 flags,
224 const FlagDesc *flagdesc = nullptr, u32 flagmask = U32_MAX);
225 bool setNoiseParams(const std::string &name, const NoiseParams &np);
226
227 // remove a setting
228 bool remove(const std::string &name);
229
230 /*****************
231 * Miscellaneous *
232 *****************/
233
234 void setDefault(const std::string &name, const FlagDesc *flagdesc, u32 flags);
235 const FlagDesc *getFlagDescFallback(const std::string &name) const;
236
237 void registerChangedCallback(const std::string &name,
238 SettingsChangedCallback cbf, void *userdata = NULL);
239 size_t deregisterAllChangedCallbacks(const void *userdata);
240
242
243 // Returns the settings layer this object is.
244 // If within the global hierarchy you can cast this to enum SettingsLayer
245 inline int getLayer() const { return m_settingslayer; }
246
247private:
248 /***********************
249 * Reading and writing *
250 ***********************/
251
252 SettingsParseEvent parseConfigObject(const std::string &line,
253 std::string &name, std::string &value);
254 bool updateConfigObject(std::istream &is, std::ostream &os,
255 u32 tab_depth=0);
256
257 static bool checkNameValid(std::string_view name);
258 static bool checkValueValid(std::string_view value);
259
262 static std::string getMultiline(std::istream &is, size_t *num_lines=nullptr);
263
264 static void printEntry(std::ostream &os, const std::string &name,
265 const SettingsEntry &entry, u32 tab_depth=0);
266
267 /***********
268 * Getters *
269 ***********/
270 Settings *getParent() const;
271
272 const SettingsEntry &getEntry(const std::string &name) const;
273
274 // Allow TestSettings to run sanity checks using private functions.
275 friend class TestSettings;
276 // For sane mutex locking when iterating
277 friend class LuaSettings;
278
279 void clearNoLock();
280
281 void doCallbacks(const std::string &name) const;
282
285 std::string m_end_tag;
286
287 mutable std::mutex m_callback_mutex;
288
289 // All methods that access m_settings/m_defaults directly should lock this.
290 mutable std::mutex m_mutex;
291
294
295 static std::unordered_map<std::string, const FlagDesc *> s_flags;
296};
#define DISABLE_CLASS_COPY(C)
Definition basic_macros.h:26
Definition settings.h:68
Settings * getParent(int layer) const
Definition settings.cpp:50
SettingsHierarchy(Settings *fallback=nullptr)
Definition settings.cpp:36
std::vector< Settings * > layers
Definition settings.h:86
friend class Settings
Definition settings.h:81
void onLayerCreated(int layer, Settings *obj)
Definition settings.cpp:63
Settings * getLayer(int layer) const
Definition settings.cpp:42
void onLayerRemoved(int layer)
Definition settings.cpp:81
Definition settings.h:121
friend class TestSettings
Definition settings.h:275
v2f getV2F(const std::string &name) const
Definition settings.cpp:565
static bool checkValueValid(std::string_view value)
Definition settings.cpp:160
bool setGroup(const std::string &name, const Settings &group)
Definition settings.cpp:902
SettingsCallbackMap m_callbacks
Definition settings.h:284
std::mutex m_callback_mutex
Definition settings.h:287
bool getFloatNoEx(const std::string &name, float &val) const
Definition settings.cpp:747
bool getFlag(const std::string &name) const
Definition settings.cpp:737
bool getU32NoEx(const std::string &name, u32 &val) const
Definition settings.cpp:779
bool getV3FNoEx(const std::string &name, std::optional< v3f > &val) const
Definition settings.cpp:822
void doCallbacks(const std::string &name) const
Definition settings.cpp:1103
bool setS32(const std::string &name, s32 value)
Definition settings.cpp:930
u64 getU64(const std::string &name) const
Definition settings.cpp:558
static std::unordered_map< std::string, const FlagDesc * > s_flags
Definition settings.h:295
bool getU64NoEx(const std::string &name, u64 &val) const
Definition settings.cpp:800
~Settings()
Definition settings.cpp:114
bool readConfigFile(const char *filename)
Definition settings.cpp:197
bool getS32NoEx(const std::string &name, s32 &val) const
Definition settings.cpp:789
bool setU16(const std::string &name, u16 value)
Definition settings.cpp:924
bool remove(const std::string &name)
Definition settings.cpp:995
int m_settingslayer
Definition settings.h:293
Settings * getGroup(const std::string &name) const
Definition settings.cpp:498
bool getS16NoEx(const std::string &name, s16 &val) const
Definition settings.cpp:769
bool getNoiseParamsFromValue(const std::string &name, NoiseParams &np) const
Definition settings.cpp:621
bool getGroupNoEx(const std::string &name, Settings *&val) const
Definition settings.cpp:715
int getLayer() const
Definition settings.h:245
u32 getU32(const std::string &name) const
Definition settings.cpp:534
bool parseConfigLines(std::istream &is, std::string_view location={})
Definition settings.cpp:207
friend class LuaSettings
Definition settings.h:277
s32 getS32(const std::string &name) const
Definition settings.cpp:539
bool getNoEx(const std::string &name, std::string &val) const
Definition settings.cpp:726
void writeLines(std::ostream &os, u32 tab_depth=0) const
Definition settings.cpp:273
void registerChangedCallback(const std::string &name, SettingsChangedCallback cbf, void *userdata=NULL)
Definition settings.cpp:1065
bool setDefault(const std::string &name, const std::string &value)
Definition settings.cpp:894
std::vector< std::string > getNames() const
Definition settings.cpp:697
const SettingsEntry & getEntry(const std::string &name) const
Definition settings.cpp:481
size_t deregisterAllChangedCallbacks(const void *userdata)
Definition settings.cpp:1072
bool getV2FNoEx(const std::string &name, v2f &val) const
Definition settings.cpp:811
static std::string getMultiline(std::istream &is, size_t *num_lines=nullptr)
consume a multi-line setting from a stream
Definition settings.cpp:171
bool updateConfigFile(const char *filename)
Definition settings.cpp:399
std::optional< v3f > getV3F(const std::string &name) const
Definition settings.cpp:576
const std::string & get(const std::string &name) const
Definition settings.cpp:507
SettingsParseEvent parseConfigObject(const std::string &line, std::string &name, std::string &value)
Definition settings.cpp:1015
bool getFlagStrNoEx(const std::string &name, u32 &val, const FlagDesc *flagdesc) const
Definition settings.cpp:833
bool setBool(const std::string &name, bool value)
Definition settings.cpp:912
float getFloat(const std::string &name) const
Definition settings.cpp:545
Settings * getParent() const
Definition settings.cpp:475
bool set(const std::string &name, const std::string &value)
Definition settings.cpp:883
bool getBool(const std::string &name) const
Definition settings.cpp:516
bool setS16(const std::string &name, s16 value)
Definition settings.cpp:918
Settings(std::string_view end_tag="")
Definition settings.h:128
std::string m_end_tag
Definition settings.h:285
void clearNoLock()
Definition settings.cpp:1043
bool setFloat(const std::string &name, float value)
Definition settings.cpp:944
bool setEntry(const std::string &name, const void *entry, bool set_group)
Definition settings.cpp:855
std::mutex m_mutex
Definition settings.h:290
bool setNoiseParams(const std::string &name, const NoiseParams &np)
Definition settings.cpp:978
static void printEntry(std::ostream &os, const std::string &name, const SettingsEntry &entry, u32 tab_depth=0)
Definition settings.cpp:290
bool exists(const std::string &name) const
Definition settings.cpp:679
Settings & operator=(const Settings &other)
Definition settings.cpp:125
void removeSecureSettings()
Definition settings.cpp:1090
bool getNoiseParams(const std::string &name, NoiseParams &np) const
Definition settings.cpp:610
bool setV3F(const std::string &name, v3f value)
Definition settings.cpp:958
bool existsLocal(const std::string &name) const
Definition settings.cpp:689
u16 getU16(const std::string &name) const
Definition settings.cpp:522
static bool checkNameValid(std::string_view name)
Definition settings.cpp:145
bool setFlagStr(const std::string &name, u32 flags, const FlagDesc *flagdesc=nullptr, u32 flagmask=U32_MAX)
Definition settings.cpp:966
bool setV2F(const std::string &name, v2f value)
Definition settings.cpp:950
bool getU16NoEx(const std::string &name, u16 &val) const
Definition settings.cpp:758
SettingEntries m_settings
Definition settings.h:283
u32 getFlagStr(const std::string &name, const FlagDesc *flagdesc, u32 *flagmask) const
Definition settings.cpp:582
s16 getS16(const std::string &name) const
Definition settings.cpp:528
bool updateConfigObject(std::istream &is, std::ostream &os, u32 tab_depth=0)
Definition settings.cpp:313
SettingsHierarchy * m_hierarchy
Definition settings.h:292
static Settings * createLayer(SettingsLayer sl, std::string_view end_tag="")
Definition settings.cpp:91
bool getNoiseParamsFromGroup(const std::string &name, NoiseParams &np) const
Definition settings.cpp:651
bool setU64(const std::string &name, u64 value)
Definition settings.cpp:936
const FlagDesc * getFlagDescFallback(const std::string &name) const
Definition settings.cpp:1059
bool parseCommandLine(int argc, char *argv[], const std::map< std::string, ValueSpec > &allowed_options)
Definition settings.cpp:419
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:130
Settings * g_settings
Definition settings.cpp:26
bool g_first_run
Is set to true if the engine runs for the first time.
Definition settings.cpp:29
std::string g_settings_path
Definition settings.cpp:28
bool g_disable_mod_security
Set by main.cpp and intentionally kept out of the settings object.
Definition settings.cpp:30
std::vector< std::pair< SettingsChangedCallback, void * > > SettingsCallbackList
Definition settings.h:40
std::unordered_map< std::string, SettingsEntry > SettingEntries
Definition settings.h:119
SettingsLayer
Definition settings.h:60
@ SL_GLOBAL
Definition settings.h:63
@ SL_GAME
Definition settings.h:62
@ SL_DEFAULTS
Definition settings.h:61
@ SL_TOTAL_COUNT
Definition settings.h:64
void(* SettingsChangedCallback)(const std::string &name, void *data)
Definition settings.h:33
SettingsParseEvent
Definition settings.h:49
@ SPE_KVPAIR
Definition settings.h:53
@ SPE_MULTILINE
Definition settings.h:56
@ SPE_GROUP
Definition settings.h:55
@ SPE_INVALID
Definition settings.h:51
@ SPE_COMMENT
Definition settings.h:52
@ SPE_END
Definition settings.h:54
@ SPE_NONE
Definition settings.h:50
std::unordered_map< std::string, SettingsCallbackList > SettingsCallbackMap
Definition settings.h:42
ValueType
Definition settings.h:44
@ VALUETYPE_FLAG
Definition settings.h:46
@ VALUETYPE_STRING
Definition settings.h:45
Definition string.h:71
const char * name
Definition string.h:72
Definition noise.h:119
Definition settings.h:100
std::string value
Definition settings.h:114
SettingsEntry(const std::string &value_)
Definition settings.h:103
bool is_group
Definition settings.h:116
Settings * group
Definition settings.h:115
SettingsEntry(Settings *group_)
Definition settings.h:110
SettingsEntry()=default
SettingsEntry(std::string &&value_)
Definition settings.h:106
const char * help
Definition settings.h:97
ValueSpec(ValueType a_type, const char *a_help=NULL)
Definition settings.h:90
ValueType type
Definition settings.h:96