SkipListMap/Set refactoring
[libcds.git] / tests / test-hdr / set / hdr_skiplist_set.h
1 //$$CDS-header$$
2
3 #include "set/hdr_set.h"
4
5 namespace set {
6
7     class SkipListSetHdrTest: public HashSetHdrTest
8     {
9         typedef HashSetHdrTest base_class;
10
11         typedef base_class::other_item  wrapped_item;
12         typedef base_class::other_less  wrapped_less;
13
14         template <class Set, typename PrintStat >
15         void test()
16         {
17             Set s;
18             base_class::test_int_with( s );
19
20             static int const nLimit = 10000;
21             typedef typename Set::iterator          set_iterator;
22             typedef typename Set::const_iterator    const_set_iterator;
23             typedef typename Set::guarded_ptr       guarded_ptr;
24
25             int nCount = 0;
26             int nPrevKey = 0;
27             guarded_ptr gp;
28             int arrRandom[nLimit];
29             for ( int i = 0; i < nLimit; ++i )
30                 arrRandom[i] = i;
31             std::random_shuffle( arrRandom, arrRandom + nLimit );
32
33
34             // Test iterator - ascending order
35             s.clear();
36             CPPUNIT_ASSERT( s.empty() );
37
38             for ( int i = 0; i < nLimit; ++i ) {
39                 CPPUNIT_CHECK( !s.get(gp, i) );
40                 CPPUNIT_CHECK( gp.empty() );
41
42                 CPPUNIT_ASSERT( s.insert(i) );
43
44                 CPPUNIT_CHECK( s.get(gp, i));
45                 CPPUNIT_ASSERT( !gp.empty());
46                 CPPUNIT_CHECK( gp->nKey == i );
47                 CPPUNIT_CHECK( gp->nVal == i );
48                 gp.release();
49             }
50             CPPUNIT_MSG( PrintStat()(s, "Iterator test, ascending insert order") );
51
52             nCount = 0;
53             nPrevKey = 0;
54             for ( set_iterator it = s.begin(), itEnd = s.end(); it != itEnd; ++it ) {
55                 CPPUNIT_ASSERT( (*it).nKey == it->nVal );
56                 CPPUNIT_ASSERT( s.find( it->nKey ));
57                 it->nVal = (*it).nKey * 2;
58                 ++nCount;
59                 if ( it != s.begin() ) {
60                     CPPUNIT_ASSERT( nPrevKey + 1 == it->nKey );
61                 }
62                 nPrevKey = it->nKey;
63
64                 // get
65                 CPPUNIT_CHECK( s.get( gp, it->nKey ));
66                 CPPUNIT_ASSERT( !gp.empty() );
67                 CPPUNIT_CHECK( gp->nKey == it->nKey );
68                 CPPUNIT_CHECK( gp->nVal == it->nKey * 2 );
69                 gp.release();
70             }
71             CPPUNIT_ASSERT( nCount == nLimit );
72
73             nCount = 0;
74             for ( const_set_iterator it = s.cbegin(), itEnd = s.cend(); it != itEnd; ++it ) {
75                 CPPUNIT_ASSERT( (*it).nKey * 2 == it->nVal );
76                 ++nCount;
77                 if ( it != s.cbegin() ) {
78                     CPPUNIT_ASSERT( nPrevKey + 1 == it->nKey );
79                 }
80                 nPrevKey = it->nKey;
81             }
82             CPPUNIT_ASSERT( nCount == nLimit );
83
84             // Test iterator - descending order
85             s.clear();
86             CPPUNIT_ASSERT( s.empty() );
87
88             for ( int i = nLimit; i > 0; --i ) {
89                 CPPUNIT_CHECK( !s.get_with(gp, i-1, base_class::less<typename Set::value_type>() ) );
90                 CPPUNIT_CHECK( gp.empty() );
91
92                 CPPUNIT_ASSERT( s.insert( std::make_pair(i - 1, (i-1) * 2) ));
93
94                 // get_with
95                 CPPUNIT_CHECK( s.get_with(gp, i-1, base_class::less<typename Set::value_type>() ));
96                 CPPUNIT_ASSERT( !gp.empty());
97                 CPPUNIT_CHECK( gp->nKey == i-1 );
98                 CPPUNIT_CHECK( gp->nVal == (i-1) * 2 );
99                 gp.release();
100             }
101             CPPUNIT_MSG( PrintStat()(s, "Iterator test, descending insert order") );
102
103             nCount = 0;
104             nPrevKey = 0;
105             for ( set_iterator it = s.begin(), itEnd = s.end(); it != itEnd; ++it ) {
106                 CPPUNIT_ASSERT( (*it).nKey * 2 == it->nVal );
107                 CPPUNIT_ASSERT( s.find( it->nKey ));
108                 it->nVal = (*it).nKey;
109                 ++nCount;
110                 if ( it != s.begin() ) {
111                     CPPUNIT_ASSERT( nPrevKey + 1 == it->nKey );
112                 }
113                 nPrevKey = it->nKey;
114             }
115             CPPUNIT_ASSERT( nCount == nLimit );
116
117             nCount = 0;
118             for ( const_set_iterator it = s.cbegin(), itEnd = s.cend(); it != itEnd; ++it ) {
119                 CPPUNIT_ASSERT( (*it).nKey == it->nVal );
120                 ++nCount;
121                 if ( it != s.cbegin() ) {
122                     CPPUNIT_ASSERT( nPrevKey + 1 == it->nKey );
123                 }
124                 nPrevKey = it->nKey;
125             }
126             CPPUNIT_ASSERT( nCount == nLimit );
127
128             // Test iterator - random order
129             s.clear();
130             CPPUNIT_ASSERT( s.empty() );
131             {
132                 for ( int i = 0; i < nLimit; ++i )
133                     CPPUNIT_ASSERT( s.insert( arrRandom[i]) );
134                 CPPUNIT_MSG( PrintStat()(s, "Iterator test, random insert order") );
135             }
136
137             nCount = 0;
138             nPrevKey = 0;
139             for ( set_iterator it = s.begin(), itEnd = s.end(); it != itEnd; ++it ) {
140                 CPPUNIT_ASSERT( (*it).nKey == it->nVal );
141                 CPPUNIT_ASSERT( s.find( it->nKey ));
142                 it->nVal = (*it).nKey * 2;
143                 ++nCount;
144                 if ( it != s.begin() ) {
145                     CPPUNIT_ASSERT( nPrevKey + 1 == it->nKey );
146                 }
147                 nPrevKey = it->nKey;
148             }
149             CPPUNIT_ASSERT( nCount == nLimit );
150
151             nCount = 0;
152             for ( const_set_iterator it = s.cbegin(), itEnd = s.cend(); it != itEnd; ++it ) {
153                 CPPUNIT_ASSERT( (*it).nKey * 2 == it->nVal );
154                 ++nCount;
155                 if ( it != s.cbegin() ) {
156                     CPPUNIT_ASSERT( nPrevKey + 1 == it->nKey );
157                 }
158                 nPrevKey = it->nKey;
159             }
160             CPPUNIT_ASSERT( nCount == nLimit );
161
162             // extract test
163             {
164                 typedef typename base_class::less<typename Set::value_type> less_predicate;
165                 typename Set::guarded_ptr gp;
166
167                 // extract/get
168                 for ( int i = 0; i < nLimit; ++i ) {
169                     int nKey = arrRandom[i];
170                     CPPUNIT_ASSERT( s.get(gp, nKey));
171                     CPPUNIT_ASSERT( !gp.empty());
172                     CPPUNIT_CHECK( gp->nKey == nKey );
173                     CPPUNIT_CHECK( gp->nVal == nKey * 2);
174                     gp.release();
175
176                     CPPUNIT_ASSERT( s.extract(gp, nKey));
177                     CPPUNIT_ASSERT( !gp.empty());
178                     CPPUNIT_CHECK( gp->nKey == nKey );
179                     CPPUNIT_CHECK( gp->nVal == nKey * 2);
180                     gp.release();
181
182                     CPPUNIT_CHECK( !s.get(gp, nKey));
183                     CPPUNIT_ASSERT( gp.empty());
184                     CPPUNIT_ASSERT( !s.extract(gp, nKey));
185                     CPPUNIT_ASSERT( gp.empty());
186                 }
187                 CPPUNIT_ASSERT( s.empty() );
188
189                 // extract_with/get_with
190                 for ( int i = 0; i < nLimit; ++i )
191                     CPPUNIT_ASSERT( s.insert( arrRandom[i]) );
192
193                 for ( int i = 0; i < nLimit; ++i ) {
194                     int nKey = arrRandom[i];
195                     CPPUNIT_ASSERT( s.get_with(gp, wrapped_item(nKey), wrapped_less() ));
196                     CPPUNIT_ASSERT( !gp.empty());
197                     CPPUNIT_CHECK( gp->nKey == nKey );
198                     CPPUNIT_CHECK( gp->nVal == nKey );
199                     gp.release();
200
201                     CPPUNIT_ASSERT( s.extract_with(gp, wrapped_item(nKey), wrapped_less() ));
202                     CPPUNIT_ASSERT( !gp.empty());
203                     CPPUNIT_CHECK( gp->nKey == nKey );
204                     CPPUNIT_CHECK( gp->nVal == nKey );
205                     CPPUNIT_CHECK( !s.get_with(gp, wrapped_item(nKey), wrapped_less() ));
206                     CPPUNIT_ASSERT( !s.extract_with(gp, wrapped_item(nKey), wrapped_less() ));
207                     gp.release();
208                 }
209                 CPPUNIT_ASSERT( s.empty() );
210
211                 // extract_min
212                 for ( int i = 0; i < nLimit; ++i )
213                     CPPUNIT_ASSERT( s.insert( arrRandom[i]) );
214
215                 for ( int i = 0; i < nLimit; ++i ) {
216                     CPPUNIT_ASSERT( s.extract_min(gp));
217                     CPPUNIT_ASSERT( !gp.empty());
218                     CPPUNIT_CHECK( gp->nKey == i );
219                     CPPUNIT_CHECK( gp->nVal == i );
220                     CPPUNIT_CHECK( !s.get(gp, i ));
221                     gp.release();
222                 }
223                 CPPUNIT_ASSERT( s.empty() );
224                 CPPUNIT_CHECK( !s.extract_min(gp));
225                 CPPUNIT_ASSERT( gp.empty() );
226                 CPPUNIT_CHECK( !s.extract_max(gp));
227                 CPPUNIT_ASSERT( gp.empty() );
228
229                 // extract_max
230                 for ( int i = 0; i < nLimit; ++i )
231                     CPPUNIT_ASSERT( s.insert( arrRandom[i]) );
232
233                 for ( int i = nLimit-1; i >= 0; --i ) {
234                     CPPUNIT_ASSERT( s.extract_max(gp));
235                     CPPUNIT_ASSERT( !gp.empty());
236                     CPPUNIT_CHECK( gp->nKey == i );
237                     CPPUNIT_CHECK( gp->nVal == i );
238                     CPPUNIT_CHECK( !s.get(gp, i ));
239                     gp.release();
240                 }
241                 CPPUNIT_ASSERT( s.empty() );
242                 CPPUNIT_CHECK( !s.extract_min(gp));
243                 CPPUNIT_ASSERT( gp.empty() );
244                 CPPUNIT_CHECK( !s.extract_max(gp));
245                 CPPUNIT_ASSERT( gp.empty() );
246             }
247
248             CPPUNIT_MSG( PrintStat()(s, nullptr) );
249         }
250
251         template <class Set, typename PrintStat >
252         void test_nogc()
253         {
254             typedef typename Set::value_type        value_type;
255             typedef typename Set::iterator          iterator;
256             typedef typename Set::const_iterator    const_iterator;
257
258             Set s;
259             iterator it;
260
261             CPPUNIT_ASSERT( s.empty() );
262             CPPUNIT_ASSERT( check_size( s, 0 ));
263
264             // insert
265             it = s.insert( 10 );
266             CPPUNIT_ASSERT( it != s.end() );
267             CPPUNIT_ASSERT( it->key() == 10 );
268             CPPUNIT_ASSERT( it->val() == 10 );
269             CPPUNIT_ASSERT( !s.empty() );
270             CPPUNIT_ASSERT( check_size( s, 1 ));
271             CPPUNIT_ASSERT( s.insert( 10 ) == s.end() );
272
273             it = s.insert( std::make_pair( 50, 25 ));
274             CPPUNIT_ASSERT( it != s.end() );
275             CPPUNIT_ASSERT( it->key() == 50 );
276             CPPUNIT_ASSERT( it->val() == 25 );
277             CPPUNIT_ASSERT( !s.empty() );
278             CPPUNIT_ASSERT( check_size( s, 2 ));
279             CPPUNIT_ASSERT( s.insert( 50 ) == s.end() );
280
281             // ensure
282             std::pair< iterator, bool>  ensureResult;
283             ensureResult = s.ensure( 20 );
284             CPPUNIT_ASSERT( ensureResult.first != s.end() );
285             CPPUNIT_ASSERT( ensureResult.second  );
286             CPPUNIT_ASSERT( ensureResult.first->key() == 20 );
287             CPPUNIT_ASSERT( ensureResult.first->val() == 20 );
288             CPPUNIT_ASSERT( !s.empty() );
289             CPPUNIT_ASSERT( check_size( s, 3 ));
290
291             ensureResult = s.ensure( std::make_pair( 20, 200 ));
292             CPPUNIT_ASSERT( ensureResult.first != s.end() );
293             CPPUNIT_ASSERT( !ensureResult.second  );
294             CPPUNIT_ASSERT( ensureResult.first->key() == 20 );
295             CPPUNIT_ASSERT( ensureResult.first->val() == 20 );
296             CPPUNIT_ASSERT( !s.empty() );
297             CPPUNIT_ASSERT( check_size( s, 3 ));
298             ensureResult.first->nVal = 22;
299
300             ensureResult = s.ensure( std::make_pair( 30, 33 ));
301             CPPUNIT_ASSERT( ensureResult.first != s.end() );
302             CPPUNIT_ASSERT( ensureResult.second  );
303             CPPUNIT_ASSERT( ensureResult.first->key() == 30 );
304             CPPUNIT_ASSERT( ensureResult.first->val() == 33 );
305             CPPUNIT_ASSERT( !s.empty() );
306             CPPUNIT_ASSERT( check_size( s, 4 ));
307
308             // find
309             it = s.find( 10 );
310             CPPUNIT_ASSERT( it != s.end() );
311             CPPUNIT_ASSERT( it->key() == 10 );
312             CPPUNIT_ASSERT( it->val() == 10 );
313
314             it = s.find( 20 );
315             CPPUNIT_ASSERT( it != s.end() );
316             CPPUNIT_ASSERT( it->key() == 20 );
317             CPPUNIT_ASSERT( it->val() == 22 );
318
319             it = s.find_with( 30, base_class::less<value_type>() );
320             CPPUNIT_ASSERT( it != s.end() );
321             CPPUNIT_ASSERT( it->key() == 30 );
322             CPPUNIT_ASSERT( it->val() == 33 );
323
324             it = s.find( 40 );
325             CPPUNIT_ASSERT( it == s.end() );
326
327             it = s.find( 50 );
328             CPPUNIT_ASSERT( it != s.end() );
329             CPPUNIT_ASSERT( it->key() == 50 );
330             CPPUNIT_ASSERT( it->val() == 25 );
331
332             // emplace test
333             it = s.emplace( 151 ) ;  // key = 151,  val = 151
334             CPPUNIT_ASSERT( it != s.end() );
335             CPPUNIT_ASSERT( it->key() == 151 );
336             CPPUNIT_ASSERT( it->val() == 151 );
337
338             it = s.emplace( 174, 471 ) ; // key == 174, val = 471
339             CPPUNIT_ASSERT( it != s.end() );
340             CPPUNIT_ASSERT( it->key() == 174 );
341             CPPUNIT_ASSERT( it->val() == 471 );
342
343             it = s.emplace( std::make_pair( 190, 91 )) ; // key == 190, val = 91
344             CPPUNIT_ASSERT( it != s.end() );
345             CPPUNIT_ASSERT( it->key() == 190 );
346             CPPUNIT_ASSERT( it->val() == 91 );
347
348             it = s.find( 174 );
349             CPPUNIT_ASSERT( it != s.end() );
350             CPPUNIT_ASSERT( it->key() == 174 );
351             CPPUNIT_ASSERT( it->val() == 471 );
352
353             it = s.find( 190 );
354             CPPUNIT_ASSERT( it != s.end() );
355             CPPUNIT_ASSERT( it->key() == 190 );
356             CPPUNIT_ASSERT( it->val() == 91 );
357
358             it = s.find( 151 );
359             CPPUNIT_ASSERT( it != s.end() );
360             CPPUNIT_ASSERT( it->key() == 151 );
361             CPPUNIT_ASSERT( it->val() == 151 );
362
363             CPPUNIT_ASSERT( !s.empty() );
364             s.clear();
365             CPPUNIT_ASSERT( s.empty() );
366             CPPUNIT_ASSERT( check_size( s, 0 ));
367
368             // get_min test
369             for ( int i = 500; i > 0; --i ) {
370                 CPPUNIT_ASSERT( s.insert( std::make_pair( i, i * 2) ) != s.end() );
371
372                 typename Set::value_type * pVal = s.get_min();
373                 CPPUNIT_ASSERT( pVal != nullptr );
374                 CPPUNIT_CHECK( pVal->nKey == i );
375                 CPPUNIT_CHECK( pVal->nVal ==  i * 2 );
376             }
377             CPPUNIT_ASSERT( !s.empty() );
378             s.clear();
379             CPPUNIT_ASSERT( s.empty() );
380             CPPUNIT_ASSERT( check_size( s, 0 ));
381
382             CPPUNIT_CHECK( s.get_min() == nullptr );
383             CPPUNIT_CHECK( s.get_max() == nullptr );
384
385             // iterator test
386             for ( int i = 0; i < 500; ++i ) {
387                 CPPUNIT_ASSERT( s.insert( std::make_pair( i, i * 2) ) != s.end() );
388
389                 typename Set::value_type * pVal = s.get_max();
390                 CPPUNIT_ASSERT( pVal != nullptr );
391                 CPPUNIT_CHECK( pVal->nKey == i );
392                 CPPUNIT_CHECK( pVal->nVal == i * 2 );
393             }
394             CPPUNIT_ASSERT( !s.empty() );
395             CPPUNIT_ASSERT( check_size( s, 500 ));
396
397             for ( iterator it = s.begin(), itEnd = s.end(); it != itEnd; ++it ) {
398                 CPPUNIT_ASSERT( (*it).nKey * 2 == it->nVal );
399                 it->nVal = (*it).nKey;
400             }
401
402             Set const& refSet = s;
403             for ( const_iterator it = refSet.begin(), itEnd = refSet.end(); it != itEnd; ++it ) {
404                 CPPUNIT_ASSERT( (*it).nKey == it->nVal );
405             }
406         }
407
408     public:
409         void SkipList_HP_less();
410         void SkipList_HP_cmp();
411         void SkipList_HP_cmpless();
412         void SkipList_HP_less_stat();
413         void SkipList_HP_cmp_stat();
414         void SkipList_HP_cmpless_stat();
415         void SkipList_HP_xorshift_less();
416         void SkipList_HP_xorshift_cmp();
417         void SkipList_HP_xorshift_cmpless();
418         void SkipList_HP_xorshift_less_stat();
419         void SkipList_HP_xorshift_cmp_stat();
420         void SkipList_HP_xorshift_cmpless_stat();
421         void SkipList_HP_turbopas_less();
422         void SkipList_HP_turbopas_cmp();
423         void SkipList_HP_turbopas_cmpless();
424         void SkipList_HP_turbopas_less_stat();
425         void SkipList_HP_turbopas_cmp_stat();
426         void SkipList_HP_turbopas_cmpless_stat();
427         void SkipList_HP_michaelalloc_less();
428         void SkipList_HP_michaelalloc_cmp();
429         void SkipList_HP_michaelalloc_cmpless();
430         void SkipList_HP_michaelalloc_less_stat();
431         void SkipList_HP_michaelalloc_cmp_stat();
432         void SkipList_HP_michaelalloc_cmpless_stat();
433
434         void SkipList_DHP_less();
435         void SkipList_DHP_cmp();
436         void SkipList_DHP_cmpless();
437         void SkipList_DHP_less_stat();
438         void SkipList_DHP_cmp_stat();
439         void SkipList_DHP_cmpless_stat();
440         void SkipList_DHP_xorshift_less();
441         void SkipList_DHP_xorshift_cmp();
442         void SkipList_DHP_xorshift_cmpless();
443         void SkipList_DHP_xorshift_less_stat();
444         void SkipList_DHP_xorshift_cmp_stat();
445         void SkipList_DHP_xorshift_cmpless_stat();
446         void SkipList_DHP_turbopas_less();
447         void SkipList_DHP_turbopas_cmp();
448         void SkipList_DHP_turbopas_cmpless();
449         void SkipList_DHP_turbopas_less_stat();
450         void SkipList_DHP_turbopas_cmp_stat();
451         void SkipList_DHP_turbopas_cmpless_stat();
452         void SkipList_DHP_michaelalloc_less();
453         void SkipList_DHP_michaelalloc_cmp();
454         void SkipList_DHP_michaelalloc_cmpless();
455         void SkipList_DHP_michaelalloc_less_stat();
456         void SkipList_DHP_michaelalloc_cmp_stat();
457         void SkipList_DHP_michaelalloc_cmpless_stat();
458
459         void SkipList_NOGC_less();
460         void SkipList_NOGC_cmp();
461         void SkipList_NOGC_cmpless();
462         void SkipList_NOGC_less_stat();
463         void SkipList_NOGC_cmp_stat();
464         void SkipList_NOGC_cmpless_stat();
465         void SkipList_NOGC_xorshift_less();
466         void SkipList_NOGC_xorshift_cmp();
467         void SkipList_NOGC_xorshift_cmpless();
468         void SkipList_NOGC_xorshift_less_stat();
469         void SkipList_NOGC_xorshift_cmp_stat();
470         void SkipList_NOGC_xorshift_cmpless_stat();
471         void SkipList_NOGC_turbopas_less();
472         void SkipList_NOGC_turbopas_cmp();
473         void SkipList_NOGC_turbopas_cmpless();
474         void SkipList_NOGC_turbopas_less_stat();
475         void SkipList_NOGC_turbopas_cmp_stat();
476         void SkipList_NOGC_turbopas_cmpless_stat();
477         void SkipList_NOGC_michaelalloc_less();
478         void SkipList_NOGC_michaelalloc_cmp();
479         void SkipList_NOGC_michaelalloc_cmpless();
480         void SkipList_NOGC_michaelalloc_less_stat();
481         void SkipList_NOGC_michaelalloc_cmp_stat();
482         void SkipList_NOGC_michaelalloc_cmpless_stat();
483
484         CPPUNIT_TEST_SUITE(SkipListSetHdrTest)
485             CPPUNIT_TEST(SkipList_HP_less)
486             CPPUNIT_TEST(SkipList_HP_cmp)
487             CPPUNIT_TEST(SkipList_HP_cmpless)
488             CPPUNIT_TEST(SkipList_HP_less_stat)
489             CPPUNIT_TEST(SkipList_HP_cmp_stat)
490             CPPUNIT_TEST(SkipList_HP_cmpless_stat)
491             CPPUNIT_TEST(SkipList_HP_xorshift_less)
492             CPPUNIT_TEST(SkipList_HP_xorshift_cmp)
493             CPPUNIT_TEST(SkipList_HP_xorshift_cmpless)
494             CPPUNIT_TEST(SkipList_HP_xorshift_less_stat)
495             CPPUNIT_TEST(SkipList_HP_xorshift_cmp_stat)
496             CPPUNIT_TEST(SkipList_HP_xorshift_cmpless_stat)
497             CPPUNIT_TEST(SkipList_HP_turbopas_less)
498             CPPUNIT_TEST(SkipList_HP_turbopas_cmp)
499             CPPUNIT_TEST(SkipList_HP_turbopas_cmpless)
500             CPPUNIT_TEST(SkipList_HP_turbopas_less_stat)
501             CPPUNIT_TEST(SkipList_HP_turbopas_cmp_stat)
502             CPPUNIT_TEST(SkipList_HP_turbopas_cmpless_stat)
503             CPPUNIT_TEST(SkipList_HP_michaelalloc_less)
504             CPPUNIT_TEST(SkipList_HP_michaelalloc_cmp)
505             CPPUNIT_TEST(SkipList_HP_michaelalloc_cmpless)
506             CPPUNIT_TEST(SkipList_HP_michaelalloc_less_stat)
507             CPPUNIT_TEST(SkipList_HP_michaelalloc_cmp_stat)
508             CPPUNIT_TEST(SkipList_HP_michaelalloc_cmpless_stat)
509
510             CPPUNIT_TEST(SkipList_DHP_less)
511             CPPUNIT_TEST(SkipList_DHP_cmp)
512             CPPUNIT_TEST(SkipList_DHP_cmpless)
513             CPPUNIT_TEST(SkipList_DHP_less_stat)
514             CPPUNIT_TEST(SkipList_DHP_cmp_stat)
515             CPPUNIT_TEST(SkipList_DHP_cmpless_stat)
516             CPPUNIT_TEST(SkipList_DHP_xorshift_less)
517             CPPUNIT_TEST(SkipList_DHP_xorshift_cmp)
518             CPPUNIT_TEST(SkipList_DHP_xorshift_cmpless)
519             CPPUNIT_TEST(SkipList_DHP_xorshift_less_stat)
520             CPPUNIT_TEST(SkipList_DHP_xorshift_cmp_stat)
521             CPPUNIT_TEST(SkipList_DHP_xorshift_cmpless_stat)
522             CPPUNIT_TEST(SkipList_DHP_turbopas_less)
523             CPPUNIT_TEST(SkipList_DHP_turbopas_cmp)
524             CPPUNIT_TEST(SkipList_DHP_turbopas_cmpless)
525             CPPUNIT_TEST(SkipList_DHP_turbopas_less_stat)
526             CPPUNIT_TEST(SkipList_DHP_turbopas_cmp_stat)
527             CPPUNIT_TEST(SkipList_DHP_turbopas_cmpless_stat)
528             CPPUNIT_TEST(SkipList_DHP_michaelalloc_less)
529             CPPUNIT_TEST(SkipList_DHP_michaelalloc_cmp)
530             CPPUNIT_TEST(SkipList_DHP_michaelalloc_cmpless)
531             CPPUNIT_TEST(SkipList_DHP_michaelalloc_less_stat)
532             CPPUNIT_TEST(SkipList_DHP_michaelalloc_cmp_stat)
533             CPPUNIT_TEST(SkipList_DHP_michaelalloc_cmpless_stat)
534
535             CPPUNIT_TEST(SkipList_NOGC_less)
536             CPPUNIT_TEST(SkipList_NOGC_cmp)
537             CPPUNIT_TEST(SkipList_NOGC_cmpless)
538             CPPUNIT_TEST(SkipList_NOGC_less_stat)
539             CPPUNIT_TEST(SkipList_NOGC_cmp_stat)
540             CPPUNIT_TEST(SkipList_NOGC_cmpless_stat)
541             CPPUNIT_TEST(SkipList_NOGC_xorshift_less)
542             CPPUNIT_TEST(SkipList_NOGC_xorshift_cmp)
543             CPPUNIT_TEST(SkipList_NOGC_xorshift_cmpless)
544             CPPUNIT_TEST(SkipList_NOGC_xorshift_less_stat)
545             CPPUNIT_TEST(SkipList_NOGC_xorshift_cmp_stat)
546             CPPUNIT_TEST(SkipList_NOGC_xorshift_cmpless_stat)
547             CPPUNIT_TEST(SkipList_NOGC_turbopas_less)
548             CPPUNIT_TEST(SkipList_NOGC_turbopas_cmp)
549             CPPUNIT_TEST(SkipList_NOGC_turbopas_cmpless)
550             CPPUNIT_TEST(SkipList_NOGC_turbopas_less_stat)
551             CPPUNIT_TEST(SkipList_NOGC_turbopas_cmp_stat)
552             CPPUNIT_TEST(SkipList_NOGC_turbopas_cmpless_stat)
553             CPPUNIT_TEST(SkipList_NOGC_michaelalloc_less)
554             CPPUNIT_TEST(SkipList_NOGC_michaelalloc_cmp)
555             CPPUNIT_TEST(SkipList_NOGC_michaelalloc_cmpless)
556             CPPUNIT_TEST(SkipList_NOGC_michaelalloc_less_stat)
557             CPPUNIT_TEST(SkipList_NOGC_michaelalloc_cmp_stat)
558             CPPUNIT_TEST(SkipList_NOGC_michaelalloc_cmpless_stat)
559
560         CPPUNIT_TEST_SUITE_END()
561
562     };
563 }