"SfR Fresh" - the SfR Freeware/Shareware Archive 
Member "pan-0.133/pan/tasks/adaptable-set-test.cc" of archive pan-0.133.tar.gz:
As a special service "SfR Fresh" has tried to format the requested source page into HTML format using (guessed) C and C++ source code syntax highlighting with prefixed line numbers.
Alternatively you can here view or download the uninterpreted source code file.
That can be also achieved for any archive member file by clicking within an archive contents listing on the first character of the file(path) respectively on the according byte size field.
1 #include <config.h>
2 #include <algorithm>
3 #include <iostream>
4 #include <pan/general/test.h>
5 #include "adaptable-set.h"
6
7 using namespace pan;
8
9 template<class X> class MyLessThan {
10 public:
11 MyLessThan () { }
12 bool operator() (const X& x, const X& y) const { return x < y; }
13 };
14
15 template<class X>
16 class MyListener:
17 public AdaptableSet<X, MyLessThan<X> >::Listener
18 {
19 public:
20 X value;
21 int index_of_added;
22 int index_of_removed;
23 int old_index_of_moved;
24 int new_index_of_moved;
25
26 public:
27 virtual void on_set_items_added (AdaptableSet<X, MyLessThan<X> >&, std::vector<X>& i, int index) {
28 index_of_added = index;
29 value = i[0];
30 }
31 virtual void on_set_item_removed (AdaptableSet<X, MyLessThan<X> >&, X& i, int index) {
32 index_of_removed = index;
33 value = i;
34 }
35 virtual void on_set_item_moved (AdaptableSet<X, MyLessThan<X> >&, X& i, int index, int old_index) {
36 old_index_of_moved = old_index;
37 new_index_of_moved = index;
38 value = i;
39 }
40 void clear () {
41 index_of_added = index_of_removed = old_index_of_moved = new_index_of_moved = -1;
42 }
43 MyListener () {
44 clear ();
45 }
46 bool empty () const {
47 return index_of_added==-1
48 && index_of_removed==-1
49 && old_index_of_moved==-1
50 && new_index_of_moved==-1;
51 }
52 };
53
54 typedef AdaptableSet<int, MyLessThan<int> > MyIntSet;
55 int main ()
56 {
57 int i;
58 MyIntSet s;
59 MyListener<int> l;
60 check (l.empty())
61 s.add_listener (&l);
62
63 check (s.empty())
64
65 // trivial check: add to an empty set
66 l.clear ();
67 s.add (i = 10);
68 check (l.value == 10)
69 check (l.index_of_added == 0)
70 check (!s.empty())
71 check (s.size() == 1)
72 check (s[0] == 10)
73
74 // another add: does it insert in the right place?
75 l.clear ();
76 s.add (i = 30);
77 check (l.index_of_added == 1)
78 check (l.value == 30)
79 check (s.size() == 2)
80 check (s[0] == 10)
81 check (s[1] == 30)
82
83 // another add: does it insert in the right place?
84 l.clear ();
85 s.add (i = 20);
86 check (l.index_of_added == 1)
87 check (l.value == 20)
88 check (s.size() == 3)
89 check (s[0] == 10)
90 check (s[1] == 20)
91 check (s[2] == 30)
92
93 // testing move_up
94 l.clear ();
95 MyIntSet s2 (s);
96 s.move_up (2);
97 check (l.old_index_of_moved == 2)
98 check (l.new_index_of_moved == 1)
99 check (l.value == 30)
100 check (s.size() == 3)
101 check (s[0] == 10)
102 check (s[1] == 30)
103 check (s[2] == 20)
104 l.clear ();
105 s.move_up (1);
106 check (s.size() == 3)
107 check (l.old_index_of_moved == 1)
108 check (l.new_index_of_moved == 0)
109 check (l.value == 30)
110 check (s[0] == 30)
111 check (s[1] == 10)
112 check (s[2] == 20)
113 l.clear ();
114 s.move_up (i = 0);
115 check (l.empty ())
116 check (s.size() == 3)
117 check (s[0] == 30)
118 check (s[1] == 10)
119 check (s[2] == 20)
120
121 // does the set ignore moved items when finding the insertion point?
122 // the unmoved set is 10, 20
123 l.clear ();
124 s.add (i = 15);
125 check (l.index_of_added == 2)
126 check (l.value == 15)
127 check (s.size() == 4)
128 check (s[0] == 30)
129 check (s[1] == 10)
130 check (s[2] == 15)
131 check (s[3] == 20)
132
133 // does the set ignore moved items when finding the insertion point?
134 // the unmoved set is 10, 15, 20
135 l.clear ();
136 s.add (i = 21);
137 check (l.index_of_added == 4)
138 check (l.value == 21)
139 check (s.size() == 5)
140 check (s[0] == 30)
141 check (s[1] == 10)
142 check (s[2] == 15)
143 check (s[3] == 20)
144 check (s[4] == 21)
145
146 // does the set ignore moved items when finding the insertion point?
147 // the unmoved set is 10, 15, 20, 21
148 l.clear ();
149 s.add (i = 31);
150 check (s.size() == 6)
151 check (l.index_of_added == 5)
152 check (l.value == 31)
153 check (s[0] == 30)
154 check (s[1] == 10)
155 check (s[2] == 15)
156 check (s[3] == 20)
157 check (s[4] == 21)
158 check (s[5] == 31)
159
160 // testing move_down
161 l.clear ();
162 s.move_down (1);
163 check (l.old_index_of_moved == 1)
164 check (l.new_index_of_moved == 2)
165 check (l.value == 10)
166 check (s.size() == 6)
167 check (s[0] == 30)
168 check (s[1] == 15)
169 check (s[2] == 10)
170 check (s[3] == 20)
171 check (s[4] == 21)
172 check (s[5] == 31)
173 l.clear ();
174 s.move_down (2);
175 check (l.old_index_of_moved == 2)
176 check (l.new_index_of_moved == 3)
177 check (l.value == 10)
178 check (s.size() == 6)
179 check (s[0] == 30)
180 check (s[1] == 15)
181 check (s[2] == 20)
182 check (s[3] == 10)
183 check (s[4] == 21)
184 check (s[5] == 31)
185
186 // does the set ignore moved items when finding the insertion point?
187 // the unmoved set is 15, 20, 21, 31
188 l.clear ();
189 s.add (i = 11);
190 check (l.index_of_added == 1)
191 check (l.value == 11)
192 check (s.size() == 7)
193 check (s[0] == 30)
194 check (s[1] == 11)
195 check (s[2] == 15)
196 check (s[3] == 20)
197 check (s[4] == 10)
198 check (s[5] == 21)
199 check (s[6] == 31)
200
201 // move to bottom...
202 l.clear ();
203 s.move_bottom (3);
204 check (l.value == 20)
205 check (l.old_index_of_moved == 3)
206 check (l.new_index_of_moved == 6)
207 check (s.size() == 7)
208 check (s[0] == 30)
209 check (s[1] == 11)
210 check (s[2] == 15)
211 check (s[3] == 10)
212 check (s[4] == 21)
213 check (s[5] == 31)
214 check (s[6] == 20)
215
216 // test another add after move_bottom()
217 // does the set ignore moved items when finding the insertion point?
218 // the unmoved set is 15, 21, 31
219 l.clear ();
220 s.add (i = 19);
221 check (l.value == 19)
222 check (l.index_of_added == 4)
223 check (s.size() == 8)
224 check (s[0] == 30)
225 check (s[1] == 11)
226 check (s[2] == 15)
227 check (s[3] == 10)
228 check (s[4] == 19)
229 check (s[5] == 21)
230 check (s[6] == 31)
231 check (s[7] == 20)
232
233 // now for multiple insert tests...
234 MyIntSet m;
235 l.clear ();
236 std::vector<int> addme;
237 addme.push_back (5);
238 addme.push_back (10);
239 addme.push_back (15);
240 addme.push_back (20);
241 m.add (addme);
242 check (m.size() == 4)
243 check (m[0] == 5)
244 check (m[1] == 10)
245 check (m[2] == 15)
246 check (m[3] == 20)
247
248 // start with an easy addition...
249 addme.clear ();
250 addme.push_back (0);
251 addme.push_back (1);
252 addme.push_back (2);
253 m.add (addme);
254 check (m.size() == 7)
255 check (m[0] == 0)
256 check (m[1] == 1)
257 check (m[2] == 2)
258 check (m[3] == 5)
259 check (m[4] == 10)
260 check (m[5] == 15)
261 check (m[6] == 20)
262
263 // now a more complicated one...
264 addme.clear ();
265 addme.push_back (12);
266 addme.push_back (8);
267 addme.push_back (17);
268 addme.push_back (25);
269 m.add (addme);
270 check (m.size() == 11)
271 check (m[0] == 0)
272 check (m[1] == 1)
273 check (m[2] == 2)
274 check (m[3] == 5)
275 check (m[4] == 8)
276 check (m[5] == 10)
277 check (m[6] == 12)
278 check (m[7] == 15)
279 check (m[8] == 17)
280 check (m[9] == 20)
281 check (m[10] == 25)
282
283 // now after we've moved some items...
284 m.move_up (3);
285 m.move_up (7);
286 check (m.size() == 11)
287 check (m[0] == 0)
288 check (m[1] == 1)
289 check (m[2] == 5)
290 check (m[3] == 2)
291 check (m[4] == 8)
292 check (m[5] == 10)
293 check (m[6] == 15)
294 check (m[7] == 12)
295 check (m[8] == 17)
296 check (m[9] == 20)
297 check (m[10] == 25)
298 addme.clear ();
299 addme.push_back (3);
300 addme.push_back (11);
301 addme.push_back (14);
302 addme.push_back (30);
303 m.add (addme);
304 check (m.size() == 15)
305 check (m[0] == 0)
306 check (m[1] == 1)
307 check (m[2] == 5)
308 check (m[3] == 2)
309 check (m[4] == 3)
310 check (m[5] == 8)
311 check (m[6] == 10)
312 check (m[7] == 15)
313 check (m[8] == 11)
314 check (m[9] == 12)
315 check (m[10] == 14)
316 check (m[11] == 17)
317 check (m[12] == 20)
318 check (m[13] == 25)
319 check (m[14] == 30)
320
321 return 0;
322 }