acme
Foundational cross-platform layer of the ca2 framework
Loading...
Searching...
No Matches
flags.h
1#pragma once
2
3
4
5
6
8
9
10template < class ENUM >
11class flags :
12 virtual public ::particle
13{
14public:
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
96template < class ENUM >
97flags < ENUM > ::flags()
98{
99}
100
101template < class ENUM >
102flags < ENUM > ::flags(ENUM eenum)
103{
104 add(eenum);
105}
106
107template < class ENUM >
108flags < 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
120template < class ENUM >
121flags < ENUM > ::flags(const flags < ENUM > & f)
122{
123 operator = (f);
124}
125
126template < class ENUM >
127flags < ENUM > ::~flags()
128{
129}
130
131template < class ENUM >
132bool flags < ENUM > ::add(ENUM eenum)
133{
134 return m_ia.add_unique((::i64)eenum);
135}
136
137
138template < class ENUM >
139bool flags < ENUM > ::erase(ENUM eenum)
140{
141 return m_ia.erase((::i64)eenum);
142}
143
144
145template < class ENUM >
146bool flags < ENUM > ::has(ENUM eenum) const
147{
148 return ::is_set(this) && m_ia.has((::i64)eenum);
149}
150
151
152template < class ENUM >
153bool 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
165template < 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
177template < class ENUM >
178bool 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
191template < class ENUM >
192bool flags < ENUM > ::clear()
193{
194 m_ia.erase_all();
195 return true;
196}
197
198template < class ENUM >
199flags < ENUM > & flags < ENUM > ::operator = (const flags < ENUM > & f)
200{
201 m_ia.copy(f.m_ia);
202 return *this;
203}
204
205template < class ENUM >
206bool flags < ENUM > ::operator == (const flags < ENUM > & f)
207{
208 return ::is_set(this) && ::acme::array::is_equal(m_ia, f.m_ia);
209}
210
211template < class ENUM >
212bool flags < ENUM > ::operator != (const flags < ENUM > & f)
213{
214 return !this->operator == (f);
215}
216
217template < class ENUM >
219
220template < class ENUM >
222{
223 friend class flags_ex < ENUM >;
224protected:
225 virtual void on_change_signalization(ENUM eenum);
226 void on_change_signalization(::i32 iEnum);
227};
228
229template < class ENUM >
230void flags_listener < ENUM > ::on_change_signalization(ENUM)
231{
232}
233
234template < class ENUM >
235void 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//
Definition flags.h:218
Definition flags.h:222
Definition flags.h:13