Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
hrydgard
GitHub Repository: hrydgard/ppsspp
Path: blob/master/Core/ConfigSettings.h
5673 views
1
#pragma once
2
3
#include <cstdint>
4
#include <unordered_map>
5
6
#include "Core/ConfigValues.h"
7
8
class Path;
9
class Section; // ini file section
10
struct UrlEncoder;
11
12
enum class CfgFlag : u8 {
13
DEFAULT = 0,
14
DONT_SAVE = 1, // normally don't like negative flags, but these are really not many.
15
PER_GAME = 2,
16
REPORT = 4,
17
};
18
ENUM_CLASS_BITOPS(CfgFlag);
19
20
struct ConfigBlock;
21
22
struct ConfigSetting {
23
enum class Type {
24
TYPE_TERMINATOR,
25
TYPE_BOOL,
26
TYPE_INT,
27
TYPE_UINT32,
28
TYPE_UINT64,
29
TYPE_FLOAT,
30
TYPE_STRING,
31
TYPE_STRING_VECTOR,
32
TYPE_TOUCH_POS,
33
TYPE_PATH,
34
TYPE_CUSTOM_BUTTON
35
};
36
union DefaultValue {
37
bool b;
38
int i;
39
uint32_t u;
40
uint64_t lu;
41
float f;
42
const char *s;
43
const char *p; // not sure how much point..
44
const std::vector<std::string_view> *v;
45
ConfigTouchPos touchPos;
46
ConfigCustomButton customButton;
47
};
48
49
typedef bool (*BoolDefaultCallback)();
50
typedef int (*IntDefaultCallback)();
51
typedef uint32_t (*Uint32DefaultCallback)();
52
typedef uint64_t (*Uint64DefaultCallback)();
53
typedef float (*FloatDefaultCallback)();
54
typedef std::string (*StringDefaultCallback)();
55
typedef ConfigTouchPos (*TouchPosDefaultCallback)();
56
typedef Path (*PathDefaultCallback)();
57
typedef ConfigCustomButton (*CustomButtonDefaultCallback)();
58
59
union DefaultCallback {
60
BoolDefaultCallback b;
61
IntDefaultCallback i;
62
Uint32DefaultCallback u;
63
Uint64DefaultCallback lu;
64
FloatDefaultCallback f;
65
StringDefaultCallback s;
66
PathDefaultCallback p;
67
TouchPosDefaultCallback touchPos;
68
CustomButtonDefaultCallback customButton;
69
};
70
71
// The configBlock you pass in here is just to be able to calculate the offset of the setting within the block so it can be
72
// applied to other blocks.
73
ConfigSetting(std::string_view ini, ConfigBlock *configBlock, bool *v, bool def, CfgFlag flags) noexcept
74
: iniKey_(ini), type_(Type::TYPE_BOOL), flags_(flags), offset_((const char *)v - (const char *)configBlock) {
75
defaultCallback_.b = nullptr;
76
default_.b = def;
77
}
78
79
ConfigSetting(std::string_view ini, ConfigBlock *configBlock, bool *v, CfgFlag flags) noexcept
80
: iniKey_(ini), type_(Type::TYPE_BOOL), flags_(flags), offset_((const char *)v - (const char *)configBlock) {
81
defaultCallback_.b = nullptr;
82
default_.b = false; // unused with this constructor
83
}
84
85
ConfigSetting(std::string_view ini, ConfigBlock *configBlock, int *v, int def, CfgFlag flags) noexcept
86
: iniKey_(ini), type_(Type::TYPE_INT), flags_(flags), offset_((const char *)v - (const char *)configBlock) {
87
defaultCallback_.i = nullptr;
88
default_.i = def;
89
}
90
91
ConfigSetting(std::string_view ini, ConfigBlock *configBlock, int *v, CfgFlag flags) noexcept
92
: iniKey_(ini), type_(Type::TYPE_INT), flags_(flags), offset_((const char *)v - (const char *)configBlock) {
93
defaultCallback_.i = nullptr;
94
default_.i = 0; // unused with this constructor
95
}
96
97
ConfigSetting(std::string_view ini, ConfigBlock *configBlock, int *v, int def, std::string (*transTo)(int), int (*transFrom)(const std::string &), CfgFlag flags) noexcept
98
: iniKey_(ini), type_(Type::TYPE_INT), flags_(flags), translateTo_(transTo), translateFrom_(transFrom), offset_((const char *)v - (const char *)configBlock) {
99
defaultCallback_.i = nullptr;
100
default_.i = def;
101
}
102
103
ConfigSetting(std::string_view ini, ConfigBlock *configBlock, uint32_t *v, uint32_t def, CfgFlag flags) noexcept
104
: iniKey_(ini), type_(Type::TYPE_UINT32), flags_(flags), offset_((const char *)v - (const char *)configBlock) {
105
defaultCallback_.u = nullptr;
106
default_.u = def;
107
}
108
109
ConfigSetting(std::string_view ini, ConfigBlock *configBlock, uint64_t *v, uint64_t def, CfgFlag flags) noexcept
110
: iniKey_(ini), type_(Type::TYPE_UINT64), flags_(flags), offset_((const char *)v - (const char *)configBlock) {
111
defaultCallback_.lu = nullptr;
112
default_.lu = def;
113
}
114
115
ConfigSetting(std::string_view ini, ConfigBlock *configBlock, float *v, float def, CfgFlag flags) noexcept
116
: iniKey_(ini), type_(Type::TYPE_FLOAT), flags_(flags), offset_((const char *)v - (const char *)configBlock) {
117
defaultCallback_.f = nullptr;
118
default_.f = def;
119
}
120
121
ConfigSetting(std::string_view ini, ConfigBlock *configBlock, float *v, CfgFlag flags) noexcept
122
: iniKey_(ini), type_(Type::TYPE_FLOAT), flags_(flags), offset_((const char *)v - (const char *)configBlock) {
123
defaultCallback_.f = nullptr;
124
default_.f = 0.0f;
125
}
126
127
ConfigSetting(std::string_view ini, ConfigBlock *configBlock, std::string *v, const char *def, CfgFlag flags) noexcept
128
: iniKey_(ini), type_(Type::TYPE_STRING), flags_(flags), offset_((const char *)v - (const char *)configBlock) {
129
defaultCallback_.s = nullptr;
130
default_.s = def;
131
}
132
133
ConfigSetting(std::string_view ini, ConfigBlock *configBlock, std::vector<std::string> *v, const std::vector<std::string_view> *def, CfgFlag flags) noexcept
134
: iniKey_(ini), type_(Type::TYPE_STRING_VECTOR), flags_(flags), offset_((const char *)v - (const char *)configBlock) {
135
default_.v = def;
136
}
137
138
ConfigSetting(std::string_view ini, ConfigBlock *configBlock, Path *v, const char *def, CfgFlag flags) noexcept
139
: iniKey_(ini), type_(Type::TYPE_PATH), flags_(flags), offset_((const char *)v - (const char *)configBlock) {
140
defaultCallback_.p = nullptr;
141
default_.p = def;
142
}
143
144
ConfigSetting(const char *iniX, const char *iniY, const char *iniScale, const char *iniShow, ConfigBlock *configBlock, ConfigTouchPos *v, ConfigTouchPos def, CfgFlag flags) noexcept
145
: iniKey_(iniX), ini2_(iniY), ini3_(iniScale), ini4_(iniShow), type_(Type::TYPE_TOUCH_POS), flags_(flags), offset_((const char *)v - (const char *)configBlock) {
146
defaultCallback_.touchPos = nullptr;
147
default_.touchPos = def;
148
}
149
150
ConfigSetting(const char *iniKey, const char *iniImage, const char *iniShape, const char *iniToggle, const char *iniRepeat, ConfigBlock *configBlock, ConfigCustomButton *v, ConfigCustomButton def, CfgFlag flags) noexcept
151
: iniKey_(iniKey), ini2_(iniImage), ini3_(iniShape), ini4_(iniToggle), ini5_(iniRepeat), type_(Type::TYPE_CUSTOM_BUTTON), flags_(flags), offset_((const char *)v - (const char *)configBlock) {
152
defaultCallback_.customButton = nullptr;
153
default_.customButton = def;
154
}
155
156
ConfigSetting(std::string_view ini, ConfigBlock *configBlock, bool *v, BoolDefaultCallback def, CfgFlag flags) noexcept
157
: iniKey_(ini), type_(Type::TYPE_BOOL), flags_(flags), offset_((const char *)v - (const char *)configBlock) {
158
defaultCallback_.b = def;
159
}
160
161
ConfigSetting(std::string_view ini, ConfigBlock *configBlock, int *v, IntDefaultCallback def, CfgFlag flags) noexcept
162
: iniKey_(ini), type_(Type::TYPE_INT), flags_(flags), offset_((const char *)v - (const char *)configBlock) {
163
defaultCallback_.i = def;
164
}
165
166
ConfigSetting(std::string_view ini, ConfigBlock *configBlock, int *v, IntDefaultCallback def, std::string(*transTo)(int), int(*transFrom)(const std::string &), CfgFlag flags) noexcept
167
: iniKey_(ini), type_(Type::TYPE_INT), flags_(flags), offset_((const char *)v - (const char *)configBlock), translateTo_(transTo), translateFrom_(transFrom) {
168
defaultCallback_.i = def;
169
}
170
171
ConfigSetting(std::string_view ini, ConfigBlock *configBlock, uint32_t *v, Uint32DefaultCallback def, CfgFlag flags) noexcept
172
: iniKey_(ini), type_(Type::TYPE_UINT32), flags_(flags), offset_((const char *)v - (const char *)configBlock) {
173
defaultCallback_.u = def;
174
}
175
176
ConfigSetting(std::string_view ini, ConfigBlock *configBlock, float *v, FloatDefaultCallback def, CfgFlag flags) noexcept
177
: iniKey_(ini), type_(Type::TYPE_FLOAT), flags_(flags), offset_((const char *)v - (const char *)configBlock) {
178
defaultCallback_.f = def;
179
}
180
181
ConfigSetting(std::string_view ini, ConfigBlock *configBlock, std::string *v, StringDefaultCallback def, CfgFlag flags) noexcept
182
: iniKey_(ini), type_(Type::TYPE_STRING), flags_(flags), offset_((const char *)v - (const char *)configBlock) {
183
defaultCallback_.s = def;
184
}
185
186
ConfigSetting(std::string_view iniX, const char *iniY, const char *iniScale, const char *iniShow, ConfigBlock *configBlock, ConfigTouchPos *v, TouchPosDefaultCallback def, CfgFlag flags) noexcept
187
: iniKey_(iniX), ini2_(iniY), ini3_(iniScale), ini4_(iniShow), type_(Type::TYPE_TOUCH_POS), flags_(flags), offset_((const char *)v - (const char *)configBlock) {
188
defaultCallback_.touchPos = def;
189
}
190
191
bool ReadFromIniSection(ConfigBlock *configBlock, const Section *section, bool applyDefaultIfMissing) const;
192
193
void CopyFromBlock(const ConfigBlock *other);
194
195
// Yes, this can be const because what's modified is not the ConfigSetting struct, but the value which is stored elsewhere.
196
// Should actually be called WriteToIni or something.
197
void WriteToIniSection(const ConfigBlock *configBlock, Section *section) const;
198
199
// If log is true, logs if the setting changed.
200
bool RestoreToDefault(ConfigBlock *configBlock, bool log) const;
201
202
void ReportSetting(const ConfigBlock *configBlock, UrlEncoder &data, const std::string &prefix) const;
203
204
// Easy flag accessors.
205
CfgFlag Flags() const { return flags_; }
206
bool PerGame() const { return flags_ & CfgFlag::PER_GAME; }
207
bool SaveSetting() const { return !(flags_ & CfgFlag::DONT_SAVE); }
208
bool Report() const { return flags_ & CfgFlag::REPORT; }
209
210
int GetDefaultInt() const {
211
_dbg_assert_(type_ == Type::TYPE_INT);
212
return defaultCallback_.i ? defaultCallback_.i() : default_.i;
213
}
214
215
std::string_view IniKey() const {
216
return iniKey_;
217
}
218
219
const char *ini2_ = nullptr;
220
const char *ini3_ = nullptr;
221
const char *ini4_ = nullptr;
222
const char *ini5_ = nullptr;
223
224
const Type type_;
225
226
// Returns false if per-game settings are not currently used
227
static bool PerGame(void *ptr);
228
229
const void *GetVoidPtr(ConfigBlock *configBlock) const {
230
char *configBlockBase = (char *)configBlock;
231
return (const void *)(configBlockBase + offset_);
232
}
233
234
private:
235
std::string_view iniKey_;
236
CfgFlag flags_;
237
DefaultValue default_{};
238
DefaultCallback defaultCallback_{};
239
u32 offset_;
240
241
// We only support transform for ints.
242
std::string (*translateTo_)(int) = nullptr;
243
int (*translateFrom_)(const std::string &) = nullptr;
244
};
245
246