1
1
//
2
2
// FILE: Set.cpp
3
3
// AUTHOR: Rob Tillaart
4
- // VERSION: 0.1.08
4
+ // VERSION: 0.1.09
5
5
// PURPOSE: SET library for Arduino
6
- // URL: http://forum.arduino.cc/index.php?topic=279044.0
6
+ // URL:
7
7
//
8
8
// HISTORY:
9
+ // 0.1.09 2015-07-12 const + constructor
9
10
// 0.1.08 memset for clr()
10
11
// 0.1.07 faster first/next/last/prev; interface
11
12
// 0.1.06 added flag to constructor to optimize +,-,*,
26
27
//
27
28
// CONSTRUCTORS
28
29
//
29
- Set::Set (bool clear)
30
+ Set::Set (const bool clear)
30
31
{
31
32
if (clear)
32
33
{
33
34
clr ();
34
35
}
36
+ _current = -1 ;
35
37
}
36
38
37
39
Set::Set (const Set &t)
@@ -40,34 +42,35 @@ Set::Set(const Set &t)
40
42
{
41
43
_mem[i] = t._mem [i];
42
44
}
45
+ _current = -1 ;
43
46
}
44
47
45
48
// ///////////////////////////////////////////////////
46
49
//
47
50
// METHODS
48
51
//
49
- void Set::add (uint8_t v)
52
+ void Set::add (const uint8_t v)
50
53
{
51
54
uint8_t mask = 1 << (v & 7 );
52
55
uint8_t idx = v / 8 ;
53
56
_mem[idx] |= mask;
54
57
}
55
58
56
- void Set::sub (uint8_t v)
59
+ void Set::sub (const uint8_t v)
57
60
{
58
61
uint8_t mask = 1 << (v & 7 );
59
62
uint8_t idx = v / 8 ;
60
63
_mem[idx] &= ~mask;
61
64
}
62
65
63
- void Set::invert (uint8_t v)
66
+ void Set::invert (const uint8_t v)
64
67
{
65
68
uint8_t mask = 1 << (v & 7 );
66
69
uint8_t idx = v / 8 ;
67
70
_mem[idx] ^= mask;
68
71
}
69
72
70
- bool Set::has (uint8_t v)
73
+ bool Set::has (const uint8_t v)
71
74
{
72
75
uint8_t mask = 1 << (v & 7 );
73
76
uint8_t idx = v / 8 ;
@@ -125,19 +128,19 @@ int Set::next()
125
128
return findNext (p, q);
126
129
}
127
130
128
- int Set::findNext (uint8_t p, uint8_t q)
131
+ int Set::findNext (const uint8_t p, const uint8_t q)
129
132
{
130
- for (uint8_t i= p; i< 32 ; i++)
133
+ for (uint8_t i = p; i < 32 ; i++)
131
134
{
132
135
uint8_t b = _mem[i];
133
136
if (b != 0 )
134
137
{
135
- uint8_t mask = 1 << q;
136
- for (uint8_t j= q; j< 8 ; j++)
138
+ uint8_t mask = 1 << q;
139
+ for (uint8_t j = q; j < 8 ; j++)
137
140
{
138
141
if (b & mask)
139
142
{
140
- _current = i* 8 + j;
143
+ _current = i * 8 + j;
141
144
return _current;
142
145
}
143
146
mask <<= 1 ;
@@ -163,26 +166,26 @@ int Set::last()
163
166
return findPrev (31 , 7 );
164
167
}
165
168
166
- int Set::findPrev (uint8_t p, uint8_t q)
169
+ int Set::findPrev (const uint8_t p, const uint8_t q)
167
170
{
168
171
uint8_t m = 1 << q;
169
- for (uint8_t i= p; i!= 255 ; --i) // uint < 0
172
+ for (uint8_t i = p; i != 255 ; --i) // uint < 0
170
173
{
171
174
uint8_t b = _mem[i];
172
175
if (b != 0 )
173
176
{
174
177
uint8_t mask = m;
175
- for (uint8_t j= q; j!= 255 ; --j)
178
+ for (uint8_t j = q; j != 255 ; --j)
176
179
{
177
180
if (b & mask)
178
181
{
179
- _current = i* 8 + j;
182
+ _current = i * 8 + j;
180
183
return _current;
181
184
}
182
185
mask >>= 1 ;
183
186
}
184
187
}
185
- m = 1 << 7 ;
188
+ m = 1 << 7 ;
186
189
q = 7 ;
187
190
}
188
191
_current = -1 ;
@@ -195,81 +198,81 @@ int Set::findPrev(uint8_t p, uint8_t q)
195
198
// OPERATORS
196
199
//
197
200
198
- Set Set::operator + (Set &t) // union
201
+ Set Set::operator + (const Set &t) // union
199
202
{
200
203
Set s (false );
201
- for (uint8_t i= 0 ; i< 32 ; i++)
204
+ for (uint8_t i = 0 ; i < 32 ; i++)
202
205
{
203
206
s._mem [i] = this ->_mem [i] | t._mem [i];
204
207
}
205
208
return s;
206
209
}
207
210
208
- Set Set::operator - (Set &t) // diff
211
+ Set Set::operator - (const Set &t) // diff
209
212
{
210
213
Set s (false );
211
- for (uint8_t i= 0 ; i< 32 ; i++)
214
+ for (uint8_t i = 0 ; i < 32 ; i++)
212
215
{
213
216
s._mem [i] = this ->_mem [i] & ~t._mem [i];
214
217
}
215
218
return s;
216
219
}
217
220
218
- Set Set::operator * (Set &t) // intersection
221
+ Set Set::operator * (const Set &t) // intersection
219
222
{
220
223
Set s (false );
221
- for (uint8_t i= 0 ; i< 32 ; i++)
224
+ for (uint8_t i = 0 ; i < 32 ; i++)
222
225
{
223
226
s._mem [i] = this ->_mem [i] & t._mem [i];
224
227
}
225
228
return s;
226
229
}
227
230
228
- void Set::operator += (Set &t) // union
231
+ void Set::operator += (const Set &t) // union
229
232
{
230
- for (uint8_t i= 0 ; i< 32 ; i++)
233
+ for (uint8_t i = 0 ; i < 32 ; i++)
231
234
{
232
235
_mem[i] |= t._mem [i];
233
236
}
234
237
}
235
238
236
- void Set::operator -= (Set &t) // diff
239
+ void Set::operator -= (const Set &t) // diff
237
240
{
238
- for (uint8_t i= 0 ; i< 32 ; i++)
241
+ for (uint8_t i = 0 ; i < 32 ; i++)
239
242
{
240
243
_mem[i] &= ~t._mem [i];
241
244
}
242
245
}
243
246
244
- void Set::operator *= (Set &t) // intersection
247
+ void Set::operator *= (const Set &t) // intersection
245
248
{
246
- for (uint8_t i= 0 ; i< 32 ; i++)
249
+ for (uint8_t i = 0 ; i < 32 ; i++)
247
250
{
248
251
_mem[i] &= t._mem [i];
249
252
}
250
253
}
251
254
252
- bool Set::operator == (Set &t) // equal
255
+ bool Set::operator == (const Set &t) const // equal
253
256
{
254
- for (uint8_t i= 0 ; i< 32 ; i++)
257
+ for (uint8_t i = 0 ; i < 32 ; i++)
255
258
{
256
259
if (_mem[i] != t._mem [i]) return false ;
257
260
}
258
261
return true ;
259
262
}
260
263
261
- bool Set::operator != (Set &t) // not equal
264
+ bool Set::operator != (const Set &t) const // not equal
262
265
{
263
- for (uint8_t i= 0 ; i< 32 ; i++)
266
+ for (uint8_t i = 0 ; i < 32 ; i++)
264
267
{
265
268
if (_mem[i] != t._mem [i]) return true ;
266
269
}
267
270
return false ;
268
271
}
269
272
270
- bool Set::operator <= (Set &t) // subSet
273
+ bool Set::operator <= (const Set &t) const // subSet
271
274
{
272
- for (uint8_t i= 0 ; i< 32 ; i++)
275
+ for (uint8_t i = 0 ; i < 32 ; i++)
273
276
{
274
277
if ((_mem[i] & ~t._mem [i]) > 0 ) return false ;
275
278
}
0 commit comments