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;
29
30// Type for a settings changed callback function
31typedef void (*SettingsChangedCallback)(const std::string &name, void *data);
32
33typedef std::vector<
34 std::pair<
36 void *
37 >
39
40typedef std::unordered_map<std::string, SettingsCallbackList> SettingsCallbackMap;
41
44 VALUETYPE_FLAG // Doesn't take any arguments
45};
46
56
57// Describes the global setting layers, SL_GLOBAL is where settings are read from
64
65// Implements the hierarchy a settings object may be part of
67public:
68 /*
69 * A settings object that may be part of another hierarchy can
70 * occupy the index 0 as a fallback. If not set you can use 0 on your own.
71 */
72 SettingsHierarchy(Settings *fallback = nullptr);
73
75
76 Settings *getLayer(int layer) const;
77
78private:
79 friend class Settings;
80 Settings *getParent(int layer) const;
81 void onLayerCreated(int layer, Settings *obj);
82 void onLayerRemoved(int layer);
83
84 std::vector<Settings*> layers;
85};
86
87struct ValueSpec {
88 ValueSpec(ValueType a_type, const char *a_help=NULL)
89 {
90 type = a_type;
91 help = a_help;
92 }
93
95 const char *help;
96};
97
99 SettingsEntry() = default;
100
101 SettingsEntry(const std::string &value_) :
102 value(value_)
103 {}
104 SettingsEntry(std::string &&value_) :
105 value(std::move(value_))
106 {}
107
109 group(group_), is_group(true)
110 {}
111
112 std::string value;
113 Settings *group = nullptr;
114 bool is_group = false;
115};
116
117typedef std::unordered_map<std::string, SettingsEntry> SettingEntries;
118
119class Settings {
120public:
121 /* These functions operate on the global hierarchy! */
122 static Settings *createLayer(SettingsLayer sl, std::string_view end_tag = "");
123 static Settings *getLayer(SettingsLayer sl);
124 /**/
125
126 Settings(std::string_view end_tag = "") :
127 m_end_tag(end_tag)
128 {}
129 Settings(std::string_view end_tag, SettingsHierarchy *h, int settings_layer);
130 ~Settings();
131
132 Settings & operator=(const Settings &other);
133
134 /***********************
135 * Reading and writing *
136 ***********************/
137
138 // Read configuration file. Returns success.
139 bool readConfigFile(const char *filename);
140 // Updates configuration file. Returns success.
141 bool updateConfigFile(const char *filename);
142 // NOTE: Types of allowed_options are ignored. Returns success.
143 bool parseCommandLine(int argc, char *argv[],
144 const std::map<std::string, ValueSpec> &allowed_options);
145 // Parse configuraton from a stream. 'location' is for error logging.
146 bool parseConfigLines(std::istream &is, std::string_view location = {});
147 void writeLines(std::ostream &os, u32 tab_depth=0) const;
148
149 /***********
150 * Getters *
151 ***********/
152
153 Settings *getGroup(const std::string &name) const;
154 const std::string &get(const std::string &name) const;
155 bool getBool(const std::string &name) const;
156 u16 getU16(const std::string &name) const;
157 s16 getS16(const std::string &name) const;
158 u32 getU32(const std::string &name) const;
159 s32 getS32(const std::string &name) const;
160 u64 getU64(const std::string &name) const;
161 float getFloat(const std::string &name) const;
162 float getFloat(const std::string &name, float min, float max) const;
163 v2f getV2F(const std::string &name) const;
164 std::optional<v3f> getV3F(const std::string &name) const;
165 u32 getFlagStr(const std::string &name, const FlagDesc *flagdesc,
166 u32 *flagmask) const;
167 bool getNoiseParams(const std::string &name, NoiseParams &np) const;
168 bool getNoiseParamsFromValue(const std::string &name, NoiseParams &np) const;
169 bool getNoiseParamsFromGroup(const std::string &name, NoiseParams &np) const;
170
171 // return all keys used in this object
172 std::vector<std::string> getNames() const;
173 // check if setting exists anywhere in the hierarchy
174 bool exists(const std::string &name) const;
175 // check if setting exists in this object ("locally")
176 bool existsLocal(const std::string &name) const;
177
178
179 /***************************************
180 * Getters that don't throw exceptions *
181 ***************************************/
182
183 bool getGroupNoEx(const std::string &name, Settings *&val) const;
184 bool getNoEx(const std::string &name, std::string &val) const;
185 bool getFlag(const std::string &name) const;
186 bool getU16NoEx(const std::string &name, u16 &val) const;
187 bool getS16NoEx(const std::string &name, s16 &val) const;
188 bool getU32NoEx(const std::string &name, u32 &val) const;
189 bool getS32NoEx(const std::string &name, s32 &val) const;
190 bool getU64NoEx(const std::string &name, u64 &val) const;
191 bool getFloatNoEx(const std::string &name, float &val) const;
192 bool getV2FNoEx(const std::string &name, v2f &val) const;
193 bool getV3FNoEx(const std::string &name, std::optional<v3f> &val) const;
194
195 // Like other getters, but handling each flag individualy:
196 // 1) Read default flags (or 0)
197 // 2) Override using user-defined flags
198 bool getFlagStrNoEx(const std::string &name, u32 &val,
199 const FlagDesc *flagdesc) const;
200
201
202 /***********
203 * Setters *
204 ***********/
205
206 // N.B. Groups not allocated with new must be set to NULL in the settings
207 // tree before object destruction.
208 bool setEntry(const std::string &name, const void *entry,
209 bool set_group);
210 bool set(const std::string &name, const std::string &value);
211 bool setDefault(const std::string &name, const std::string &value);
212 bool setGroup(const std::string &name, const Settings &group);
213 bool setBool(const std::string &name, bool value);
214 bool setS16(const std::string &name, s16 value);
215 bool setU16(const std::string &name, u16 value);
216 bool setS32(const std::string &name, s32 value);
217 bool setU64(const std::string &name, u64 value);
218 bool setFloat(const std::string &name, float value);
219 bool setV2F(const std::string &name, v2f value);
220 bool setV3F(const std::string &name, v3f value);
221 bool setFlagStr(const std::string &name, u32 flags,
222 const FlagDesc *flagdesc = nullptr, u32 flagmask = U32_MAX);
223 bool setNoiseParams(const std::string &name, const NoiseParams &np);
224
225 // remove a setting
226 bool remove(const std::string &name);
227
228 /*****************
229 * Miscellaneous *
230 *****************/
231
232 void setDefault(const std::string &name, const FlagDesc *flagdesc, u32 flags);
233 const FlagDesc *getFlagDescFallback(const std::string &name) const;
234
235 void registerChangedCallback(const std::string &name,
236 SettingsChangedCallback cbf, void *userdata = NULL);
237 size_t deregisterAllChangedCallbacks(const void *userdata);
238
240
241 // Returns the settings layer this object is.
242 // If within the global hierarchy you can cast this to enum SettingsLayer
243 inline int getLayer() const { return m_settingslayer; }
244
245private:
246 /***********************
247 * Reading and writing *
248 ***********************/
249
250 SettingsParseEvent parseConfigObject(const std::string &line,
251 std::string &name, std::string &value);
252 bool updateConfigObject(std::istream &is, std::ostream &os,
253 u32 tab_depth=0);
254
255 static bool checkNameValid(std::string_view name);
256 static bool checkValueValid(std::string_view value);
257
260 static std::string getMultiline(std::istream &is, size_t *num_lines=nullptr);
261
262 static void printEntry(std::ostream &os, const std::string &name,
263 const SettingsEntry &entry, u32 tab_depth=0);
264
265 /***********
266 * Getters *
267 ***********/
268 Settings *getParent() const;
269
270 const SettingsEntry &getEntry(const std::string &name) const;
271
272 // Allow TestSettings to run sanity checks using private functions.
273 friend class TestSettings;
274 // For sane mutex locking when iterating
275 friend class LuaSettings;
276
277 void clearNoLock();
278
279 void doCallbacks(const std::string &name) const;
280
283 std::string m_end_tag;
284
285 mutable std::mutex m_callback_mutex;
286
287 // All methods that access m_settings/m_defaults directly should lock this.
288 mutable std::mutex m_mutex;
289
292
293 static std::unordered_map<std::string, const FlagDesc *> s_flags;
294};
#define DISABLE_CLASS_COPY(C)
Definition basic_macros.h:26
Definition settings.h:66
Settings * getParent(int layer) const
Definition settings.cpp:49
SettingsHierarchy(Settings *fallback=nullptr)
Definition settings.cpp:35
std::vector< Settings * > layers
Definition settings.h:84
friend class Settings
Definition settings.h:79
void onLayerCreated(int layer, Settings *obj)
Definition settings.cpp:62
Settings * getLayer(int layer) const
Definition settings.cpp:41
void onLayerRemoved(int layer)
Definition settings.cpp:80
Definition settings.h:119
friend class TestSettings
Definition settings.h:273
v2f getV2F(const std::string &name) const
Definition settings.cpp:564
static bool checkValueValid(std::string_view value)
Definition settings.cpp:159
bool setGroup(const std::string &name, const Settings &group)
Definition settings.cpp:901
SettingsCallbackMap m_callbacks
Definition settings.h:282
std::mutex m_callback_mutex
Definition settings.h:285
bool getFloatNoEx(const std::string &name, float &val) const
Definition settings.cpp:746
bool getFlag(const std::string &name) const
Definition settings.cpp:736
bool getU32NoEx(const std::string &name, u32 &val) const
Definition settings.cpp:778
bool getV3FNoEx(const std::string &name, std::optional< v3f > &val) const
Definition settings.cpp:821
void doCallbacks(const std::string &name) const
Definition settings.cpp:1102
bool setS32(const std::string &name, s32 value)
Definition settings.cpp:929
u64 getU64(const std::string &name) const
Definition settings.cpp:557
static std::unordered_map< std::string, const FlagDesc * > s_flags
Definition settings.h:293
bool getU64NoEx(const std::string &name, u64 &val) const
Definition settings.cpp:799
~Settings()
Definition settings.cpp:113
bool readConfigFile(const char *filename)
Definition settings.cpp:196
bool getS32NoEx(const std::string &name, s32 &val) const
Definition settings.cpp:788
bool setU16(const std::string &name, u16 value)
Definition settings.cpp:923
bool remove(const std::string &name)
Definition settings.cpp:994
int m_settingslayer
Definition settings.h:291
Settings * getGroup(const std::string &name) const
Definition settings.cpp:497
bool getS16NoEx(const std::string &name, s16 &val) const
Definition settings.cpp:768
bool getNoiseParamsFromValue(const std::string &name, NoiseParams &np) const
Definition settings.cpp:620
bool getGroupNoEx(const std::string &name, Settings *&val) const
Definition settings.cpp:714
int getLayer() const
Definition settings.h:243
u32 getU32(const std::string &name) const
Definition settings.cpp:533
bool parseConfigLines(std::istream &is, std::string_view location={})
Definition settings.cpp:206
friend class LuaSettings
Definition settings.h:275
s32 getS32(const std::string &name) const
Definition settings.cpp:538
bool getNoEx(const std::string &name, std::string &val) const
Definition settings.cpp:725
void writeLines(std::ostream &os, u32 tab_depth=0) const
Definition settings.cpp:272
void registerChangedCallback(const std::string &name, SettingsChangedCallback cbf, void *userdata=NULL)
Definition settings.cpp:1064
bool setDefault(const std::string &name, const std::string &value)
Definition settings.cpp:893
std::vector< std::string > getNames() const
Definition settings.cpp:696
const SettingsEntry & getEntry(const std::string &name) const
Definition settings.cpp:480
size_t deregisterAllChangedCallbacks(const void *userdata)
Definition settings.cpp:1071
bool getV2FNoEx(const std::string &name, v2f &val) const
Definition settings.cpp:810
static std::string getMultiline(std::istream &is, size_t *num_lines=nullptr)
consume a multi-line setting from a stream
Definition settings.cpp:170
bool updateConfigFile(const char *filename)
Definition settings.cpp:398
std::optional< v3f > getV3F(const std::string &name) const
Definition settings.cpp:575
const std::string & get(const std::string &name) const
Definition settings.cpp:506
SettingsParseEvent parseConfigObject(const std::string &line, std::string &name, std::string &value)
Definition settings.cpp:1014
bool getFlagStrNoEx(const std::string &name, u32 &val, const FlagDesc *flagdesc) const
Definition settings.cpp:832
bool setBool(const std::string &name, bool value)
Definition settings.cpp:911
float getFloat(const std::string &name) const
Definition settings.cpp:544
Settings * getParent() const
Definition settings.cpp:474
bool set(const std::string &name, const std::string &value)
Definition settings.cpp:882
bool getBool(const std::string &name) const
Definition settings.cpp:515
bool setS16(const std::string &name, s16 value)
Definition settings.cpp:917
Settings(std::string_view end_tag="")
Definition settings.h:126
std::string m_end_tag
Definition settings.h:283
void clearNoLock()
Definition settings.cpp:1042
bool setFloat(const std::string &name, float value)
Definition settings.cpp:943
bool setEntry(const std::string &name, const void *entry, bool set_group)
Definition settings.cpp:854
std::mutex m_mutex
Definition settings.h:288
bool setNoiseParams(const std::string &name, const NoiseParams &np)
Definition settings.cpp:977
static void printEntry(std::ostream &os, const std::string &name, const SettingsEntry &entry, u32 tab_depth=0)
Definition settings.cpp:289
bool exists(const std::string &name) const
Definition settings.cpp:678
Settings & operator=(const Settings &other)
Definition settings.cpp:124
void removeSecureSettings()
Definition settings.cpp:1089
bool getNoiseParams(const std::string &name, NoiseParams &np) const
Definition settings.cpp:609
bool setV3F(const std::string &name, v3f value)
Definition settings.cpp:957
bool existsLocal(const std::string &name) const
Definition settings.cpp:688
u16 getU16(const std::string &name) const
Definition settings.cpp:521
static bool checkNameValid(std::string_view name)
Definition settings.cpp:144
bool setFlagStr(const std::string &name, u32 flags, const FlagDesc *flagdesc=nullptr, u32 flagmask=U32_MAX)
Definition settings.cpp:965
bool setV2F(const std::string &name, v2f value)
Definition settings.cpp:949
bool getU16NoEx(const std::string &name, u16 &val) const
Definition settings.cpp:757
SettingEntries m_settings
Definition settings.h:281
u32 getFlagStr(const std::string &name, const FlagDesc *flagdesc, u32 *flagmask) const
Definition settings.cpp:581
s16 getS16(const std::string &name) const
Definition settings.cpp:527
bool updateConfigObject(std::istream &is, std::ostream &os, u32 tab_depth=0)
Definition settings.cpp:312
SettingsHierarchy * m_hierarchy
Definition settings.h:290
static Settings * createLayer(SettingsLayer sl, std::string_view end_tag="")
Definition settings.cpp:90
bool getNoiseParamsFromGroup(const std::string &name, NoiseParams &np) const
Definition settings.cpp:650
bool setU64(const std::string &name, u64 value)
Definition settings.cpp:935
const FlagDesc * getFlagDescFallback(const std::string &name) const
Definition settings.cpp:1058
bool parseCommandLine(int argc, char *argv[], const std::map< std::string, ValueSpec > &allowed_options)
Definition settings.cpp:418
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
std::vector< std::pair< SettingsChangedCallback, void * > > SettingsCallbackList
Definition settings.h:38
std::unordered_map< std::string, SettingsEntry > SettingEntries
Definition settings.h:117
SettingsLayer
Definition settings.h:58
@ SL_GLOBAL
Definition settings.h:61
@ SL_GAME
Definition settings.h:60
@ SL_DEFAULTS
Definition settings.h:59
@ SL_TOTAL_COUNT
Definition settings.h:62
void(* SettingsChangedCallback)(const std::string &name, void *data)
Definition settings.h:31
SettingsParseEvent
Definition settings.h:47
@ SPE_KVPAIR
Definition settings.h:51
@ SPE_MULTILINE
Definition settings.h:54
@ SPE_GROUP
Definition settings.h:53
@ SPE_INVALID
Definition settings.h:49
@ SPE_COMMENT
Definition settings.h:50
@ SPE_END
Definition settings.h:52
@ SPE_NONE
Definition settings.h:48
std::unordered_map< std::string, SettingsCallbackList > SettingsCallbackMap
Definition settings.h:40
ValueType
Definition settings.h:42
@ VALUETYPE_FLAG
Definition settings.h:44
@ VALUETYPE_STRING
Definition settings.h:43
Definition string.h:71
const char * name
Definition string.h:72
Definition noise.h:119
Definition settings.h:98
std::string value
Definition settings.h:112
SettingsEntry(const std::string &value_)
Definition settings.h:101
bool is_group
Definition settings.h:114
Settings * group
Definition settings.h:113
SettingsEntry(Settings *group_)
Definition settings.h:108
SettingsEntry()=default
SettingsEntry(std::string &&value_)
Definition settings.h:104
const char * help
Definition settings.h:95
ValueSpec(ValueType a_type, const char *a_help=NULL)
Definition settings.h:88
ValueType type
Definition settings.h:94