blob: 10033a2dfa2356dad26996b8f45031de8280cae9 [file] [log] [blame]
njn7b880bc2005-08-14 22:43:53 +00001
2#include <assert.h>
3#include <stdio.h>
4#include <stdlib.h>
5#include <string.h>
6
7#include "pub_core_basics.h"
8#include "pub_core_libcbase.h"
9#include "pub_core_libcassert.h"
10#include "pub_core_libcprint.h"
11
12// I need this to avoid some signedness warnings, not sure why
sewardjb1e123a2005-08-19 09:07:34 +000013// #define Char char
14// jrs 19 Aug 2005: m_oset.c relies on Char being a signed char.
15// It appears that plain 'char' on ppc32 is unsigned and so the
16// above #define screws up the AVL tree balancing logic and
17// leads to segfaults. Commenting it out and using the standard
18// definition of Char from pub_core_basics.h seems a good solution
19// as that has the same signedness on all platforms.
njn7b880bc2005-08-14 22:43:53 +000020
21// Crudely redirect various VG_(foo)() functions to their libc equivalents.
22#undef vg_assert
23#define vg_assert(e) assert(e)
24#undef vg_assert2
25#define vg_assert2(e, fmt, args...) assert(e)
26
27#define vgPlain_printf printf
28#define vgPlain_memset memset
29#define vgPlain_memcpy memcpy
njn7b880bc2005-08-14 22:43:53 +000030
31#include "coregrind/m_oset.c"
32
33#define NN 1000 // Size of OSets being created
34
sewardj3d8dcf82006-10-17 01:25:13 +000035
36/* Consistent random number generator, so it produces the
37 same results on all platforms. */
38
39#define random error_do_not_use_libc_random
40
41static UInt seed = 0;
42static UInt myrandom( void )
43{
44 seed = (1103515245 * seed + 12345);
45 return seed;
46}
47
sewardj9c606bd2008-09-18 18:12:50 +000048static void* allocate_node(HChar* cc, SizeT szB)
bart672a82d2008-05-04 08:10:24 +000049{ return malloc(szB); }
50
51static void free_node(void* p)
52{ return free(p); }
sewardj3d8dcf82006-10-17 01:25:13 +000053
54
njn7b880bc2005-08-14 22:43:53 +000055//---------------------------------------------------------------------------
sewardj6792df32006-01-07 22:33:45 +000056// Word example
njn7b880bc2005-08-14 22:43:53 +000057//---------------------------------------------------------------------------
58
sewardj6792df32006-01-07 22:33:45 +000059// This example shows that an element can be a single value (in this
60// case a Word), in which case the element is also the key.
njn7b880bc2005-08-14 22:43:53 +000061
62__attribute__((unused))
sewardj6792df32006-01-07 22:33:45 +000063static Char *wordToStr(void *p)
njn7b880bc2005-08-14 22:43:53 +000064{
sewardj6792df32006-01-07 22:33:45 +000065 static char buf[32];
66 sprintf(buf, "%ld", *(Word*)p);
njn7b880bc2005-08-14 22:43:53 +000067 return buf;
68}
69
70__attribute__((unused))
sewardj6792df32006-01-07 22:33:45 +000071static Word wordCmp(void* vkey, void* velem)
njn7b880bc2005-08-14 22:43:53 +000072{
sewardj6792df32006-01-07 22:33:45 +000073 return *(Word*)vkey - *(Word*)velem;
njn7b880bc2005-08-14 22:43:53 +000074}
75
76void example1(void)
77{
sewardj6792df32006-01-07 22:33:45 +000078 Int i, n;
79 Word v, prev;
80 Word* vs[NN];
81 Word *pv;
njn7b880bc2005-08-14 22:43:53 +000082
83 // Create a static OSet of Ints. This one uses fast (built-in)
84 // comparisons.
njne2a9ad32007-09-17 05:30:48 +000085 OSet* oset = VG_(OSetGen_Create)(0,
bart672a82d2008-05-04 08:10:24 +000086 NULL,
sewardj9c606bd2008-09-18 18:12:50 +000087 allocate_node, "oset_test.1", free_node);
njn7b880bc2005-08-14 22:43:53 +000088
89 // Try some operations on an empty OSet to ensure they don't screw up.
njne2a9ad32007-09-17 05:30:48 +000090 vg_assert( ! VG_(OSetGen_Contains)(oset, &v) );
91 vg_assert( ! VG_(OSetGen_Lookup)(oset, &v) );
92 vg_assert( ! VG_(OSetGen_Remove)(oset, &v) );
93 vg_assert( ! VG_(OSetGen_Next)(oset) );
94 vg_assert( 0 == VG_(OSetGen_Size)(oset) );
njn7b880bc2005-08-14 22:43:53 +000095
96 // Create some elements, with gaps (they're all even) but no dups,
97 // and shuffle them randomly.
98 for (i = 0; i < NN; i++) {
njne2a9ad32007-09-17 05:30:48 +000099 vs[i] = VG_(OSetGen_AllocNode)(oset, sizeof(Word));
njn7b880bc2005-08-14 22:43:53 +0000100 *(vs[i]) = 2*i;
101 }
njne2a9ad32007-09-17 05:30:48 +0000102 seed = 0;
njn7b880bc2005-08-14 22:43:53 +0000103 for (i = 0; i < NN; i++) {
sewardj3d8dcf82006-10-17 01:25:13 +0000104 Word r1 = myrandom() % NN;
105 Word r2 = myrandom() % NN;
sewardj6792df32006-01-07 22:33:45 +0000106 Word* tmp= vs[r1];
107 vs[r1] = vs[r2];
108 vs[r2] = tmp;
njn7b880bc2005-08-14 22:43:53 +0000109 }
110
111 // Insert the elements
112 for (i = 0; i < NN; i++) {
njne2a9ad32007-09-17 05:30:48 +0000113 VG_(OSetGen_Insert)(oset, vs[i]);
njn7b880bc2005-08-14 22:43:53 +0000114 }
115
116 // Check the size
njne2a9ad32007-09-17 05:30:48 +0000117 vg_assert( NN == VG_(OSetGen_Size)(oset) );
njn7b880bc2005-08-14 22:43:53 +0000118
119 // Check we can find all the elements we inserted
120 for (i = 0; i < NN; i++) {
njne2a9ad32007-09-17 05:30:48 +0000121 assert( VG_(OSetGen_Contains)(oset, vs[i]) );
njn7b880bc2005-08-14 22:43:53 +0000122 }
123
124 // Check we cannot find elements we did not insert, below, within (odd
125 // numbers), and above the inserted elements.
126 v = -1;
njne2a9ad32007-09-17 05:30:48 +0000127 assert( ! VG_(OSetGen_Contains)(oset, &v) );
njn7b880bc2005-08-14 22:43:53 +0000128 for (i = 0; i < NN; i++) {
129 v = *(vs[i]) + 1;
njne2a9ad32007-09-17 05:30:48 +0000130 assert( ! VG_(OSetGen_Contains)(oset, &v) );
njn7b880bc2005-08-14 22:43:53 +0000131 }
132 v = NN*2;
njne2a9ad32007-09-17 05:30:48 +0000133 assert( ! VG_(OSetGen_Contains)(oset, &v) );
njn7b880bc2005-08-14 22:43:53 +0000134
135 // Check we can find all the elements we inserted, and the right values
136 // are returned.
137 for (i = 0; i < NN; i++) {
njne2a9ad32007-09-17 05:30:48 +0000138 assert( vs[i] == VG_(OSetGen_Lookup)(oset, vs[i]) );
njn7b880bc2005-08-14 22:43:53 +0000139 }
140
141 // Check that we can iterate over the OSet elements in sorted order, and
142 // there is the right number of them.
143 n = 0;
144 pv = NULL;
145 prev = -1;
njne2a9ad32007-09-17 05:30:48 +0000146 VG_(OSetGen_ResetIter)(oset);
147 while ( (pv = VG_(OSetGen_Next)(oset)) ) {
sewardj6792df32006-01-07 22:33:45 +0000148 Word curr = *pv;
njn7b880bc2005-08-14 22:43:53 +0000149 assert(prev < curr);
150 prev = curr;
151 n++;
152 }
153 assert(NN == n);
njne2a9ad32007-09-17 05:30:48 +0000154 vg_assert( ! VG_(OSetGen_Next)(oset) );
155 vg_assert( ! VG_(OSetGen_Next)(oset) );
njn7b880bc2005-08-14 22:43:53 +0000156
157 // Check that we can remove half of the elements, and that their values
158 // are as expected.
159 for (i = 0; i < NN; i += 2) {
njne2a9ad32007-09-17 05:30:48 +0000160 assert( pv = VG_(OSetGen_Remove)(oset, vs[i]) );
njn7b880bc2005-08-14 22:43:53 +0000161 assert( pv == vs[i] );
162 }
163
164 // Check the size
njne2a9ad32007-09-17 05:30:48 +0000165 vg_assert( NN/2 == VG_(OSetGen_Size)(oset) );
njn7b880bc2005-08-14 22:43:53 +0000166
167 // Check we can find the remaining elements (with the right values).
168 for (i = 1; i < NN; i += 2) {
njne2a9ad32007-09-17 05:30:48 +0000169 assert( pv = VG_(OSetGen_LookupWithCmp)(oset, vs[i], NULL) );
njn7b880bc2005-08-14 22:43:53 +0000170 assert( pv == vs[i] );
171 }
172
173 // Check we cannot find any of the elements we removed.
174 for (i = 0; i < NN; i += 2) {
njne2a9ad32007-09-17 05:30:48 +0000175 assert( ! VG_(OSetGen_Contains)(oset, vs[i]) );
njn7b880bc2005-08-14 22:43:53 +0000176 }
177
178 // Check that we can remove the remaining half of the elements, and that
179 // their values are as expected.
180 for (i = 1; i < NN; i += 2) {
njne2a9ad32007-09-17 05:30:48 +0000181 assert( pv = VG_(OSetGen_Remove)(oset, vs[i]) );
njn7b880bc2005-08-14 22:43:53 +0000182 assert( pv == vs[i] );
183 }
184
185 // Try some more operations on the empty OSet to ensure they don't screw up.
njne2a9ad32007-09-17 05:30:48 +0000186 vg_assert( ! VG_(OSetGen_Contains)(oset, &v) );
187 vg_assert( ! VG_(OSetGen_Lookup)(oset, &v) );
188 vg_assert( ! VG_(OSetGen_Remove)(oset, &v) );
189 vg_assert( ! VG_(OSetGen_Next)(oset) );
190 vg_assert( 0 == VG_(OSetGen_Size)(oset) );
njn7b880bc2005-08-14 22:43:53 +0000191
192 // Free a few elements
njne2a9ad32007-09-17 05:30:48 +0000193 VG_(OSetGen_FreeNode)(oset, vs[0]);
194 VG_(OSetGen_FreeNode)(oset, vs[1]);
195 VG_(OSetGen_FreeNode)(oset, vs[2]);
njn7b880bc2005-08-14 22:43:53 +0000196
njne2a9ad32007-09-17 05:30:48 +0000197 // Re-insert remaining elements, to give OSetGen_Destroy something to
198 // work with.
njn7b880bc2005-08-14 22:43:53 +0000199 for (i = 3; i < NN; i++) {
njne2a9ad32007-09-17 05:30:48 +0000200 VG_(OSetGen_Insert)(oset, vs[i]);
njn7b880bc2005-08-14 22:43:53 +0000201 }
202
203 // Print the list
njne2a9ad32007-09-17 05:30:48 +0000204 OSet_Print(oset, "oset1", wordToStr);
njn7b880bc2005-08-14 22:43:53 +0000205
206 // Destroy the OSet
njne2a9ad32007-09-17 05:30:48 +0000207 VG_(OSetGen_Destroy)(oset);
208}
209
210
211void example1b(void)
212{
213 Int i, n;
214 Word v = 0, prev;
215 Word vs[NN];
216 Word *pv;
217
218 // Create a static OSet of Ints. This one uses fast (built-in)
219 // comparisons.
sewardj9c606bd2008-09-18 18:12:50 +0000220 OSet* oset = VG_(OSetWord_Create)(allocate_node, "oset_test.2", free_node);
njne2a9ad32007-09-17 05:30:48 +0000221
222 // Try some operations on an empty OSet to ensure they don't screw up.
223 vg_assert( ! VG_(OSetWord_Contains)(oset, v) );
224 vg_assert( ! VG_(OSetWord_Remove)(oset, v) );
225 vg_assert( ! VG_(OSetWord_Next)(oset, &v) );
226 vg_assert( 0 == VG_(OSetWord_Size)(oset) );
227
228 // Create some elements, with gaps (they're all even) but no dups,
229 // and shuffle them randomly.
230 for (i = 0; i < NN; i++) {
231 vs[i] = 2*i;
232 }
233 seed = 0;
234 for (i = 0; i < NN; i++) {
235 Word r1 = myrandom() % NN;
236 Word r2 = myrandom() % NN;
237 Word tmp = vs[r1];
238 vs[r1] = vs[r2];
239 vs[r2] = tmp;
240 }
241
242 // Insert the elements
243 for (i = 0; i < NN; i++) {
244 VG_(OSetWord_Insert)(oset, vs[i]);
245 }
246
247 // Check the size
248 vg_assert( NN == VG_(OSetWord_Size)(oset) );
249
250 // Check we can find all the elements we inserted
251 for (i = 0; i < NN; i++) {
252 assert( VG_(OSetWord_Contains)(oset, vs[i]) );
253 }
254
255 // Check we cannot find elements we did not insert, below, within (odd
256 // numbers), and above the inserted elements.
257 v = -1;
258 assert( ! VG_(OSetWord_Contains)(oset, v) );
259 for (i = 0; i < NN; i++) {
260 v = vs[i] + 1;
261 assert( ! VG_(OSetWord_Contains)(oset, v) );
262 }
263 v = NN*2;
264 assert( ! VG_(OSetWord_Contains)(oset, v) );
265
266 // Check we can find all the elements we inserted.
267 for (i = 0; i < NN; i++) {
268 assert( VG_(OSetWord_Contains)(oset, vs[i]) );
269 }
270
271 // Check that we can iterate over the OSet elements in sorted order, and
272 // there is the right number of them.
273 n = 0;
274 prev = -1;
275 VG_(OSetWord_ResetIter)(oset);
276 while ( VG_(OSetWord_Next)(oset, &v) ) {
277 Word curr = v;
278 assert(prev < curr);
279 prev = curr;
280 n++;
281 }
282 assert(NN == n);
283 vg_assert( ! VG_(OSetWord_Next)(oset, &v) );
284 vg_assert( ! VG_(OSetWord_Next)(oset, &v) );
285
286 // Check that we can remove half of the elements.
287 for (i = 0; i < NN; i += 2) {
288 assert( VG_(OSetWord_Remove)(oset, vs[i]) );
289 }
290
291 // Check the size
292 vg_assert( NN/2 == VG_(OSetWord_Size)(oset) );
293
294 // Check we can find the remaining elements (with the right values).
295 for (i = 1; i < NN; i += 2) {
296 assert( VG_(OSetWord_Contains)(oset, vs[i]) );
297 }
298
299 // Check we cannot find any of the elements we removed.
300 for (i = 0; i < NN; i += 2) {
301 assert( ! VG_(OSetWord_Contains)(oset, vs[i]) );
302 }
303
304 // Check that we can remove the remaining half of the elements.
305 for (i = 1; i < NN; i += 2) {
306 assert( VG_(OSetWord_Remove)(oset, vs[i]) );
307 }
308
309 // Try some more operations on the empty OSet to ensure they don't screw up.
310 vg_assert( ! VG_(OSetWord_Contains)(oset, v) );
311 vg_assert( ! VG_(OSetWord_Remove)(oset, v) );
312 vg_assert( ! VG_(OSetWord_Next)(oset, &v) );
313 vg_assert( 0 == VG_(OSetWord_Size)(oset) );
314
315 // Re-insert remaining elements, to give OSetWord_Destroy something to
316 // work with.
317 for (i = 3; i < NN; i++) {
318 VG_(OSetWord_Insert)(oset, vs[i]);
319 }
320
321 // Print the list
322 OSet_Print(oset, "oset1b", wordToStr);
323
324 // Destroy the OSet
325 VG_(OSetWord_Destroy)(oset);
njn7b880bc2005-08-14 22:43:53 +0000326}
327
328
329//---------------------------------------------------------------------------
330// Struct example
331//---------------------------------------------------------------------------
332
333// This element shows that a key can be in the middle of the element, and
334// be of arbitrary size and even span multiple (contiguous) fields. It
335// also demonstrates how an OSet can be used to implement a list of
336// non-overlapping intervals.
337
338typedef struct {
339 Int b1;
340 Addr first;
341 Addr last;
342 Int b2;
343}
344Block;
345
346__attribute__((unused))
347static Char *blockToStr(void *p)
348{
349 static char buf[32];
350 Block* b = (Block*)p;
351 sprintf(buf, "<(%d) %lu..%lu (%d)>", b->b1, b->first, b->last, b->b2);
352 return buf;
353}
354
tom1d090eb2008-01-04 23:58:32 +0000355static Word blockCmp(const void* vkey, const void* velem)
njn7b880bc2005-08-14 22:43:53 +0000356{
tom1d090eb2008-01-04 23:58:32 +0000357 Addr key = *(const Addr*)vkey;
358 const Block* elem = (const Block*)velem;
njn7b880bc2005-08-14 22:43:53 +0000359
360 assert(elem->first <= elem->last);
361 if (key < elem->first) return -1;
362 if (key > elem->last) return 1;
363 return 0;
364}
365
366void example2(void)
367{
368 Int i, n;
369 Addr a;
370 Block* vs[NN];
371 Block v, prev;
372 Block *pv;
373
374 // Create a dynamic OSet of Blocks. This one uses slow (custom)
375 // comparisons.
njne2a9ad32007-09-17 05:30:48 +0000376 OSet* oset = VG_(OSetGen_Create)(offsetof(Block, first),
sewardjb8b79ad2008-03-03 01:35:41 +0000377 blockCmp,
sewardj9c606bd2008-09-18 18:12:50 +0000378 allocate_node, "oset_test.3", free_node);
njn7b880bc2005-08-14 22:43:53 +0000379
380 // Try some operations on an empty OSet to ensure they don't screw up.
njne2a9ad32007-09-17 05:30:48 +0000381 vg_assert( ! VG_(OSetGen_Contains)(oset, &v) );
382 vg_assert( ! VG_(OSetGen_Lookup)(oset, &v) );
383 vg_assert( ! VG_(OSetGen_Remove)(oset, &v) );
384 vg_assert( ! VG_(OSetGen_Next)(oset) );
385 vg_assert( 0 == VG_(OSetGen_Size)(oset) );
njn7b880bc2005-08-14 22:43:53 +0000386
387 // Create some inputs, with gaps -- intervals are 1..3, 11..13, ... -- but
388 // no dups, and shuffle them randomly.
389 for (i = 0; i < NN; i++) {
njne2a9ad32007-09-17 05:30:48 +0000390 vs[i] = VG_(OSetGen_AllocNode)(oset, sizeof(Block));
njn7b880bc2005-08-14 22:43:53 +0000391 vs[i]->b1 = i;
392 vs[i]->first = i*10 + 1;
393 vs[i]->last = vs[i]->first + 2;
394 vs[i]->b2 = i+1;
395 }
njne2a9ad32007-09-17 05:30:48 +0000396 seed = 0;
njn7b880bc2005-08-14 22:43:53 +0000397 for (i = 0; i < NN; i++) {
sewardj3d8dcf82006-10-17 01:25:13 +0000398 Int r1 = myrandom() % NN;
399 Int r2 = myrandom() % NN;
njn7b880bc2005-08-14 22:43:53 +0000400 Block* tmp = vs[r1];
401 vs[r1] = vs[r2];
402 vs[r2] = tmp;
403 }
404
405 // Insert the elements
406 for (i = 0; i < NN; i++) {
njne2a9ad32007-09-17 05:30:48 +0000407 VG_(OSetGen_Insert)(oset, vs[i]);
njn7b880bc2005-08-14 22:43:53 +0000408 }
409
410 // Check the size
njne2a9ad32007-09-17 05:30:48 +0000411 vg_assert( NN == VG_(OSetGen_Size)(oset) );
njn7b880bc2005-08-14 22:43:53 +0000412
413 // Check we can find all the elements we inserted, within the full range
414 // of each Block.
415 for (i = 0; i < NN; i++) {
njne2a9ad32007-09-17 05:30:48 +0000416 a = vs[i]->first + 0; assert( VG_(OSetGen_Contains)(oset, &a) );
417 a = vs[i]->first + 1; assert( VG_(OSetGen_Contains)(oset, &a) );
418 a = vs[i]->first + 2; assert( VG_(OSetGen_Contains)(oset, &a) );
njn7b880bc2005-08-14 22:43:53 +0000419 }
420
421 // Check we cannot find elements we did not insert, below and above the
422 // ranges of the inserted elements.
423 a = 0;
njne2a9ad32007-09-17 05:30:48 +0000424 assert( ! VG_(OSetGen_Contains)(oset, &a) );
njn7b880bc2005-08-14 22:43:53 +0000425 for (i = 0; i < NN; i++) {
njne2a9ad32007-09-17 05:30:48 +0000426 a = vs[i]->first - 1; assert( ! VG_(OSetGen_Contains)(oset, &a) );
427 a = vs[i]->first + 3; assert( ! VG_(OSetGen_Contains)(oset, &a) );
njn7b880bc2005-08-14 22:43:53 +0000428 }
429
430 // Check we can find all the elements we inserted, and the right values
431 // are returned.
432 for (i = 0; i < NN; i++) {
njne2a9ad32007-09-17 05:30:48 +0000433 a = vs[i]->first + 0; assert( vs[i] == VG_(OSetGen_Lookup)(oset, &a) );
434 a = vs[i]->first + 1; assert( vs[i] == VG_(OSetGen_Lookup)(oset, &a) );
435 a = vs[i]->first + 2; assert( vs[i] == VG_(OSetGen_Lookup)(oset, &a) );
436 assert( vs[i] == VG_(OSetGen_LookupWithCmp)(oset, &a, blockCmp) );
njn7b880bc2005-08-14 22:43:53 +0000437 }
438
439 // Check that we can iterate over the OSet elements in sorted order, and
440 // there is the right number of them.
441 n = 0;
442 pv = NULL;
443 prev.last = 0;
njne2a9ad32007-09-17 05:30:48 +0000444 VG_(OSetGen_ResetIter)(oset);
445 while ( (pv = VG_(OSetGen_Next)(oset)) ) {
njn7b880bc2005-08-14 22:43:53 +0000446 Block curr = *pv;
447 assert(prev.last < curr.first);
448 prev = curr;
449 n++;
450 }
451 assert(NN == n);
njne2a9ad32007-09-17 05:30:48 +0000452 vg_assert( ! VG_(OSetGen_Next)(oset) );
453 vg_assert( ! VG_(OSetGen_Next)(oset) );
njn7b880bc2005-08-14 22:43:53 +0000454
455 // Check that we can remove half of the elements, and that their values
456 // are as expected.
457 for (i = 0; i < NN; i += 2) {
njne2a9ad32007-09-17 05:30:48 +0000458 a = vs[i]->first; assert( vs[i] == VG_(OSetGen_Remove)(oset, &a) );
njn7b880bc2005-08-14 22:43:53 +0000459 }
460
461 // Check the size
njne2a9ad32007-09-17 05:30:48 +0000462 vg_assert( NN/2 == VG_(OSetGen_Size)(oset) );
njn7b880bc2005-08-14 22:43:53 +0000463
464 // Check we can find the remaining elements (with the right values).
465 for (i = 1; i < NN; i += 2) {
njne2a9ad32007-09-17 05:30:48 +0000466 a = vs[i]->first + 0; assert( vs[i] == VG_(OSetGen_Lookup)(oset, &a) );
467 a = vs[i]->first + 1; assert( vs[i] == VG_(OSetGen_Lookup)(oset, &a) );
468 a = vs[i]->first + 2; assert( vs[i] == VG_(OSetGen_Lookup)(oset, &a) );
njn7b880bc2005-08-14 22:43:53 +0000469 }
470
471 // Check we cannot find any of the elements we removed.
472 for (i = 0; i < NN; i += 2) {
njne2a9ad32007-09-17 05:30:48 +0000473 a = vs[i]->first + 0; assert( ! VG_(OSetGen_Contains)(oset, &a) );
474 a = vs[i]->first + 1; assert( ! VG_(OSetGen_Contains)(oset, &a) );
475 a = vs[i]->first + 2; assert( ! VG_(OSetGen_Contains)(oset, &a) );
njn7b880bc2005-08-14 22:43:53 +0000476 }
477
478 // Check that we can remove the remaining half of the elements, and that
479 // their values are as expected.
480 for (i = 1; i < NN; i += 2) {
njne2a9ad32007-09-17 05:30:48 +0000481 a = vs[i]->first; assert( vs[i] == VG_(OSetGen_Remove)(oset, &a) );
njn7b880bc2005-08-14 22:43:53 +0000482 }
483
484 // Try some more operations on the empty OSet to ensure they don't screw up.
njne2a9ad32007-09-17 05:30:48 +0000485 vg_assert( ! VG_(OSetGen_Contains)(oset, &v) );
486 vg_assert( ! VG_(OSetGen_Lookup)(oset, &v) );
487 vg_assert( ! VG_(OSetGen_Remove)(oset, &v) );
488 vg_assert( ! VG_(OSetGen_Next)(oset) );
489 vg_assert( 0 == VG_(OSetGen_Size)(oset) );
njn7b880bc2005-08-14 22:43:53 +0000490
njne2a9ad32007-09-17 05:30:48 +0000491 // Re-insert all elements, to give OSetGen_Destroy something to work with.
njn7b880bc2005-08-14 22:43:53 +0000492 for (i = 0; i < NN; i++) {
njne2a9ad32007-09-17 05:30:48 +0000493 VG_(OSetGen_Insert)(oset, vs[i]);
njn7b880bc2005-08-14 22:43:53 +0000494 }
495
496 // Destroy the OSet
njne2a9ad32007-09-17 05:30:48 +0000497 VG_(OSetGen_Destroy)(oset);
njn7b880bc2005-08-14 22:43:53 +0000498}
499
500//-----------------------------------------------------------------------
501// main()
502//-----------------------------------------------------------------------
503
504int main(void)
505{
506 example1();
njne2a9ad32007-09-17 05:30:48 +0000507 example1b();
njn7b880bc2005-08-14 22:43:53 +0000508 example2();
509 return 0;
510}