movable exempt_ptr: SkipList
[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 != nullptr );
167                         CPPUNIT_CHECK( pVal->nKey == nKey );
168                         CPPUNIT_CHECK( pVal->nVal == nKey * 2 );
169                     }
170
171                     ep = s.extract( nKey );
172                     CPPUNIT_ASSERT( ep );
173                     CPPUNIT_ASSERT( !ep.empty() );
174                     CPPUNIT_CHECK( ep->nKey == nKey );
175                     CPPUNIT_CHECK( ep->nVal == nKey * 2 );
176
177                     {
178                         rcu_lock l;
179                         CPPUNIT_CHECK( s.get( nKey ) == nullptr );
180                     }
181                     ep = s.extract( nKey );
182                     CPPUNIT_CHECK( !ep );
183                 }
184                 CPPUNIT_CHECK( s.empty());
185
186                 // extract_with/get_with
187                 for ( int i = 0; i < nLimit; ++i )
188                     CPPUNIT_ASSERT( s.insert( arrRandom[i]) );
189
190                 for ( int i = 0; i < nLimit; ++i ) {
191                     int nKey = arrRandom[i];
192                     {
193                         rcu_lock l;
194                         pVal = s.get_with( wrapped_item(nKey), wrapped_less() );
195                         CPPUNIT_ASSERT( pVal != nullptr );
196                         CPPUNIT_CHECK( pVal->nKey == nKey );
197                         CPPUNIT_CHECK( pVal->nVal == nKey );
198                     }
199
200                     ep = s.extract_with( wrapped_item( nKey ), wrapped_less() );
201                     CPPUNIT_ASSERT( ep );
202                     CPPUNIT_ASSERT( !ep.empty() );
203                     CPPUNIT_CHECK( ep->nKey == nKey );
204                     CPPUNIT_CHECK( ep->nVal == nKey );
205
206                     {
207                         rcu_lock l;
208                         CPPUNIT_CHECK( s.get_with( wrapped_item( nKey ), wrapped_less() ) == nullptr );
209                     }
210                     ep = s.extract_with( wrapped_item( nKey ), wrapped_less() );
211                     CPPUNIT_CHECK( !ep );
212                 }
213                 CPPUNIT_CHECK( s.empty());
214
215                 // extract_min
216                 for ( int i = 0; i < nLimit; ++i )
217                     CPPUNIT_ASSERT( s.insert( arrRandom[i]) );
218
219                 for ( int i = 0; i < nLimit; ++i ) {
220                     ep = s.extract_min();
221                     CPPUNIT_ASSERT( ep );
222                     CPPUNIT_ASSERT( !ep.empty() );
223                     CPPUNIT_CHECK( ep->nKey == i );
224                     CPPUNIT_CHECK( ep->nVal == i );
225                     CPPUNIT_CHECK( !s.find(i) );
226                 }
227                 CPPUNIT_CHECK( s.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                     ep = s.extract_max();
235                     CPPUNIT_ASSERT( ep );
236                     CPPUNIT_ASSERT( !ep.empty() );
237                     CPPUNIT_CHECK( ep->nKey == i );
238                     CPPUNIT_CHECK( ep->nVal == i );
239                     CPPUNIT_CHECK( !s.find(i) );
240                 }
241                 CPPUNIT_CHECK( s.empty());
242                 ep = s.extract_min();
243                 CPPUNIT_CHECK( !ep );
244                 CPPUNIT_CHECK( !s.extract_max() );
245             }
246
247             CPPUNIT_MSG( PrintStat()(s, nullptr) );
248         }
249
250     public:
251         void SkipList_RCU_GPI_less();
252         void SkipList_RCU_GPI_cmp();
253         void SkipList_RCU_GPI_cmpless();
254         void SkipList_RCU_GPI_less_stat();
255         void SkipList_RCU_GPI_cmp_stat();
256         void SkipList_RCU_GPI_cmpless_stat();
257         void SkipList_RCU_GPI_xorshift_less();
258         void SkipList_RCU_GPI_xorshift_cmp();
259         void SkipList_RCU_GPI_xorshift_cmpless();
260         void SkipList_RCU_GPI_xorshift_less_stat();
261         void SkipList_RCU_GPI_xorshift_cmp_stat();
262         void SkipList_RCU_GPI_xorshift_cmpless_stat();
263         void SkipList_RCU_GPI_turbopas_less();
264         void SkipList_RCU_GPI_turbopas_cmp();
265         void SkipList_RCU_GPI_turbopas_cmpless();
266         void SkipList_RCU_GPI_turbopas_less_stat();
267         void SkipList_RCU_GPI_turbopas_cmp_stat();
268         void SkipList_RCU_GPI_turbopas_cmpless_stat();
269         void SkipList_RCU_GPI_michaelalloc_less();
270         void SkipList_RCU_GPI_michaelalloc_cmp();
271         void SkipList_RCU_GPI_michaelalloc_cmpless();
272         void SkipList_RCU_GPI_michaelalloc_less_stat();
273         void SkipList_RCU_GPI_michaelalloc_cmp_stat();
274         void SkipList_RCU_GPI_michaelalloc_cmpless_stat();
275
276         void SkipList_RCU_GPB_less();
277         void SkipList_RCU_GPB_cmp();
278         void SkipList_RCU_GPB_cmpless();
279         void SkipList_RCU_GPB_less_stat();
280         void SkipList_RCU_GPB_cmp_stat();
281         void SkipList_RCU_GPB_cmpless_stat();
282         void SkipList_RCU_GPB_xorshift_less();
283         void SkipList_RCU_GPB_xorshift_cmp();
284         void SkipList_RCU_GPB_xorshift_cmpless();
285         void SkipList_RCU_GPB_xorshift_less_stat();
286         void SkipList_RCU_GPB_xorshift_cmp_stat();
287         void SkipList_RCU_GPB_xorshift_cmpless_stat();
288         void SkipList_RCU_GPB_turbopas_less();
289         void SkipList_RCU_GPB_turbopas_cmp();
290         void SkipList_RCU_GPB_turbopas_cmpless();
291         void SkipList_RCU_GPB_turbopas_less_stat();
292         void SkipList_RCU_GPB_turbopas_cmp_stat();
293         void SkipList_RCU_GPB_turbopas_cmpless_stat();
294         void SkipList_RCU_GPB_michaelalloc_less();
295         void SkipList_RCU_GPB_michaelalloc_cmp();
296         void SkipList_RCU_GPB_michaelalloc_cmpless();
297         void SkipList_RCU_GPB_michaelalloc_less_stat();
298         void SkipList_RCU_GPB_michaelalloc_cmp_stat();
299         void SkipList_RCU_GPB_michaelalloc_cmpless_stat();
300
301         void SkipList_RCU_GPT_less();
302         void SkipList_RCU_GPT_cmp();
303         void SkipList_RCU_GPT_cmpless();
304         void SkipList_RCU_GPT_less_stat();
305         void SkipList_RCU_GPT_cmp_stat();
306         void SkipList_RCU_GPT_cmpless_stat();
307         void SkipList_RCU_GPT_xorshift_less();
308         void SkipList_RCU_GPT_xorshift_cmp();
309         void SkipList_RCU_GPT_xorshift_cmpless();
310         void SkipList_RCU_GPT_xorshift_less_stat();
311         void SkipList_RCU_GPT_xorshift_cmp_stat();
312         void SkipList_RCU_GPT_xorshift_cmpless_stat();
313         void SkipList_RCU_GPT_turbopas_less();
314         void SkipList_RCU_GPT_turbopas_cmp();
315         void SkipList_RCU_GPT_turbopas_cmpless();
316         void SkipList_RCU_GPT_turbopas_less_stat();
317         void SkipList_RCU_GPT_turbopas_cmp_stat();
318         void SkipList_RCU_GPT_turbopas_cmpless_stat();
319         void SkipList_RCU_GPT_michaelalloc_less();
320         void SkipList_RCU_GPT_michaelalloc_cmp();
321         void SkipList_RCU_GPT_michaelalloc_cmpless();
322         void SkipList_RCU_GPT_michaelalloc_less_stat();
323         void SkipList_RCU_GPT_michaelalloc_cmp_stat();
324         void SkipList_RCU_GPT_michaelalloc_cmpless_stat();
325
326         void SkipList_RCU_SHB_less();
327         void SkipList_RCU_SHB_cmp();
328         void SkipList_RCU_SHB_cmpless();
329         void SkipList_RCU_SHB_less_stat();
330         void SkipList_RCU_SHB_cmp_stat();
331         void SkipList_RCU_SHB_cmpless_stat();
332         void SkipList_RCU_SHB_xorshift_less();
333         void SkipList_RCU_SHB_xorshift_cmp();
334         void SkipList_RCU_SHB_xorshift_cmpless();
335         void SkipList_RCU_SHB_xorshift_less_stat();
336         void SkipList_RCU_SHB_xorshift_cmp_stat();
337         void SkipList_RCU_SHB_xorshift_cmpless_stat();
338         void SkipList_RCU_SHB_turbopas_less();
339         void SkipList_RCU_SHB_turbopas_cmp();
340         void SkipList_RCU_SHB_turbopas_cmpless();
341         void SkipList_RCU_SHB_turbopas_less_stat();
342         void SkipList_RCU_SHB_turbopas_cmp_stat();
343         void SkipList_RCU_SHB_turbopas_cmpless_stat();
344         void SkipList_RCU_SHB_michaelalloc_less();
345         void SkipList_RCU_SHB_michaelalloc_cmp();
346         void SkipList_RCU_SHB_michaelalloc_cmpless();
347         void SkipList_RCU_SHB_michaelalloc_less_stat();
348         void SkipList_RCU_SHB_michaelalloc_cmp_stat();
349         void SkipList_RCU_SHB_michaelalloc_cmpless_stat();
350
351         void SkipList_RCU_SHT_less();
352         void SkipList_RCU_SHT_cmp();
353         void SkipList_RCU_SHT_cmpless();
354         void SkipList_RCU_SHT_less_stat();
355         void SkipList_RCU_SHT_cmp_stat();
356         void SkipList_RCU_SHT_cmpless_stat();
357         void SkipList_RCU_SHT_xorshift_less();
358         void SkipList_RCU_SHT_xorshift_cmp();
359         void SkipList_RCU_SHT_xorshift_cmpless();
360         void SkipList_RCU_SHT_xorshift_less_stat();
361         void SkipList_RCU_SHT_xorshift_cmp_stat();
362         void SkipList_RCU_SHT_xorshift_cmpless_stat();
363         void SkipList_RCU_SHT_turbopas_less();
364         void SkipList_RCU_SHT_turbopas_cmp();
365         void SkipList_RCU_SHT_turbopas_cmpless();
366         void SkipList_RCU_SHT_turbopas_less_stat();
367         void SkipList_RCU_SHT_turbopas_cmp_stat();
368         void SkipList_RCU_SHT_turbopas_cmpless_stat();
369         void SkipList_RCU_SHT_michaelalloc_less();
370         void SkipList_RCU_SHT_michaelalloc_cmp();
371         void SkipList_RCU_SHT_michaelalloc_cmpless();
372         void SkipList_RCU_SHT_michaelalloc_less_stat();
373         void SkipList_RCU_SHT_michaelalloc_cmp_stat();
374         void SkipList_RCU_SHT_michaelalloc_cmpless_stat();
375
376         CPPUNIT_TEST_SUITE(SkipListSetRCUHdrTest)
377             CPPUNIT_TEST(SkipList_RCU_GPI_less)
378             CPPUNIT_TEST(SkipList_RCU_GPI_cmp)
379             CPPUNIT_TEST(SkipList_RCU_GPI_cmpless)
380             CPPUNIT_TEST(SkipList_RCU_GPI_less_stat)
381             CPPUNIT_TEST(SkipList_RCU_GPI_cmp_stat)
382             CPPUNIT_TEST(SkipList_RCU_GPI_cmpless_stat)
383             CPPUNIT_TEST(SkipList_RCU_GPI_xorshift_less)
384             CPPUNIT_TEST(SkipList_RCU_GPI_xorshift_cmp)
385             CPPUNIT_TEST(SkipList_RCU_GPI_xorshift_cmpless)
386             CPPUNIT_TEST(SkipList_RCU_GPI_xorshift_less_stat)
387             CPPUNIT_TEST(SkipList_RCU_GPI_xorshift_cmp_stat)
388             CPPUNIT_TEST(SkipList_RCU_GPI_xorshift_cmpless_stat)
389             CPPUNIT_TEST(SkipList_RCU_GPI_turbopas_less)
390             CPPUNIT_TEST(SkipList_RCU_GPI_turbopas_cmp)
391             CPPUNIT_TEST(SkipList_RCU_GPI_turbopas_cmpless)
392             CPPUNIT_TEST(SkipList_RCU_GPI_turbopas_less_stat)
393             CPPUNIT_TEST(SkipList_RCU_GPI_turbopas_cmp_stat)
394             CPPUNIT_TEST(SkipList_RCU_GPI_turbopas_cmpless_stat)
395             CPPUNIT_TEST(SkipList_RCU_GPI_michaelalloc_less)
396             CPPUNIT_TEST(SkipList_RCU_GPI_michaelalloc_cmp)
397             CPPUNIT_TEST(SkipList_RCU_GPI_michaelalloc_cmpless)
398             CPPUNIT_TEST(SkipList_RCU_GPI_michaelalloc_less_stat)
399             CPPUNIT_TEST(SkipList_RCU_GPI_michaelalloc_cmp_stat)
400             CPPUNIT_TEST(SkipList_RCU_GPI_michaelalloc_cmpless_stat)
401
402             CPPUNIT_TEST(SkipList_RCU_GPB_less)
403             CPPUNIT_TEST(SkipList_RCU_GPB_cmp)
404             CPPUNIT_TEST(SkipList_RCU_GPB_cmpless)
405             CPPUNIT_TEST(SkipList_RCU_GPB_less_stat)
406             CPPUNIT_TEST(SkipList_RCU_GPB_cmp_stat)
407             CPPUNIT_TEST(SkipList_RCU_GPB_cmpless_stat)
408             CPPUNIT_TEST(SkipList_RCU_GPB_xorshift_less)
409             CPPUNIT_TEST(SkipList_RCU_GPB_xorshift_cmp)
410             CPPUNIT_TEST(SkipList_RCU_GPB_xorshift_cmpless)
411             CPPUNIT_TEST(SkipList_RCU_GPB_xorshift_less_stat)
412             CPPUNIT_TEST(SkipList_RCU_GPB_xorshift_cmp_stat)
413             CPPUNIT_TEST(SkipList_RCU_GPB_xorshift_cmpless_stat)
414             CPPUNIT_TEST(SkipList_RCU_GPB_turbopas_less)
415             CPPUNIT_TEST(SkipList_RCU_GPB_turbopas_cmp)
416             CPPUNIT_TEST(SkipList_RCU_GPB_turbopas_cmpless)
417             CPPUNIT_TEST(SkipList_RCU_GPB_turbopas_less_stat)
418             CPPUNIT_TEST(SkipList_RCU_GPB_turbopas_cmp_stat)
419             CPPUNIT_TEST(SkipList_RCU_GPB_turbopas_cmpless_stat)
420             CPPUNIT_TEST(SkipList_RCU_GPB_michaelalloc_less)
421             CPPUNIT_TEST(SkipList_RCU_GPB_michaelalloc_cmp)
422             CPPUNIT_TEST(SkipList_RCU_GPB_michaelalloc_cmpless)
423             CPPUNIT_TEST(SkipList_RCU_GPB_michaelalloc_less_stat)
424             CPPUNIT_TEST(SkipList_RCU_GPB_michaelalloc_cmp_stat)
425             CPPUNIT_TEST(SkipList_RCU_GPB_michaelalloc_cmpless_stat)
426
427             CPPUNIT_TEST(SkipList_RCU_GPT_less)
428             CPPUNIT_TEST(SkipList_RCU_GPT_cmp)
429             CPPUNIT_TEST(SkipList_RCU_GPT_cmpless)
430             CPPUNIT_TEST(SkipList_RCU_GPT_less_stat)
431             CPPUNIT_TEST(SkipList_RCU_GPT_cmp_stat)
432             CPPUNIT_TEST(SkipList_RCU_GPT_cmpless_stat)
433             CPPUNIT_TEST(SkipList_RCU_GPT_xorshift_less)
434             CPPUNIT_TEST(SkipList_RCU_GPT_xorshift_cmp)
435             CPPUNIT_TEST(SkipList_RCU_GPT_xorshift_cmpless)
436             CPPUNIT_TEST(SkipList_RCU_GPT_xorshift_less_stat)
437             CPPUNIT_TEST(SkipList_RCU_GPT_xorshift_cmp_stat)
438             CPPUNIT_TEST(SkipList_RCU_GPT_xorshift_cmpless_stat)
439             CPPUNIT_TEST(SkipList_RCU_GPT_turbopas_less)
440             CPPUNIT_TEST(SkipList_RCU_GPT_turbopas_cmp)
441             CPPUNIT_TEST(SkipList_RCU_GPT_turbopas_cmpless)
442             CPPUNIT_TEST(SkipList_RCU_GPT_turbopas_less_stat)
443             CPPUNIT_TEST(SkipList_RCU_GPT_turbopas_cmp_stat)
444             CPPUNIT_TEST(SkipList_RCU_GPT_turbopas_cmpless_stat)
445             CPPUNIT_TEST(SkipList_RCU_GPT_michaelalloc_less)
446             CPPUNIT_TEST(SkipList_RCU_GPT_michaelalloc_cmp)
447             CPPUNIT_TEST(SkipList_RCU_GPT_michaelalloc_cmpless)
448             CPPUNIT_TEST(SkipList_RCU_GPT_michaelalloc_less_stat)
449             CPPUNIT_TEST(SkipList_RCU_GPT_michaelalloc_cmp_stat)
450             CPPUNIT_TEST(SkipList_RCU_GPT_michaelalloc_cmpless_stat)
451
452             CPPUNIT_TEST(SkipList_RCU_SHB_less)
453             CPPUNIT_TEST(SkipList_RCU_SHB_cmp)
454             CPPUNIT_TEST(SkipList_RCU_SHB_cmpless)
455             CPPUNIT_TEST(SkipList_RCU_SHB_less_stat)
456             CPPUNIT_TEST(SkipList_RCU_SHB_cmp_stat)
457             CPPUNIT_TEST(SkipList_RCU_SHB_cmpless_stat)
458             CPPUNIT_TEST(SkipList_RCU_SHB_xorshift_less)
459             CPPUNIT_TEST(SkipList_RCU_SHB_xorshift_cmp)
460             CPPUNIT_TEST(SkipList_RCU_SHB_xorshift_cmpless)
461             CPPUNIT_TEST(SkipList_RCU_SHB_xorshift_less_stat)
462             CPPUNIT_TEST(SkipList_RCU_SHB_xorshift_cmp_stat)
463             CPPUNIT_TEST(SkipList_RCU_SHB_xorshift_cmpless_stat)
464             CPPUNIT_TEST(SkipList_RCU_SHB_turbopas_less)
465             CPPUNIT_TEST(SkipList_RCU_SHB_turbopas_cmp)
466             CPPUNIT_TEST(SkipList_RCU_SHB_turbopas_cmpless)
467             CPPUNIT_TEST(SkipList_RCU_SHB_turbopas_less_stat)
468             CPPUNIT_TEST(SkipList_RCU_SHB_turbopas_cmp_stat)
469             CPPUNIT_TEST(SkipList_RCU_SHB_turbopas_cmpless_stat)
470             CPPUNIT_TEST(SkipList_RCU_SHB_michaelalloc_less)
471             CPPUNIT_TEST(SkipList_RCU_SHB_michaelalloc_cmp)
472             CPPUNIT_TEST(SkipList_RCU_SHB_michaelalloc_cmpless)
473             CPPUNIT_TEST(SkipList_RCU_SHB_michaelalloc_less_stat)
474             CPPUNIT_TEST(SkipList_RCU_SHB_michaelalloc_cmp_stat)
475             CPPUNIT_TEST(SkipList_RCU_SHB_michaelalloc_cmpless_stat)
476
477             CPPUNIT_TEST(SkipList_RCU_SHT_less)
478             CPPUNIT_TEST(SkipList_RCU_SHT_cmp)
479             CPPUNIT_TEST(SkipList_RCU_SHT_cmpless)
480             CPPUNIT_TEST(SkipList_RCU_SHT_less_stat)
481             CPPUNIT_TEST(SkipList_RCU_SHT_cmp_stat)
482             CPPUNIT_TEST(SkipList_RCU_SHT_cmpless_stat)
483             CPPUNIT_TEST(SkipList_RCU_SHT_xorshift_less)
484             CPPUNIT_TEST(SkipList_RCU_SHT_xorshift_cmp)
485             CPPUNIT_TEST(SkipList_RCU_SHT_xorshift_cmpless)
486             CPPUNIT_TEST(SkipList_RCU_SHT_xorshift_less_stat)
487             CPPUNIT_TEST(SkipList_RCU_SHT_xorshift_cmp_stat)
488             CPPUNIT_TEST(SkipList_RCU_SHT_xorshift_cmpless_stat)
489             CPPUNIT_TEST(SkipList_RCU_SHT_turbopas_less)
490             CPPUNIT_TEST(SkipList_RCU_SHT_turbopas_cmp)
491             CPPUNIT_TEST(SkipList_RCU_SHT_turbopas_cmpless)
492             CPPUNIT_TEST(SkipList_RCU_SHT_turbopas_less_stat)
493             CPPUNIT_TEST(SkipList_RCU_SHT_turbopas_cmp_stat)
494             CPPUNIT_TEST(SkipList_RCU_SHT_turbopas_cmpless_stat)
495             CPPUNIT_TEST(SkipList_RCU_SHT_michaelalloc_less)
496             CPPUNIT_TEST(SkipList_RCU_SHT_michaelalloc_cmp)
497             CPPUNIT_TEST(SkipList_RCU_SHT_michaelalloc_cmpless)
498             CPPUNIT_TEST(SkipList_RCU_SHT_michaelalloc_less_stat)
499             CPPUNIT_TEST(SkipList_RCU_SHT_michaelalloc_cmp_stat)
500             CPPUNIT_TEST(SkipList_RCU_SHT_michaelalloc_cmpless_stat)
501
502         CPPUNIT_TEST_SUITE_END()
503
504     };
505 }