acme
Foundational cross-platform layer of the ca2 framework
Toggle main menu visibility
Loading...
Searching...
No Matches
flags.h
1
#pragma once
2
3
4
5
6
8
9
10
template
<
class
ENUM >
11
class
flags :
12
virtual
public
::particle
13
{
14
public
:
15
16
17
i64_array_base m_ia;
18
19
20
flags();
21
flags(ENUM eenum);
22
flags(const ::std::initializer_list < ENUM >& evaluelist);
23
flags(
const
flags & f);
24
~flags()
override
;
25
26
27
bool
add(ENUM eenum);
28
bool
erase(ENUM eenum);
29
bool
has(ENUM eenum)
const
;
30
bool
set(ENUM eenum,
bool
bSet);
31
::i32 add(flags < ENUM > & f);
32
bool
clear();
33
bool
toggle(ENUM eenum);
34
35
36
flags operator & (ENUM eenum)
const
37
{
38
if
(has(eenum))
39
{
40
return
flags(eenum);
41
}
42
else
43
{
44
return
flags();
45
}
46
}
47
48
49
flags operator | (ENUM eenum)
const
50
{
51
flags flags(*
this
);
52
flags.add(eenum);
53
return
flags;
54
}
55
flags < ENUM > & operator = (
const
flags < ENUM > & f);
56
bool
operator == (
const
flags < ENUM > & f);
57
bool
operator != (
const
flags < ENUM > & f);
58
bool
operator == (
const
ENUM e) { return ::is_set(
this
) && m_ia.get_size() == 1 && (ENUM) m_ia.element_at(0) == e; }
59
60
flags < ENUM > & operator |= (ENUM eenum)
61
{
62
add(eenum);
63
return
*
this
;
64
}
65
flags < ENUM > & operator -= (ENUM eenum)
66
{
67
erase(eenum);
68
return
*
this
;
69
}
70
flags < ENUM > & operator |= (
const
flags < ENUM > & f)
71
{
72
if
(
this
!= &f)
73
{
74
add(f);
75
}
76
return
*
this
;
77
}
78
79
operator
bool()
80
{
81
return ::is_set(
this
) && m_ia.has_elements();
82
}
83
84
85
//void io(::stream & stream)
86
//{
87
88
// __io_array(stream, m_ia);
89
90
//}
91
92
93
};
94
95
96
template
<
class
ENUM >
97
flags < ENUM >
::flags
()
98
{
99
}
100
101
template
<
class
ENUM >
102
flags < ENUM >
::flags
(ENUM eenum)
103
{
104
add(eenum);
105
}
106
107
template
<
class
ENUM >
108
flags < ENUM >
::flags
(const ::std::initializer_list < ENUM >& evaluelist)
109
{
110
111
for
(
auto
& evalue : evaluelist)
112
{
113
114
add(evalue);
115
116
}
117
118
}
119
120
template
<
class
ENUM >
121
flags < ENUM >
::flags
(
const
flags < ENUM > & f)
122
{
123
operator = (f);
124
}
125
126
template
<
class
ENUM >
127
flags < ENUM > ::~flags()
128
{
129
}
130
131
template
<
class
ENUM >
132
bool
flags < ENUM > ::add(ENUM eenum)
133
{
134
return
m_ia.add_unique((::i64)eenum);
135
}
136
137
138
template
<
class
ENUM >
139
bool
flags < ENUM > ::erase(ENUM eenum)
140
{
141
return
m_ia.erase((::i64)eenum);
142
}
143
144
145
template
<
class
ENUM >
146
bool
flags < ENUM > ::has(ENUM eenum)
const
147
{
148
return ::is_set(
this
) && m_ia.has((::i64)eenum);
149
}
150
151
152
template
<
class
ENUM >
153
bool
flags < ENUM > ::set(ENUM eenum,
bool
bSet)
154
{
155
if
(bSet)
156
{
157
return
add(eenum);
158
}
159
else
160
{
161
return
erase(eenum);
162
}
163
}
164
165
template
<
class
ENUM >
166
::i32 flags < ENUM > ::add(flags < ENUM > & f)
167
{
168
::i32 iCount = 0;
169
for
(::i32 i = 0; i < f.m_ia.get_size(); i++)
170
{
171
if
(add((ENUM)f.m_ia[i]))
172
iCount++;
173
}
174
return
iCount;
175
}
176
177
template
<
class
ENUM >
178
bool
flags < ENUM > ::toggle(ENUM eenum)
179
{
180
ASSERT(((::i32)eenum) < 128);
181
if
(has(eenum))
182
{
183
return
erase(eenum);
184
}
185
else
186
{
187
return
add(eenum);
188
}
189
}
190
191
template
<
class
ENUM >
192
bool
flags < ENUM > ::clear()
193
{
194
m_ia.erase_all();
195
return
true
;
196
}
197
198
template
<
class
ENUM >
199
flags < ENUM > & flags < ENUM > ::operator = (
const
flags < ENUM > & f)
200
{
201
m_ia.copy(f.m_ia);
202
return
*
this
;
203
}
204
205
template
<
class
ENUM >
206
bool
flags < ENUM > ::operator == (
const
flags < ENUM > & f)
207
{
208
return ::is_set(
this
) && ::acme::array::is_equal(m_ia, f.m_ia);
209
}
210
211
template
<
class
ENUM >
212
bool
flags < ENUM > ::operator != (
const
flags < ENUM > & f)
213
{
214
return
!this->operator == (f);
215
}
216
217
template
<
class
ENUM >
218
class
flags_ex
;
219
220
template
<
class
ENUM >
221
class
flags_listener
222
{
223
friend
class
flags_ex
< ENUM >;
224
protected
:
225
virtual
void
on_change_signalization(ENUM eenum);
226
void
on_change_signalization(::i32 iEnum);
227
};
228
229
template
<
class
ENUM >
230
void
flags_listener < ENUM > ::on_change_signalization(ENUM)
231
{
232
}
233
234
template
<
class
ENUM >
235
void
flags_listener < ENUM > ::on_change_signalization(::i32 iEnum)
236
{
237
on_change_signalization((ENUM)iEnum);
238
}
239
240
241
//template < class ENUM >
242
//class flags_ex :
243
// virtual public flags < ENUM >
244
//{
245
//public:
246
//
247
//
248
// flags_ex();
249
// flags_ex(flags_ex & flags);
250
// virtual ~flags_ex();
251
//
252
// using ::flags < ENUM >::add;
253
// virtual bool add(ENUM eenum);
254
// virtual bool erase(ENUM eenum);
255
// virtual bool clear();
256
// virtual bool toggle(ENUM eenum);
257
//
258
// virtual void on_change_signalization(ENUM eenum);
259
//
260
//protected:
261
//
262
// class ::channel m_signal;
263
//
264
//};
265
//
266
//template < class ENUM >
267
//flags_ex < ENUM > ::flags_ex()
268
//{
269
//}
270
//
271
//template < class ENUM >
272
//flags_ex < ENUM > ::flags_ex(flags_ex < ENUM > & f)
273
//{
274
// operator = (f);
275
//}
276
//
277
//template < class ENUM >
278
//flags_ex < ENUM > ::~flags_ex()
279
//{
280
//}
281
//
282
//template < class ENUM >
283
//bool flags_ex < ENUM > ::add(ENUM eenum)
284
//{
285
// if (flags<ENUM>::add(eenum))
286
// {
287
// on_change_signalization(eenum);
288
// return true;
289
// }
290
// else
291
// {
292
// return false;
293
// }
294
//}
295
//
296
//template < class ENUM >
297
//bool flags_ex < ENUM > ::erase(ENUM eenum)
298
//{
299
// if (flags<ENUM>::erase(eenum))
300
// {
301
// on_change_signalization(eenum);
302
// return true;
303
// }
304
// else
305
// {
306
// return false;
307
// }
308
//}
309
//
310
//template < class ENUM >
311
//bool flags_ex < ENUM > ::toggle(ENUM eenum)
312
//{
313
// if (flags<ENUM>::toggle(eenum))
314
// {
315
// on_change_signalization(eenum);
316
// return true;
317
// }
318
// else
319
// {
320
// return false;
321
// }
322
//}
323
//
324
//template < class ENUM >
325
//bool flags_ex < ENUM > ::clear()
326
//{
327
// return flags<ENUM>::clear();
328
//}
329
//
flags_ex
Definition
flags.h:218
flags_listener
Definition
flags.h:222
flags
Definition
flags.h:13
platform
flags.h
Generated by
1.17.0