config.h

changeset 0
c51cce84a9ac
child 29
55406ce7446e
equal deleted inserted replaced
-1:000000000000 0:c51cce84a9ac
1 #ifndef __OPTIONS_H__
2 #define __OPTIONS_H__
3
4 #include "common.h"
5 #include "str.h"
6 #include "color.h"
7
8 // =============================================================================
9 // Determine configuration file. Use APPNAME if given.
10 #ifdef APPNAME
11 #define CONFIGFILE APPNAME ".ini"
12 #else // APPNAME
13 #define APPNAME "(unnamed application)"
14 #define CONFIGFILE "config.ini"
15 #endif // APPNAME
16
17 #ifdef CONFIG_WITH_QT
18 #include <QString>
19 #endif // CONFIG_WITH_QT
20
21 // -------------------------------
22 #define CFGSECTNAME(X) CFGSECT_##X
23
24 #define MAX_INI_LINE 512
25 #define NUM_CONFIG (sizeof config::pointers / sizeof *config::pointers)
26
27 // =============================================================================
28 enum configsection_e {
29 #define CFG(...)
30 #define SECT(A,B) CFGSECTNAME (A),
31 #include "cfgdef.h"
32 #undef CFG
33 #undef SECT
34 NUM_ConfigSections,
35 NO_CONFIG_SECTION = -1
36 };
37
38 // =============================================================================
39 enum configtype_e {
40 CONFIG_none,
41 CONFIG_int,
42 CONFIG_str,
43 CONFIG_float,
44 CONFIG_bool,
45 CONFIG_color,
46 };
47
48 // =========================================================
49 class config {
50 public:
51 configsection_e sect;
52 const char* description, *name, *fullname, *typestring, *defaultstring;
53
54 virtual configtype_e getType () {
55 return CONFIG_none;
56 }
57
58 virtual void resetValue () {}
59
60 // ------------------------------------------
61 static bool load ();
62 static bool save ();
63 static void reset ();
64 static config* pointers[];
65 static const char* sections[];
66 static const char* sectionNames[];
67 static str dirpath ();
68 static str filepath ();
69 };
70
71 // =============================================================================
72 #define DEFINE_UNARY_OPERATOR(T, OP) \
73 T operator OP () { \
74 return (OP value); \
75 } \
76
77 #define DEFINE_BINARY_OPERATOR(T, OP) \
78 T operator OP (const T other) { \
79 return (value OP other); \
80 } \
81
82 #define DEFINE_ASSIGN_OPERATOR(T, OP) \
83 T& operator OP (const T other) { \
84 return (value OP other); \
85 } \
86
87 #define DEFINE_COMPARE_OPERATOR(T, OP) \
88 bool operator OP (const T other) { \
89 return (value OP other); \
90 } \
91
92 #define DEFINE_CAST_OPERATOR(T) \
93 operator T () { \
94 return (T) value; \
95 } \
96
97 #define DEFINE_ALL_COMPARE_OPERATORS(T) \
98 DEFINE_COMPARE_OPERATOR (T, ==) \
99 DEFINE_COMPARE_OPERATOR (T, !=) \
100 DEFINE_COMPARE_OPERATOR (T, >) \
101 DEFINE_COMPARE_OPERATOR (T, <) \
102 DEFINE_COMPARE_OPERATOR (T, >=) \
103 DEFINE_COMPARE_OPERATOR (T, <=) \
104
105 #define DEFINE_INCREMENT_OPERATORS(T) \
106 T operator++ () {return ++value;} \
107 T operator++ (int) {return value++;} \
108 T operator-- () {return --value;} \
109 T operator-- (int) {return value--;}
110
111 #define CONFIGTYPE(T) \
112 class T##config : public config
113
114 #define IMPLEMENT_CONFIG(T) \
115 T value, defval; \
116 \
117 T##config (const configsection_e _sect, const char* _description, \
118 T _defval, const char* _name, const char* _fullname, const char* _typestring, \
119 const char* _defaultstring) \
120 { \
121 sect = _sect; \
122 description = _description; \
123 value = defval = _defval; \
124 name = _name; \
125 fullname = _fullname; \
126 typestring = _typestring; \
127 defaultstring = _defaultstring; \
128 } \
129 operator T () { \
130 return value; \
131 } \
132 configtype_e getType () { \
133 return CONFIG_##T; \
134 } \
135 void resetValue () { \
136 value = defval; \
137 }
138
139 // =============================================================================
140 CONFIGTYPE (int) {
141 public:
142 IMPLEMENT_CONFIG (int)
143
144 // Int-specific operators
145 DEFINE_ALL_COMPARE_OPERATORS (int)
146 DEFINE_INCREMENT_OPERATORS (int)
147 DEFINE_BINARY_OPERATOR (int, +)
148 DEFINE_BINARY_OPERATOR (int, -)
149 DEFINE_BINARY_OPERATOR (int, *)
150 DEFINE_BINARY_OPERATOR (int, /)
151 DEFINE_BINARY_OPERATOR (int, %)
152 DEFINE_BINARY_OPERATOR (int, ^)
153 DEFINE_BINARY_OPERATOR (int, |)
154 DEFINE_BINARY_OPERATOR (int, &)
155 DEFINE_BINARY_OPERATOR (int, >>)
156 DEFINE_BINARY_OPERATOR (int, <<)
157 DEFINE_UNARY_OPERATOR (int, !)
158 DEFINE_UNARY_OPERATOR (int, ~)
159 DEFINE_UNARY_OPERATOR (int, -)
160 DEFINE_UNARY_OPERATOR (int, +)
161 DEFINE_ASSIGN_OPERATOR (int, =)
162 DEFINE_ASSIGN_OPERATOR (int, +=)
163 DEFINE_ASSIGN_OPERATOR (int, -=)
164 DEFINE_ASSIGN_OPERATOR (int, *=)
165 DEFINE_ASSIGN_OPERATOR (int, /=)
166 DEFINE_ASSIGN_OPERATOR (int, %=)
167 DEFINE_ASSIGN_OPERATOR (int, >>=)
168 DEFINE_ASSIGN_OPERATOR (int, <<=)
169 };
170
171 // =============================================================================
172 CONFIGTYPE (str) {
173 public:
174 IMPLEMENT_CONFIG (str)
175
176 DEFINE_ALL_COMPARE_OPERATORS (str)
177 DEFINE_BINARY_OPERATOR (str, -)
178 DEFINE_BINARY_OPERATOR (str, *)
179 DEFINE_UNARY_OPERATOR (str, !)
180 DEFINE_ASSIGN_OPERATOR (str, =)
181 DEFINE_ASSIGN_OPERATOR (str, +=)
182 DEFINE_ASSIGN_OPERATOR (str, -=)
183 DEFINE_ASSIGN_OPERATOR (str, *=)
184 DEFINE_CAST_OPERATOR (char*)
185
186 char operator[] (size_t n) {
187 return value[n];
188 }
189
190 #ifdef CONFIG_WITH_QT
191 operator QString () {
192 return QString (value.chars());
193 }
194 #endif // CONFIG_WITH_QT
195 };
196
197 // =============================================================================
198 CONFIGTYPE (float) {
199 public:
200 IMPLEMENT_CONFIG (float)
201
202 DEFINE_ALL_COMPARE_OPERATORS (float)
203 DEFINE_INCREMENT_OPERATORS (float)
204 DEFINE_BINARY_OPERATOR (float, +)
205 DEFINE_BINARY_OPERATOR (float, -)
206 DEFINE_BINARY_OPERATOR (float, *)
207 DEFINE_UNARY_OPERATOR (float, !)
208 DEFINE_ASSIGN_OPERATOR (float, =)
209 DEFINE_ASSIGN_OPERATOR (float, +=)
210 DEFINE_ASSIGN_OPERATOR (float, -=)
211 DEFINE_ASSIGN_OPERATOR (float, *=)
212 };
213
214 // =============================================================================
215 CONFIGTYPE (bool) {
216 public:
217 IMPLEMENT_CONFIG (bool)
218 DEFINE_ALL_COMPARE_OPERATORS (bool)
219 DEFINE_ASSIGN_OPERATOR (bool, =)
220 };
221
222 // =============================================================================
223 CONFIGTYPE (color) {
224 public:
225 IMPLEMENT_CONFIG (color)
226 // DEFINE_COMPARE_OPERATOR (color, ==)
227 // DEFINE_COMPARE_OPERATOR (color, !=)
228 };
229
230 // =============================================================================
231 // Extern the configurations now
232 #define CFG(TYPE, SECT, NAME, DESCR, DEFAULT) extern TYPE##config SECT##_##NAME;
233 #define SECT(...)
234 #include "cfgdef.h"
235 #undef CFG
236 #undef SECT
237
238 #endif // __OPTIONS_H__

mercurial