Move libcds 1.6.0 from SVN
[libcds.git] / tests / test-hdr / set / hdr_skiplist_set_rcu.h
1 //$$CDS-header$$
2
3 #include "set/hdr_set.h"
4
5 namespace set {
6
7     class SkipListSetRCUHdrTest: 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::gc::scoped_lock   rcu_lock;
24
25             int nCount = 0;
26             int nPrevKey = 0;
27
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             // Test iterator - ascending order
34             s.clear();
35             CPPUNIT_ASSERT( s.empty() );
36
37             for ( int i = 0; i < nLimit; ++i ) {
38                 CPPUNIT_ASSERT( s.insert(i) );
39             }
40             CPPUNIT_MSG( PrintStat()(s, "Iterator test, ascending insert order") );
41
42             nCount = 0;
43             nPrevKey = 0;
44             {
45                 rcu_lock l;
46                 for ( set_iterator it = s.begin(), itEnd = s.end(); it != itEnd; ++it ) {
47                     CPPUNIT_ASSERT( (*it).nKey == it->nVal );
48                     CPPUNIT_ASSERT( s.find( it->nKey ));
49                     it->nVal = (*it).nKey * 2;
50                     ++nCount;
51                     if ( it != s.begin() ) {
52                         CPPUNIT_ASSERT( nPrevKey + 1 == it->nKey );
53                     }
54                     nPrevKey = it->nKey;
55                 }
56             }
57             CPPUNIT_ASSERT( nCount == nLimit );
58
59             nCount = 0;
60             {
61                 rcu_lock l;
62                 for ( const_set_iterator it = s.cbegin(), itEnd = s.cend(); it != itEnd; ++it ) {
63                     CPPUNIT_ASSERT( (*it).nKey * 2 == it->nVal );
64                     ++nCount;
65                     if ( it != s.cbegin() ) {
66                         CPPUNIT_ASSERT( nPrevKey + 1 == it->nKey );
67                     }
68                     nPrevKey = it->nKey;
69                 }
70             }
71             CPPUNIT_ASSERT( nCount == nLimit );
72
73             // Test iterator - descending order
74             s.clear();
75             CPPUNIT_ASSERT( s.empty() );
76
77             for ( int i = nLimit; i > 0; --i ) {
78                 CPPUNIT_ASSERT( s.insert( std::make_pair(i - 1, (i-1) * 2) ));
79             }
80             CPPUNIT_MSG( PrintStat()(s, "Iterator test, descending insert order") );
81
82             nCount = 0;
83             nPrevKey = 0;
84             {
85                 rcu_lock l;
86                 for ( set_iterator it = s.begin(), itEnd = s.end(); it != itEnd; ++it ) {
87                     CPPUNIT_ASSERT( (*it).nKey * 2 == it->nVal );
88                     CPPUNIT_ASSERT( s.find( it->nKey ));
89                     it->nVal = (*it).nKey;
90                     ++nCount;
91                     if ( it != s.begin() ) {
92                         CPPUNIT_ASSERT( nPrevKey + 1 == it->nKey );
93                     }
94                     nPrevKey = it->nKey;
95                 }
96             }
97             CPPUNIT_ASSERT( nCount == nLimit );
98
99             nCount = 0;
100             {
101                 rcu_lock l;
102                 for ( const_set_iterator it = s.cbegin(), itEnd = s.cend(); it != itEnd; ++it ) {
103                     CPPUNIT_ASSERT( (*it).nKey == it->nVal );
104                     ++nCount;
105                     if ( it != s.cbegin() ) {
106                         CPPUNIT_ASSERT( nPrevKey + 1 == it->nKey );
107                     }
108                     nPrevKey = it->nKey;
109                 }
110             }
111             CPPUNIT_ASSERT( nCount == nLimit );
112
113             // Test iterator - random order
114             s.clear();
115             CPPUNIT_ASSERT( s.empty() );
116             {
117                 for ( int i = 0; i < nLimit; ++i ) {
118                     CPPUNIT_ASSERT( s.insert( arrRandom[i] ) );
119                 }
120                 CPPUNIT_MSG( PrintStat()(s, "Iterator test, random insert order") );
121             }
122
123             nCount = 0;
124             nPrevKey = 0;
125             {
126                 rcu_lock l;
127                 for ( set_iterator it = s.begin(), itEnd = s.end(); it != itEnd; ++it ) {
128                     CPPUNIT_ASSERT( (*it).nKey == it->nVal );
129                     CPPUNIT_ASSERT( s.find( it->nKey ));
130                     it->nVal = (*it).nKey * 2;
131                     ++nCount;
132                     if ( it != s.begin() ) {
133                         CPPUNIT_ASSERT( nPrevKey + 1 == it->nKey );
134                     }
135                     nPrevKey = it->nKey;
136                 }
137             }
138             CPPUNIT_ASSERT( nCount == nLimit );
139
140             nCount = 0;
141             {
142                 rcu_lock l;
143                 for ( const_set_iterator it = s.cbegin(), itEnd = s.cend(); it != itEnd; ++it ) {
144                     CPPUNIT_ASSERT( (*it).nKey * 2 == it->nVal );
145                     ++nCount;
146                     if ( it != s.cbegin() ) {
147                         CPPUNIT_ASSERT( nPrevKey + 1 == it->nKey );
148                     }
149                     nPrevKey = it->nKey;
150                 }
151             }
152             CPPUNIT_ASSERT( nCount == nLimit );
153
154             // extract/get tests
155             {
156                 typedef typename base_class::less<typename Set::value_type> less_predicate;
157                 typename Set::value_type * pVal;
158                 typename Set::exempt_ptr ep;
159
160                 // extract/get
161                 for ( int i = 0; i < nLimit; ++i ) {
162                     int nKey = arrRandom[i];
163                     {
164                         rcu_lock l;
165                         pVal = s.get( nKey );
166                         CPPUNIT_ASSERT( pVal != NULL );
167                         CPPUNIT_CHECK( pVal->nKey == nKey );
168                         CPPUNIT_CHECK( pVal->nVal == nKey * 2 );
169                     }
170
171                     CPPUNIT_ASSERT( s.extract( ep, nKey ));
172                     CPPUNIT_ASSERT( !ep.empty() );
173                     CPPUNIT_CHECK( ep->nKey == nKey );
174                     CPPUNIT_CHECK( ep->nVal == nKey * 2 );
175                     ep.release();
176
177                     {
178                         rcu_lock l;
179                         CPPUNIT_CHECK( s.get( nKey ) == NULL );
180                     }
181                     CPPUNIT_CHECK( !s.extract( ep, nKey ));
182                 }
183                 CPPUNIT_CHECK( s.empty());
184
185                 // extract_with/get_with
186                 for ( int i = 0; i < nLimit; ++i )
187                     CPPUNIT_ASSERT( s.insert( arrRandom[i]) );
188
189                 for ( int i = 0; i < nLimit; ++i ) {
190                     int nKey = arrRandom[i];
191                     {
192                         rcu_lock l;
193                         pVal = s.get_with( wrapped_item(nKey), wrapped_less() );
194                         CPPUNIT_ASSERT( pVal != NULL );
195                         CPPUNIT_CHECK( pVal->nKey == nKey );
196                         CPPUNIT_CHECK( pVal->nVal == nKey );
197                     }
198
199                     CPPUNIT_ASSERT( s.extract_with( ep, wrapped_item(nKey), wrapped_less() ));
200                     CPPUNIT_ASSERT( !ep.empty() );
201                     CPPUNIT_CHECK( ep->nKey == nKey );
202                     CPPUNIT_CHECK( ep->nVal == nKey );
203                     ep.release();
204
205                     {
206                         rcu_lock l;
207                         CPPUNIT_CHECK( s.get_with( wrapped_item(nKey), wrapped_less() ) == NULL );
208                     }
209                     CPPUNIT_CHECK( !s.extract_with( ep, wrapped_item(nKey), wrapped_less() ));
210                 }
211                 CPPUNIT_CHECK( s.empty());
212
213                 // extract_min
214                 for ( int i = 0; i < nLimit; ++i )
215                     CPPUNIT_ASSERT( s.insert( arrRandom[i]) );
216
217                 for ( int i = 0; i < nLimit; ++i ) {
218                     CPPUNIT_ASSERT( s.extract_min(ep) );
219                     CPPUNIT_ASSERT( !ep.empty() );
220                     CPPUNIT_CHECK( ep->nKey == i );
221                     CPPUNIT_CHECK( ep->nVal == i );
222                     CPPUNIT_CHECK( !s.find(i) );
223                     ep.release();
224                 }
225                 CPPUNIT_CHECK( s.empty());
226
227                 // extract_max
228                 for ( int i = 0; i < nLimit; ++i )
229                     CPPUNIT_ASSERT( s.insert( arrRandom[i]) );
230
231                 for ( int i = nLimit-1; i >= 0; --i ) {
232                     CPPUNIT_ASSERT( s.extract_max(ep) );
233                     CPPUNIT_ASSERT( !ep.empty() );
234                     CPPUNIT_CHECK( ep->nKey == i );
235                     CPPUNIT_CHECK( ep->nVal == i );
236                     CPPUNIT_CHECK( !s.find(i) );
237                     ep.release();
238                 }
239                 CPPUNIT_CHECK( s.empty());
240                 CPPUNIT_CHECK( !s.extract_min(ep) );
241                 CPPUNIT_CHECK( !s.extract_max(ep) );
242             }
243
244             CPPUNIT_MSG( PrintStat()(s, NULL) );
245         }
246
247     public:
248         void SkipList_RCU_GPI_less();
249         void SkipList_RCU_GPI_cmp();
250         void SkipList_RCU_GPI_cmpless();
251         void SkipList_RCU_GPI_less_stat();
252         void SkipList_RCU_GPI_cmp_stat();
253         void SkipList_RCU_GPI_cmpless_stat();
254         void SkipList_RCU_GPI_xorshift_less();
255         void SkipList_RCU_GPI_xorshift_cmp();
256         void SkipList_RCU_GPI_xorshift_cmpless();
257         void SkipList_RCU_GPI_xorshift_less_stat();
258         void SkipList_RCU_GPI_xorshift_cmp_stat();
259         void SkipList_RCU_GPI_xorshift_cmpless_stat();
260         void SkipList_RCU_GPI_turbopas_less();
261         void SkipList_RCU_GPI_turbopas_cmp();
262         void SkipList_RCU_GPI_turbopas_cmpless();
263         void SkipList_RCU_GPI_turbopas_less_stat();
264         void SkipList_RCU_GPI_turbopas_cmp_stat();
265         void SkipList_RCU_GPI_turbopas_cmpless_stat();
266         void SkipList_RCU_GPI_michaelalloc_less();
267         void SkipList_RCU_GPI_michaelalloc_cmp();
268         void SkipList_RCU_GPI_michaelalloc_cmpless();
269         void SkipList_RCU_GPI_michaelalloc_less_stat();
270         void SkipList_RCU_GPI_michaelalloc_cmp_stat();
271         void SkipList_RCU_GPI_michaelalloc_cmpless_stat();
272
273         void SkipList_RCU_GPB_less();
274         void SkipList_RCU_GPB_cmp();
275         void SkipList_RCU_GPB_cmpless();
276         void SkipList_RCU_GPB_less_stat();
277         void SkipList_RCU_GPB_cmp_stat();
278         void SkipList_RCU_GPB_cmpless_stat();
279         void SkipList_RCU_GPB_xorshift_less();
280         void SkipList_RCU_GPB_xorshift_cmp();
281         void SkipList_RCU_GPB_xorshift_cmpless();
282         void SkipList_RCU_GPB_xorshift_less_stat();
283         void SkipList_RCU_GPB_xorshift_cmp_stat();
284         void SkipList_RCU_GPB_xorshift_cmpless_stat();
285         void SkipList_RCU_GPB_turbopas_less();
286         void SkipList_RCU_GPB_turbopas_cmp();
287         void SkipList_RCU_GPB_turbopas_cmpless();
288         void SkipList_RCU_GPB_turbopas_less_stat();
289         void SkipList_RCU_GPB_turbopas_cmp_stat();
290         void SkipList_RCU_GPB_turbopas_cmpless_stat();
291         void SkipList_RCU_GPB_michaelalloc_less();
292         void SkipList_RCU_GPB_michaelalloc_cmp();
293         void SkipList_RCU_GPB_michaelalloc_cmpless();
294         void SkipList_RCU_GPB_michaelalloc_less_stat();
295         void SkipList_RCU_GPB_michaelalloc_cmp_stat();
296         void SkipList_RCU_GPB_michaelalloc_cmpless_stat();
297
298         void SkipList_RCU_GPT_less();
299         void SkipList_RCU_GPT_cmp();
300         void SkipList_RCU_GPT_cmpless();
301         void SkipList_RCU_GPT_less_stat();
302         void SkipList_RCU_GPT_cmp_stat();
303         void SkipList_RCU_GPT_cmpless_stat();
304         void SkipList_RCU_GPT_xorshift_less();
305         void SkipList_RCU_GPT_xorshift_cmp();
306         void SkipList_RCU_GPT_xorshift_cmpless();
307         void SkipList_RCU_GPT_xorshift_less_stat();
308         void SkipList_RCU_GPT_xorshift_cmp_stat();
309         void SkipList_RCU_GPT_xorshift_cmpless_stat();
310         void SkipList_RCU_GPT_turbopas_less();
311         void SkipList_RCU_GPT_turbopas_cmp();
312         void SkipList_RCU_GPT_turbopas_cmpless();
313         void SkipList_RCU_GPT_turbopas_less_stat();
314         void SkipList_RCU_GPT_turbopas_cmp_stat();
315         void SkipList_RCU_GPT_turbopas_cmpless_stat();
316         void SkipList_RCU_GPT_michaelalloc_less();
317         void SkipList_RCU_GPT_michaelalloc_cmp();
318         void SkipList_RCU_GPT_michaelalloc_cmpless();
319         void SkipList_RCU_GPT_michaelalloc_less_stat();
320         void SkipList_RCU_GPT_michaelalloc_cmp_stat();
321         void SkipList_RCU_GPT_michaelalloc_cmpless_stat();
322
323         void SkipList_RCU_SHB_less();
324         void SkipList_RCU_SHB_cmp();
325         void SkipList_RCU_SHB_cmpless();
326         void SkipList_RCU_SHB_less_stat();
327         void SkipList_RCU_SHB_cmp_stat();
328         void SkipList_RCU_SHB_cmpless_stat();
329         void SkipList_RCU_SHB_xorshift_less();
330         void SkipList_RCU_SHB_xorshift_cmp();
331         void SkipList_RCU_SHB_xorshift_cmpless();
332         void SkipList_RCU_SHB_xorshift_less_stat();
333         void SkipList_RCU_SHB_xorshift_cmp_stat();
334         void SkipList_RCU_SHB_xorshift_cmpless_stat();
335         void SkipList_RCU_SHB_turbopas_less();
336         void SkipList_RCU_SHB_turbopas_cmp();
337         void SkipList_RCU_SHB_turbopas_cmpless();
338         void SkipList_RCU_SHB_turbopas_less_stat();
339         void SkipList_RCU_SHB_turbopas_cmp_stat();
340         void SkipList_RCU_SHB_turbopas_cmpless_stat();
341         void SkipList_RCU_SHB_michaelalloc_less();
342         void SkipList_RCU_SHB_michaelalloc_cmp();
343         void SkipList_RCU_SHB_michaelalloc_cmpless();
344         void SkipList_RCU_SHB_michaelalloc_less_stat();
345         void SkipList_RCU_SHB_michaelalloc_cmp_stat();
346         void SkipList_RCU_SHB_michaelalloc_cmpless_stat();
347
348         void SkipList_RCU_SHT_less();
349         void SkipList_RCU_SHT_cmp();
350         void SkipList_RCU_SHT_cmpless();
351         void SkipList_RCU_SHT_less_stat();
352         void SkipList_RCU_SHT_cmp_stat();
353         void SkipList_RCU_SHT_cmpless_stat();
354         void SkipList_RCU_SHT_xorshift_less();
355         void SkipList_RCU_SHT_xorshift_cmp();
356         void SkipList_RCU_SHT_xorshift_cmpless();
357         void SkipList_RCU_SHT_xorshift_less_stat();
358         void SkipList_RCU_SHT_xorshift_cmp_stat();
359         void SkipList_RCU_SHT_xorshift_cmpless_stat();
360         void SkipList_RCU_SHT_turbopas_less();
361         void SkipList_RCU_SHT_turbopas_cmp();
362         void SkipList_RCU_SHT_turbopas_cmpless();
363         void SkipList_RCU_SHT_turbopas_less_stat();
364         void SkipList_RCU_SHT_turbopas_cmp_stat();
365         void SkipList_RCU_SHT_turbopas_cmpless_stat();
366         void SkipList_RCU_SHT_michaelalloc_less();
367         void SkipList_RCU_SHT_michaelalloc_cmp();
368         void SkipList_RCU_SHT_michaelalloc_cmpless();
369         void SkipList_RCU_SHT_michaelalloc_less_stat();
370         void SkipList_RCU_SHT_michaelalloc_cmp_stat();
371         void SkipList_RCU_SHT_michaelalloc_cmpless_stat();
372
373         CPPUNIT_TEST_SUITE(SkipListSetRCUHdrTest)
374             CPPUNIT_TEST(SkipList_RCU_GPI_less)
375             CPPUNIT_TEST(SkipList_RCU_GPI_cmp)
376             CPPUNIT_TEST(SkipList_RCU_GPI_cmpless)
377             CPPUNIT_TEST(SkipList_RCU_GPI_less_stat)
378             CPPUNIT_TEST(SkipList_RCU_GPI_cmp_stat)
379             CPPUNIT_TEST(SkipList_RCU_GPI_cmpless_stat)
380             CPPUNIT_TEST(SkipList_RCU_GPI_xorshift_less)
381             CPPUNIT_TEST(SkipList_RCU_GPI_xorshift_cmp)
382             CPPUNIT_TEST(SkipList_RCU_GPI_xorshift_cmpless)
383             CPPUNIT_TEST(SkipList_RCU_GPI_xorshift_less_stat)
384             CPPUNIT_TEST(SkipList_RCU_GPI_xorshift_cmp_stat)
385             CPPUNIT_TEST(SkipList_RCU_GPI_xorshift_cmpless_stat)
386             CPPUNIT_TEST(SkipList_RCU_GPI_turbopas_less)
387             CPPUNIT_TEST(SkipList_RCU_GPI_turbopas_cmp)
388             CPPUNIT_TEST(SkipList_RCU_GPI_turbopas_cmpless)
389             CPPUNIT_TEST(SkipList_RCU_GPI_turbopas_less_stat)
390             CPPUNIT_TEST(SkipList_RCU_GPI_turbopas_cmp_stat)
391             CPPUNIT_TEST(SkipList_RCU_GPI_turbopas_cmpless_stat)
392             CPPUNIT_TEST(SkipList_RCU_GPI_michaelalloc_less)
393             CPPUNIT_TEST(SkipList_RCU_GPI_michaelalloc_cmp)
394             CPPUNIT_TEST(SkipList_RCU_GPI_michaelalloc_cmpless)
395             CPPUNIT_TEST(SkipList_RCU_GPI_michaelalloc_less_stat)
396             CPPUNIT_TEST(SkipList_RCU_GPI_michaelalloc_cmp_stat)
397             CPPUNIT_TEST(SkipList_RCU_GPI_michaelalloc_cmpless_stat)
398
399             CPPUNIT_TEST(SkipList_RCU_GPB_less)
400             CPPUNIT_TEST(SkipList_RCU_GPB_cmp)
401             CPPUNIT_TEST(SkipList_RCU_GPB_cmpless)
402             CPPUNIT_TEST(SkipList_RCU_GPB_less_stat)
403             CPPUNIT_TEST(SkipList_RCU_GPB_cmp_stat)
404             CPPUNIT_TEST(SkipList_RCU_GPB_cmpless_stat)
405             CPPUNIT_TEST(SkipList_RCU_GPB_xorshift_less)
406             CPPUNIT_TEST(SkipList_RCU_GPB_xorshift_cmp)
407             CPPUNIT_TEST(SkipList_RCU_GPB_xorshift_cmpless)
408             CPPUNIT_TEST(SkipList_RCU_GPB_xorshift_less_stat)
409             CPPUNIT_TEST(SkipList_RCU_GPB_xorshift_cmp_stat)
410             CPPUNIT_TEST(SkipList_RCU_GPB_xorshift_cmpless_stat)
411             CPPUNIT_TEST(SkipList_RCU_GPB_turbopas_less)
412             CPPUNIT_TEST(SkipList_RCU_GPB_turbopas_cmp)
413             CPPUNIT_TEST(SkipList_RCU_GPB_turbopas_cmpless)
414             CPPUNIT_TEST(SkipList_RCU_GPB_turbopas_less_stat)
415             CPPUNIT_TEST(SkipList_RCU_GPB_turbopas_cmp_stat)
416             CPPUNIT_TEST(SkipList_RCU_GPB_turbopas_cmpless_stat)
417             CPPUNIT_TEST(SkipList_RCU_GPB_michaelalloc_less)
418             CPPUNIT_TEST(SkipList_RCU_GPB_michaelalloc_cmp)
419             CPPUNIT_TEST(SkipList_RCU_GPB_michaelalloc_cmpless)
420             CPPUNIT_TEST(SkipList_RCU_GPB_michaelalloc_less_stat)
421             CPPUNIT_TEST(SkipList_RCU_GPB_michaelalloc_cmp_stat)
422             CPPUNIT_TEST(SkipList_RCU_GPB_michaelalloc_cmpless_stat)
423
424             CPPUNIT_TEST(SkipList_RCU_GPT_less)
425             CPPUNIT_TEST(SkipList_RCU_GPT_cmp)
426             CPPUNIT_TEST(SkipList_RCU_GPT_cmpless)
427             CPPUNIT_TEST(SkipList_RCU_GPT_less_stat)
428             CPPUNIT_TEST(SkipList_RCU_GPT_cmp_stat)
429             CPPUNIT_TEST(SkipList_RCU_GPT_cmpless_stat)
430             CPPUNIT_TEST(SkipList_RCU_GPT_xorshift_less)
431             CPPUNIT_TEST(SkipList_RCU_GPT_xorshift_cmp)
432             CPPUNIT_TEST(SkipList_RCU_GPT_xorshift_cmpless)
433             CPPUNIT_TEST(SkipList_RCU_GPT_xorshift_less_stat)
434             CPPUNIT_TEST(SkipList_RCU_GPT_xorshift_cmp_stat)
435             CPPUNIT_TEST(SkipList_RCU_GPT_xorshift_cmpless_stat)
436             CPPUNIT_TEST(SkipList_RCU_GPT_turbopas_less)
437             CPPUNIT_TEST(SkipList_RCU_GPT_turbopas_cmp)
438             CPPUNIT_TEST(SkipList_RCU_GPT_turbopas_cmpless)
439             CPPUNIT_TEST(SkipList_RCU_GPT_turbopas_less_stat)
440             CPPUNIT_TEST(SkipList_RCU_GPT_turbopas_cmp_stat)
441             CPPUNIT_TEST(SkipList_RCU_GPT_turbopas_cmpless_stat)
442             CPPUNIT_TEST(SkipList_RCU_GPT_michaelalloc_less)
443             CPPUNIT_TEST(SkipList_RCU_GPT_michaelalloc_cmp)
444             CPPUNIT_TEST(SkipList_RCU_GPT_michaelalloc_cmpless)
445             CPPUNIT_TEST(SkipList_RCU_GPT_michaelalloc_less_stat)
446             CPPUNIT_TEST(SkipList_RCU_GPT_michaelalloc_cmp_stat)
447             CPPUNIT_TEST(SkipList_RCU_GPT_michaelalloc_cmpless_stat)
448
449             CPPUNIT_TEST(SkipList_RCU_SHB_less)
450             CPPUNIT_TEST(SkipList_RCU_SHB_cmp)
451             CPPUNIT_TEST(SkipList_RCU_SHB_cmpless)
452             CPPUNIT_TEST(SkipList_RCU_SHB_less_stat)
453             CPPUNIT_TEST(SkipList_RCU_SHB_cmp_stat)
454             CPPUNIT_TEST(SkipList_RCU_SHB_cmpless_stat)
455             CPPUNIT_TEST(SkipList_RCU_SHB_xorshift_less)
456             CPPUNIT_TEST(SkipList_RCU_SHB_xorshift_cmp)
457             CPPUNIT_TEST(SkipList_RCU_SHB_xorshift_cmpless)
458             CPPUNIT_TEST(SkipList_RCU_SHB_xorshift_less_stat)
459             CPPUNIT_TEST(SkipList_RCU_SHB_xorshift_cmp_stat)
460             CPPUNIT_TEST(SkipList_RCU_SHB_xorshift_cmpless_stat)
461             CPPUNIT_TEST(SkipList_RCU_SHB_turbopas_less)
462             CPPUNIT_TEST(SkipList_RCU_SHB_turbopas_cmp)
463             CPPUNIT_TEST(SkipList_RCU_SHB_turbopas_cmpless)
464             CPPUNIT_TEST(SkipList_RCU_SHB_turbopas_less_stat)
465             CPPUNIT_TEST(SkipList_RCU_SHB_turbopas_cmp_stat)
466             CPPUNIT_TEST(SkipList_RCU_SHB_turbopas_cmpless_stat)
467             CPPUNIT_TEST(SkipList_RCU_SHB_michaelalloc_less)
468             CPPUNIT_TEST(SkipList_RCU_SHB_michaelalloc_cmp)
469             CPPUNIT_TEST(SkipList_RCU_SHB_michaelalloc_cmpless)
470             CPPUNIT_TEST(SkipList_RCU_SHB_michaelalloc_less_stat)
471             CPPUNIT_TEST(SkipList_RCU_SHB_michaelalloc_cmp_stat)
472             CPPUNIT_TEST(SkipList_RCU_SHB_michaelalloc_cmpless_stat)
473
474             CPPUNIT_TEST(SkipList_RCU_SHT_less)
475             CPPUNIT_TEST(SkipList_RCU_SHT_cmp)
476             CPPUNIT_TEST(SkipList_RCU_SHT_cmpless)
477             CPPUNIT_TEST(SkipList_RCU_SHT_less_stat)
478             CPPUNIT_TEST(SkipList_RCU_SHT_cmp_stat)
479             CPPUNIT_TEST(SkipList_RCU_SHT_cmpless_stat)
480             CPPUNIT_TEST(SkipList_RCU_SHT_xorshift_less)
481             CPPUNIT_TEST(SkipList_RCU_SHT_xorshift_cmp)
482             CPPUNIT_TEST(SkipList_RCU_SHT_xorshift_cmpless)
483             CPPUNIT_TEST(SkipList_RCU_SHT_xorshift_less_stat)
484             CPPUNIT_TEST(SkipList_RCU_SHT_xorshift_cmp_stat)
485             CPPUNIT_TEST(SkipList_RCU_SHT_xorshift_cmpless_stat)
486             CPPUNIT_TEST(SkipList_RCU_SHT_turbopas_less)
487             CPPUNIT_TEST(SkipList_RCU_SHT_turbopas_cmp)
488             CPPUNIT_TEST(SkipList_RCU_SHT_turbopas_cmpless)
489             CPPUNIT_TEST(SkipList_RCU_SHT_turbopas_less_stat)
490             CPPUNIT_TEST(SkipList_RCU_SHT_turbopas_cmp_stat)
491             CPPUNIT_TEST(SkipList_RCU_SHT_turbopas_cmpless_stat)
492             CPPUNIT_TEST(SkipList_RCU_SHT_michaelalloc_less)
493             CPPUNIT_TEST(SkipList_RCU_SHT_michaelalloc_cmp)
494             CPPUNIT_TEST(SkipList_RCU_SHT_michaelalloc_cmpless)
495             CPPUNIT_TEST(SkipList_RCU_SHT_michaelalloc_less_stat)
496             CPPUNIT_TEST(SkipList_RCU_SHT_michaelalloc_cmp_stat)
497             CPPUNIT_TEST(SkipList_RCU_SHT_michaelalloc_cmpless_stat)
498
499         CPPUNIT_TEST_SUITE_END()
500
501     };
502 }