Move libcds 1.6.0 from SVN
[libcds.git] / tests / test-hdr / set / hdr_intrusive_skiplist_set_rcu.h
1 //$$CDS-header$$
2
3 #include "set/hdr_intrusive_set.h"
4
5 namespace set {
6
7     class IntrusiveSkipListSetRCU: public IntrusiveHashSetHdrTest
8     {
9         typedef IntrusiveHashSetHdrTest base_class;
10
11         static size_t const c_nArrSize = 1000;
12
13         template <typename Set>
14         struct extract_disposer {
15             void operator()( typename Set::value_type * pVal ) const
16             {
17                 pVal->nVal = 0;
18             }
19         };
20
21     protected:
22         struct other_key {
23             int nKey;
24
25             other_key()
26             {}
27
28             other_key( int key )
29                 : nKey(key)
30             {}
31
32             template <typename Q>
33             other_key& operator=( Q const& src )
34             {
35                 nKey = src.nKey;
36                 return *this;
37             }
38         };
39
40         template <typename StoredType>
41         struct other_key_less
42         {
43             bool operator ()( StoredType const& n, other_key k ) const
44             {
45                 return n.nKey < k.nKey;
46             }
47             bool operator ()( other_key k, StoredType const& n ) const
48             {
49                 return k.nKey < n.nKey;
50             }
51         };
52
53         struct copy_other_key
54         {
55             template <typename Q>
56             void operator()( other_key& dest, Q const& src ) const
57             {
58                 dest.nKey = src.nKey;
59             }
60         };
61
62     protected:
63
64         template <class Set, typename PrintStat>
65         void test_skiplist()
66         {
67             {
68                 Set s;
69                 base_class::test_int_with( s );
70             }
71
72             test_skiplist_<Set, PrintStat >();
73         }
74
75         template <class Set, typename PrintStat>
76         void test_skiplist_()
77         {
78             Set s;
79             s.clear();
80             CPPUNIT_ASSERT( s.empty() );
81             CPPUNIT_ASSERT( check_size( s, 0 ));
82
83             typedef typename Set::gc::scoped_lock   rcu_lock;
84             typedef typename Set::value_type        value_type;
85             typedef typename Set::iterator          set_iterator;
86             typedef typename Set::const_iterator    const_set_iterator;
87
88             value_type  v[c_nArrSize];
89             int nCount = 0;
90             int nPrevKey = 0;
91
92             // Test iterator - ascending order
93             for ( int i = 0; i < (int) (sizeof(v)/sizeof(v[0])); ++i ) {
94                 v[i].nKey = i;
95                 v[i].nVal = i * 2;
96
97                 CPPUNIT_ASSERT( s.insert( v[i] ));
98             }
99             CPPUNIT_ASSERT( check_size( s, sizeof(v)/sizeof(v[0]) ));
100
101             //CPPUNIT_MSG( PrintStat()(s, "Iterator test, ascending insert order") );
102
103             nCount = 0;
104             nPrevKey = 0;
105             {
106                 rcu_lock l;
107                 for ( set_iterator it = s.begin(), itEnd = s.end(); it != itEnd; ++it ) {
108                     CPPUNIT_ASSERT( (*it).nKey * 2 == it->nVal );
109                     CPPUNIT_ASSERT( s.find( it->nKey ));
110                     it->nVal = (*it).nKey;
111                     ++nCount;
112                     if ( it != s.begin() ) {
113                         CPPUNIT_ASSERT( nPrevKey + 1 == it->nKey );
114                     }
115                     nPrevKey = it->nKey;
116                 }
117             }
118             CPPUNIT_ASSERT( check_size( s, sizeof(v)/sizeof(v[0]) ));
119             CPPUNIT_ASSERT( nCount == sizeof(v)/sizeof(v[0]));
120
121             nCount = 0;
122             {
123                 rcu_lock l;
124                 for ( const_set_iterator it = s.cbegin(), itEnd = s.cend(); it != itEnd; ++it ) {
125                     CPPUNIT_ASSERT( (*it).nKey == it->nVal );
126                     ++nCount;
127                     if ( it != s.cbegin() ) {
128                         CPPUNIT_ASSERT( nPrevKey + 1 == it->nKey );
129                     }
130                     nPrevKey = it->nKey;
131                 }
132             }
133             CPPUNIT_CHECK( check_size( s, sizeof(v)/sizeof(v[0]) ));
134             CPPUNIT_CHECK( nCount == sizeof(v)/sizeof(v[0]));
135
136             for ( size_t i = 0; i < sizeof(v)/sizeof(v[0]); ++i ) {
137                 CPPUNIT_ASSERT( v[i].nKey == v[i].nVal );
138                 CPPUNIT_ASSERT( s.find( v[i].nKey ));
139             }
140
141             s.clear();
142             CPPUNIT_CHECK( s.empty() );
143             CPPUNIT_CHECK( check_size( s, 0));
144             Set::gc::force_dispose();
145
146             for ( size_t i = 0; i < (int) sizeof(v)/sizeof(v[0]); ++i ) {
147                 CPPUNIT_CHECK( v[i].nDisposeCount == 1 );
148             }
149
150             // Test iterator - descending order
151             for ( int i = (int) sizeof(v)/sizeof(v[0]) - 1; i >= 0; --i ) {
152                 v[i].nKey = i;
153                 v[i].nVal = i * 2;
154
155                 CPPUNIT_ASSERT( s.insert( v[i] ));
156             }
157             CPPUNIT_CHECK( check_size( s, sizeof(v)/sizeof(v[0]) ));
158
159             //CPPUNIT_MSG( PrintStat()(s, "Iterator test, descending insert order") );
160
161             nCount = 0;
162             {
163                 rcu_lock l;
164                 for ( set_iterator it = s.begin(), itEnd = s.end(); it != itEnd; ++it ) {
165                     CPPUNIT_ASSERT( (*it).nKey * 2 == it->nVal );
166                     it->nVal = (*it).nKey;
167                     ++nCount;
168                     if ( it != s.begin() ) {
169                         CPPUNIT_ASSERT( nPrevKey + 1 == it->nKey );
170                     }
171                     nPrevKey = it->nKey;
172                 }
173             }
174             CPPUNIT_ASSERT( check_size( s, sizeof(v)/sizeof(v[0]) ));
175             CPPUNIT_ASSERT( nCount == sizeof(v)/sizeof(v[0]));
176
177             nCount = 0;
178             {
179                 rcu_lock l;
180                 for ( const_set_iterator it = s.cbegin(), itEnd = s.cend(); it != itEnd; ++it ) {
181                     CPPUNIT_ASSERT( (*it).nKey == it->nVal );
182                     ++nCount;
183                     if ( it != s.cbegin() ) {
184                         CPPUNIT_ASSERT( nPrevKey + 1 == it->nKey );
185                     }
186                     nPrevKey = it->nKey;
187                 }
188             }
189             CPPUNIT_ASSERT( check_size( s, sizeof(v)/sizeof(v[0]) ));
190             CPPUNIT_ASSERT( nCount == sizeof(v)/sizeof(v[0]));
191
192             for ( size_t i = 0; i < sizeof(v)/sizeof(v[0]); ++i ) {
193                 CPPUNIT_ASSERT( v[i].nKey == v[i].nVal );
194             }
195
196             s.clear();
197             CPPUNIT_ASSERT( s.empty() );
198             CPPUNIT_ASSERT( check_size( s, 0 ));
199             Set::gc::force_dispose();
200
201             for ( size_t i = 0; i < sizeof(v)/sizeof(v[0]); ++i ) {
202                 CPPUNIT_ASSERT( v[i].nDisposeCount == 2 );
203             }
204
205             // Test iterator - random order
206             fill_skiplist( s, v );
207             CPPUNIT_ASSERT( check_size( s, sizeof(v)/sizeof(v[0]) ));
208             //CPPUNIT_MSG( PrintStat()(s, "Iterator test, random insert order") );
209
210             nCount = 0;
211             {
212                 rcu_lock l;
213                 for ( set_iterator it = s.begin(), itEnd = s.end(); it != itEnd; ++it ) {
214                     CPPUNIT_ASSERT( (*it).nKey * 2 == it->nVal );
215                     it->nVal = (*it).nKey;
216                     ++nCount;
217                     if ( it != s.begin() ) {
218                         CPPUNIT_ASSERT( nPrevKey + 1 == it->nKey );
219                     }
220                     nPrevKey = it->nKey;
221                 }
222             }
223             CPPUNIT_ASSERT( check_size( s, sizeof(v)/sizeof(v[0]) ));
224             CPPUNIT_ASSERT( nCount == sizeof(v)/sizeof(v[0]));
225
226             nCount = 0;
227             {
228                 rcu_lock l;
229                 for ( const_set_iterator it = s.cbegin(), itEnd = s.cend(); it != itEnd; ++it ) {
230                     CPPUNIT_ASSERT( (*it).nKey == it->nVal );
231                     ++nCount;
232                     if ( it != s.cbegin() ) {
233                         CPPUNIT_ASSERT( nPrevKey + 1 == it->nKey );
234                     }
235                     nPrevKey = it->nKey;
236                 }
237             }
238             CPPUNIT_ASSERT( check_size( s, sizeof(v)/sizeof(v[0]) ));
239             CPPUNIT_ASSERT( nCount == sizeof(v)/sizeof(v[0]));
240
241             for ( size_t i = 0; i < sizeof(v)/sizeof(v[0]); ++i ) {
242                 CPPUNIT_ASSERT( v[i].nKey == v[i].nVal );
243             }
244
245             s.clear();
246             CPPUNIT_ASSERT( s.empty() );
247             CPPUNIT_ASSERT( check_size( s, 0 ));
248             Set::gc::force_dispose();
249
250             for ( size_t i = 0; i < sizeof(v)/sizeof(v[0]); ++i ) {
251                 CPPUNIT_ASSERT( v[i].nDisposeCount == 3 );
252             }
253
254             // extract/get test
255             {
256                 typename Set::exempt_ptr ep;
257                 // extract
258                 {
259                     fill_skiplist( s, v );
260                     value_type * pVal;
261                     for ( int i = c_nArrSize - 1; i >= 0; i -= 1 ) {
262                         {
263                             rcu_lock l;
264                             pVal = s.get( i );
265                             CPPUNIT_ASSERT( pVal != NULL );
266                             CPPUNIT_CHECK( pVal->nKey == i );
267                             CPPUNIT_CHECK( pVal->nVal == i * 2 );
268                             pVal->nVal *= 2;
269                         }
270
271                         CPPUNIT_ASSERT( s.extract( ep, i ));
272                         CPPUNIT_ASSERT( !ep.empty() );
273                         CPPUNIT_CHECK( ep->nKey == i );
274                         CPPUNIT_CHECK( ep->nVal == i * 4 );
275                         ep.release();
276
277                         {
278                             rcu_lock l;
279                             CPPUNIT_CHECK( s.get( i ) == NULL );
280                         }
281                         CPPUNIT_CHECK( !s.extract( ep, i ) );
282                         CPPUNIT_ASSERT( ep.empty() );
283                     }
284                     CPPUNIT_CHECK( s.empty() );
285                 }
286                 Set::gc::force_dispose();
287
288                 // extract_with
289                 {
290                     fill_skiplist( s, v );
291                     for ( int i = c_nArrSize - 1; i >= 0; i -= 1 ) {
292                         {
293                             rcu_lock l;
294                             value_type * pVal = s.get_with( other_key(i), other_key_less<typename Set::value_type>() );
295                             CPPUNIT_ASSERT( pVal != NULL );
296                             CPPUNIT_CHECK( pVal->nKey == i );
297                             CPPUNIT_CHECK( pVal->nVal == i * 2 );
298                             pVal->nVal *= 2;
299                         }
300
301                         CPPUNIT_ASSERT( s.extract_with( ep, other_key(i), other_key_less<typename Set::value_type>() ));
302                         CPPUNIT_ASSERT( !ep.empty() );
303                         CPPUNIT_CHECK( ep->nKey == i );
304                         CPPUNIT_CHECK( ep->nVal == i * 4 );
305                         ep.release();
306
307                         {
308                             rcu_lock l;
309                             CPPUNIT_CHECK( s.get_with( other_key(i), other_key_less<typename Set::value_type>() ) == NULL );
310                         }
311                         CPPUNIT_CHECK( !s.extract_with( ep, other_key(i), other_key_less<typename Set::value_type>() ));
312                     }
313                     CPPUNIT_CHECK( s.empty() );
314                 }
315                 Set::gc::force_dispose();
316
317                 // extract_min
318                 {
319                     fill_skiplist( s, v );
320                     int nPrevKey;
321
322                     CPPUNIT_ASSERT( s.extract_min(ep));
323                     CPPUNIT_ASSERT( !ep.empty());
324                     nPrevKey = ep->nKey;
325                     ep.release();
326
327                     while ( !s.empty() ) {
328                         CPPUNIT_ASSERT( s.extract_min(ep) );
329                         CPPUNIT_ASSERT( !ep.empty());
330                         CPPUNIT_CHECK( ep->nKey == nPrevKey + 1 );
331                         CPPUNIT_CHECK( ep->nVal == (nPrevKey + 1) * 2 );
332                         nPrevKey = ep->nKey;
333                         ep.release();
334                     }
335                     CPPUNIT_CHECK( !s.extract_min(ep) );
336                     CPPUNIT_CHECK( !s.extract_max(ep) );
337                 }
338                 Set::gc::force_dispose();
339
340                 // extract_max
341                 {
342                     fill_skiplist( s, v );
343                     int nPrevKey;
344
345                     CPPUNIT_ASSERT( s.extract_max(ep));
346                     CPPUNIT_ASSERT( !ep.empty());
347                     nPrevKey = ep->nKey;
348                     ep.release();
349
350                     while ( !s.empty() ) {
351                         CPPUNIT_ASSERT( s.extract_max(ep));
352                         CPPUNIT_ASSERT( !ep.empty());
353                         CPPUNIT_CHECK( ep->nKey == nPrevKey - 1 );
354                         CPPUNIT_CHECK( ep->nVal == (nPrevKey - 1) * 2 );
355                         nPrevKey = ep->nKey;
356                         ep.release();
357                     }
358                 }
359                 Set::gc::force_dispose();
360                 CPPUNIT_CHECK( !s.extract_min(ep) );
361                 CPPUNIT_CHECK( !s.extract_max(ep) );
362             }
363
364             CPPUNIT_MSG( PrintStat()(s, NULL) );
365         }
366
367         template <typename Set>
368         void fill_skiplist( Set& s, typename Set::value_type * pArr )
369         {
370             int nRand[c_nArrSize];
371             for ( int i = 0; i < (int) c_nArrSize; ++i ) {
372                 nRand[i] = i;
373             }
374             std::random_shuffle( nRand, nRand + c_nArrSize );
375
376             for ( int i = 0; i < (int) c_nArrSize; ++i ) {
377                 pArr[i].nKey = nRand[i];
378                 pArr[i].nVal = nRand[i] * 2;
379                 CPPUNIT_ASSERT( s.insert( pArr[i] ));
380             }
381             CPPUNIT_CHECK( check_size( s, c_nArrSize ));
382         }
383
384     public:
385
386         // Skip-list RCU
387         void skiplist_rcu_gpi_base_cmp();
388         void skiplist_rcu_gpi_base_less();
389         void skiplist_rcu_gpi_base_cmpmix();
390         void skiplist_rcu_gpi_base_cmp_stat();
391         void skiplist_rcu_gpi_base_less_stat();
392         void skiplist_rcu_gpi_base_cmpmix_stat();
393         void skiplist_rcu_gpi_base_cmp_xorshift();
394         void skiplist_rcu_gpi_base_less_xorshift();
395         void skiplist_rcu_gpi_base_cmpmix_xorshift();
396         void skiplist_rcu_gpi_base_cmp_xorshift_stat();
397         void skiplist_rcu_gpi_base_less_xorshift_stat();
398         void skiplist_rcu_gpi_base_cmpmix_xorshift_stat();
399         void skiplist_rcu_gpi_base_cmp_pascal();
400         void skiplist_rcu_gpi_base_less_pascal();
401         void skiplist_rcu_gpi_base_cmpmix_pascal();
402         void skiplist_rcu_gpi_base_cmp_pascal_stat();
403         void skiplist_rcu_gpi_base_less_pascal_stat();
404         void skiplist_rcu_gpi_base_cmpmix_pascal_stat();
405
406         void skiplist_rcu_gpi_member_cmp();
407         void skiplist_rcu_gpi_member_less();
408         void skiplist_rcu_gpi_member_cmpmix();
409         void skiplist_rcu_gpi_member_cmp_stat();
410         void skiplist_rcu_gpi_member_less_stat();
411         void skiplist_rcu_gpi_member_cmpmix_stat();
412         void skiplist_rcu_gpi_member_cmp_xorshift();
413         void skiplist_rcu_gpi_member_less_xorshift();
414         void skiplist_rcu_gpi_member_cmpmix_xorshift();
415         void skiplist_rcu_gpi_member_cmp_xorshift_stat();
416         void skiplist_rcu_gpi_member_less_xorshift_stat();
417         void skiplist_rcu_gpi_member_cmpmix_xorshift_stat();
418         void skiplist_rcu_gpi_member_cmp_pascal();
419         void skiplist_rcu_gpi_member_less_pascal();
420         void skiplist_rcu_gpi_member_cmpmix_pascal();
421         void skiplist_rcu_gpi_member_cmp_pascal_stat();
422         void skiplist_rcu_gpi_member_less_pascal_stat();
423         void skiplist_rcu_gpi_member_cmpmix_pascal_stat();
424
425         // general_buffered
426         void skiplist_rcu_gpb_base_cmp();
427         void skiplist_rcu_gpb_base_less();
428         void skiplist_rcu_gpb_base_cmpmix();
429         void skiplist_rcu_gpb_base_cmp_stat();
430         void skiplist_rcu_gpb_base_less_stat();
431         void skiplist_rcu_gpb_base_cmpmix_stat();
432         void skiplist_rcu_gpb_base_cmp_xorshift();
433         void skiplist_rcu_gpb_base_less_xorshift();
434         void skiplist_rcu_gpb_base_cmpmix_xorshift();
435         void skiplist_rcu_gpb_base_cmp_xorshift_stat();
436         void skiplist_rcu_gpb_base_less_xorshift_stat();
437         void skiplist_rcu_gpb_base_cmpmix_xorshift_stat();
438         void skiplist_rcu_gpb_base_cmp_pascal();
439         void skiplist_rcu_gpb_base_less_pascal();
440         void skiplist_rcu_gpb_base_cmpmix_pascal();
441         void skiplist_rcu_gpb_base_cmp_pascal_stat();
442         void skiplist_rcu_gpb_base_less_pascal_stat();
443         void skiplist_rcu_gpb_base_cmpmix_pascal_stat();
444
445         void skiplist_rcu_gpb_member_cmp();
446         void skiplist_rcu_gpb_member_less();
447         void skiplist_rcu_gpb_member_cmpmix();
448         void skiplist_rcu_gpb_member_cmp_stat();
449         void skiplist_rcu_gpb_member_less_stat();
450         void skiplist_rcu_gpb_member_cmpmix_stat();
451         void skiplist_rcu_gpb_member_cmp_xorshift();
452         void skiplist_rcu_gpb_member_less_xorshift();
453         void skiplist_rcu_gpb_member_cmpmix_xorshift();
454         void skiplist_rcu_gpb_member_cmp_xorshift_stat();
455         void skiplist_rcu_gpb_member_less_xorshift_stat();
456         void skiplist_rcu_gpb_member_cmpmix_xorshift_stat();
457         void skiplist_rcu_gpb_member_cmp_pascal();
458         void skiplist_rcu_gpb_member_less_pascal();
459         void skiplist_rcu_gpb_member_cmpmix_pascal();
460         void skiplist_rcu_gpb_member_cmp_pascal_stat();
461         void skiplist_rcu_gpb_member_less_pascal_stat();
462         void skiplist_rcu_gpb_member_cmpmix_pascal_stat();
463
464         // general_threaded
465         void skiplist_rcu_gpt_base_cmp();
466         void skiplist_rcu_gpt_base_less();
467         void skiplist_rcu_gpt_base_cmpmix();
468         void skiplist_rcu_gpt_base_cmp_stat();
469         void skiplist_rcu_gpt_base_less_stat();
470         void skiplist_rcu_gpt_base_cmpmix_stat();
471         void skiplist_rcu_gpt_base_cmp_xorshift();
472         void skiplist_rcu_gpt_base_less_xorshift();
473         void skiplist_rcu_gpt_base_cmpmix_xorshift();
474         void skiplist_rcu_gpt_base_cmp_xorshift_stat();
475         void skiplist_rcu_gpt_base_less_xorshift_stat();
476         void skiplist_rcu_gpt_base_cmpmix_xorshift_stat();
477         void skiplist_rcu_gpt_base_cmp_pascal();
478         void skiplist_rcu_gpt_base_less_pascal();
479         void skiplist_rcu_gpt_base_cmpmix_pascal();
480         void skiplist_rcu_gpt_base_cmp_pascal_stat();
481         void skiplist_rcu_gpt_base_less_pascal_stat();
482         void skiplist_rcu_gpt_base_cmpmix_pascal_stat();
483
484         void skiplist_rcu_gpt_member_cmp();
485         void skiplist_rcu_gpt_member_less();
486         void skiplist_rcu_gpt_member_cmpmix();
487         void skiplist_rcu_gpt_member_cmp_stat();
488         void skiplist_rcu_gpt_member_less_stat();
489         void skiplist_rcu_gpt_member_cmpmix_stat();
490         void skiplist_rcu_gpt_member_cmp_xorshift();
491         void skiplist_rcu_gpt_member_less_xorshift();
492         void skiplist_rcu_gpt_member_cmpmix_xorshift();
493         void skiplist_rcu_gpt_member_cmp_xorshift_stat();
494         void skiplist_rcu_gpt_member_less_xorshift_stat();
495         void skiplist_rcu_gpt_member_cmpmix_xorshift_stat();
496         void skiplist_rcu_gpt_member_cmp_pascal();
497         void skiplist_rcu_gpt_member_less_pascal();
498         void skiplist_rcu_gpt_member_cmpmix_pascal();
499         void skiplist_rcu_gpt_member_cmp_pascal_stat();
500         void skiplist_rcu_gpt_member_less_pascal_stat();
501         void skiplist_rcu_gpt_member_cmpmix_pascal_stat();
502
503         // signal_buffered
504         void skiplist_rcu_shb_base_cmp();
505         void skiplist_rcu_shb_base_less();
506         void skiplist_rcu_shb_base_cmpmix();
507         void skiplist_rcu_shb_base_cmp_stat();
508         void skiplist_rcu_shb_base_less_stat();
509         void skiplist_rcu_shb_base_cmpmix_stat();
510         void skiplist_rcu_shb_base_cmp_xorshift();
511         void skiplist_rcu_shb_base_less_xorshift();
512         void skiplist_rcu_shb_base_cmpmix_xorshift();
513         void skiplist_rcu_shb_base_cmp_xorshift_stat();
514         void skiplist_rcu_shb_base_less_xorshift_stat();
515         void skiplist_rcu_shb_base_cmpmix_xorshift_stat();
516         void skiplist_rcu_shb_base_cmp_pascal();
517         void skiplist_rcu_shb_base_less_pascal();
518         void skiplist_rcu_shb_base_cmpmix_pascal();
519         void skiplist_rcu_shb_base_cmp_pascal_stat();
520         void skiplist_rcu_shb_base_less_pascal_stat();
521         void skiplist_rcu_shb_base_cmpmix_pascal_stat();
522
523         void skiplist_rcu_shb_member_cmp();
524         void skiplist_rcu_shb_member_less();
525         void skiplist_rcu_shb_member_cmpmix();
526         void skiplist_rcu_shb_member_cmp_stat();
527         void skiplist_rcu_shb_member_less_stat();
528         void skiplist_rcu_shb_member_cmpmix_stat();
529         void skiplist_rcu_shb_member_cmp_xorshift();
530         void skiplist_rcu_shb_member_less_xorshift();
531         void skiplist_rcu_shb_member_cmpmix_xorshift();
532         void skiplist_rcu_shb_member_cmp_xorshift_stat();
533         void skiplist_rcu_shb_member_less_xorshift_stat();
534         void skiplist_rcu_shb_member_cmpmix_xorshift_stat();
535         void skiplist_rcu_shb_member_cmp_pascal();
536         void skiplist_rcu_shb_member_less_pascal();
537         void skiplist_rcu_shb_member_cmpmix_pascal();
538         void skiplist_rcu_shb_member_cmp_pascal_stat();
539         void skiplist_rcu_shb_member_less_pascal_stat();
540         void skiplist_rcu_shb_member_cmpmix_pascal_stat();
541
542         // signal_threaded
543         void skiplist_rcu_sht_base_cmp();
544         void skiplist_rcu_sht_base_less();
545         void skiplist_rcu_sht_base_cmpmix();
546         void skiplist_rcu_sht_base_cmp_stat();
547         void skiplist_rcu_sht_base_less_stat();
548         void skiplist_rcu_sht_base_cmpmix_stat();
549         void skiplist_rcu_sht_base_cmp_xorshift();
550         void skiplist_rcu_sht_base_less_xorshift();
551         void skiplist_rcu_sht_base_cmpmix_xorshift();
552         void skiplist_rcu_sht_base_cmp_xorshift_stat();
553         void skiplist_rcu_sht_base_less_xorshift_stat();
554         void skiplist_rcu_sht_base_cmpmix_xorshift_stat();
555         void skiplist_rcu_sht_base_cmp_pascal();
556         void skiplist_rcu_sht_base_less_pascal();
557         void skiplist_rcu_sht_base_cmpmix_pascal();
558         void skiplist_rcu_sht_base_cmp_pascal_stat();
559         void skiplist_rcu_sht_base_less_pascal_stat();
560         void skiplist_rcu_sht_base_cmpmix_pascal_stat();
561
562         void skiplist_rcu_sht_member_cmp();
563         void skiplist_rcu_sht_member_less();
564         void skiplist_rcu_sht_member_cmpmix();
565         void skiplist_rcu_sht_member_cmp_stat();
566         void skiplist_rcu_sht_member_less_stat();
567         void skiplist_rcu_sht_member_cmpmix_stat();
568         void skiplist_rcu_sht_member_cmp_xorshift();
569         void skiplist_rcu_sht_member_less_xorshift();
570         void skiplist_rcu_sht_member_cmpmix_xorshift();
571         void skiplist_rcu_sht_member_cmp_xorshift_stat();
572         void skiplist_rcu_sht_member_less_xorshift_stat();
573         void skiplist_rcu_sht_member_cmpmix_xorshift_stat();
574         void skiplist_rcu_sht_member_cmp_pascal();
575         void skiplist_rcu_sht_member_less_pascal();
576         void skiplist_rcu_sht_member_cmpmix_pascal();
577         void skiplist_rcu_sht_member_cmp_pascal_stat();
578         void skiplist_rcu_sht_member_less_pascal_stat();
579         void skiplist_rcu_sht_member_cmpmix_pascal_stat();
580
581         CPPUNIT_TEST_SUITE(IntrusiveSkipListSetRCU)
582             CPPUNIT_TEST(skiplist_rcu_gpi_base_cmp)
583             CPPUNIT_TEST(skiplist_rcu_gpi_base_less)
584             CPPUNIT_TEST(skiplist_rcu_gpi_base_cmpmix)
585             CPPUNIT_TEST(skiplist_rcu_gpi_base_cmp_stat)
586             CPPUNIT_TEST(skiplist_rcu_gpi_base_less_stat)
587             CPPUNIT_TEST(skiplist_rcu_gpi_base_cmpmix_stat)
588             CPPUNIT_TEST(skiplist_rcu_gpi_base_cmp_xorshift)
589             CPPUNIT_TEST(skiplist_rcu_gpi_base_less_xorshift)
590             CPPUNIT_TEST(skiplist_rcu_gpi_base_cmpmix_xorshift)
591             CPPUNIT_TEST(skiplist_rcu_gpi_base_cmp_xorshift_stat)
592             CPPUNIT_TEST(skiplist_rcu_gpi_base_less_xorshift_stat)
593             CPPUNIT_TEST(skiplist_rcu_gpi_base_cmpmix_xorshift_stat)
594             CPPUNIT_TEST(skiplist_rcu_gpi_base_cmp_pascal)
595             CPPUNIT_TEST(skiplist_rcu_gpi_base_less_pascal)
596             CPPUNIT_TEST(skiplist_rcu_gpi_base_cmpmix_pascal)
597             CPPUNIT_TEST(skiplist_rcu_gpi_base_cmp_pascal_stat)
598             CPPUNIT_TEST(skiplist_rcu_gpi_base_less_pascal_stat)
599             CPPUNIT_TEST(skiplist_rcu_gpi_base_cmpmix_pascal_stat)
600
601             CPPUNIT_TEST(skiplist_rcu_gpi_member_cmp)
602             CPPUNIT_TEST(skiplist_rcu_gpi_member_less)
603             CPPUNIT_TEST(skiplist_rcu_gpi_member_cmpmix)
604             CPPUNIT_TEST(skiplist_rcu_gpi_member_cmp_stat)
605             CPPUNIT_TEST(skiplist_rcu_gpi_member_less_stat)
606             CPPUNIT_TEST(skiplist_rcu_gpi_member_cmpmix_stat)
607             CPPUNIT_TEST(skiplist_rcu_gpi_member_cmp_xorshift)
608             CPPUNIT_TEST(skiplist_rcu_gpi_member_less_xorshift)
609             CPPUNIT_TEST(skiplist_rcu_gpi_member_cmpmix_xorshift)
610             CPPUNIT_TEST(skiplist_rcu_gpi_member_cmp_xorshift_stat)
611             CPPUNIT_TEST(skiplist_rcu_gpi_member_less_xorshift_stat)
612             CPPUNIT_TEST(skiplist_rcu_gpi_member_cmpmix_xorshift_stat)
613             CPPUNIT_TEST(skiplist_rcu_gpi_member_cmp_pascal)
614             CPPUNIT_TEST(skiplist_rcu_gpi_member_less_pascal)
615             CPPUNIT_TEST(skiplist_rcu_gpi_member_cmpmix_pascal)
616             CPPUNIT_TEST(skiplist_rcu_gpi_member_cmp_pascal_stat)
617             CPPUNIT_TEST(skiplist_rcu_gpi_member_less_pascal_stat)
618             CPPUNIT_TEST(skiplist_rcu_gpi_member_cmpmix_pascal_stat)
619
620             //
621             CPPUNIT_TEST(skiplist_rcu_gpb_base_cmp)
622             CPPUNIT_TEST(skiplist_rcu_gpb_base_less)
623             CPPUNIT_TEST(skiplist_rcu_gpb_base_cmpmix)
624             CPPUNIT_TEST(skiplist_rcu_gpb_base_cmp_stat)
625             CPPUNIT_TEST(skiplist_rcu_gpb_base_less_stat)
626             CPPUNIT_TEST(skiplist_rcu_gpb_base_cmpmix_stat)
627             CPPUNIT_TEST(skiplist_rcu_gpb_base_cmp_xorshift)
628             CPPUNIT_TEST(skiplist_rcu_gpb_base_less_xorshift)
629             CPPUNIT_TEST(skiplist_rcu_gpb_base_cmpmix_xorshift)
630             CPPUNIT_TEST(skiplist_rcu_gpb_base_cmp_xorshift_stat)
631             CPPUNIT_TEST(skiplist_rcu_gpb_base_less_xorshift_stat)
632             CPPUNIT_TEST(skiplist_rcu_gpb_base_cmpmix_xorshift_stat)
633             CPPUNIT_TEST(skiplist_rcu_gpb_base_cmp_pascal)
634             CPPUNIT_TEST(skiplist_rcu_gpb_base_less_pascal)
635             CPPUNIT_TEST(skiplist_rcu_gpb_base_cmpmix_pascal)
636             CPPUNIT_TEST(skiplist_rcu_gpb_base_cmp_pascal_stat)
637             CPPUNIT_TEST(skiplist_rcu_gpb_base_less_pascal_stat)
638             CPPUNIT_TEST(skiplist_rcu_gpb_base_cmpmix_pascal_stat)
639
640             CPPUNIT_TEST(skiplist_rcu_gpb_member_cmp)
641             CPPUNIT_TEST(skiplist_rcu_gpb_member_less)
642             CPPUNIT_TEST(skiplist_rcu_gpb_member_cmpmix)
643             CPPUNIT_TEST(skiplist_rcu_gpb_member_cmp_stat)
644             CPPUNIT_TEST(skiplist_rcu_gpb_member_less_stat)
645             CPPUNIT_TEST(skiplist_rcu_gpb_member_cmpmix_stat)
646             CPPUNIT_TEST(skiplist_rcu_gpb_member_cmp_xorshift)
647             CPPUNIT_TEST(skiplist_rcu_gpb_member_less_xorshift)
648             CPPUNIT_TEST(skiplist_rcu_gpb_member_cmpmix_xorshift)
649             CPPUNIT_TEST(skiplist_rcu_gpb_member_cmp_xorshift_stat)
650             CPPUNIT_TEST(skiplist_rcu_gpb_member_less_xorshift_stat)
651             CPPUNIT_TEST(skiplist_rcu_gpb_member_cmpmix_xorshift_stat)
652             CPPUNIT_TEST(skiplist_rcu_gpb_member_cmp_pascal)
653             CPPUNIT_TEST(skiplist_rcu_gpb_member_less_pascal)
654             CPPUNIT_TEST(skiplist_rcu_gpb_member_cmpmix_pascal)
655             CPPUNIT_TEST(skiplist_rcu_gpb_member_cmp_pascal_stat)
656             CPPUNIT_TEST(skiplist_rcu_gpb_member_less_pascal_stat)
657             CPPUNIT_TEST(skiplist_rcu_gpb_member_cmpmix_pascal_stat)
658
659             //
660             CPPUNIT_TEST(skiplist_rcu_gpt_base_cmp)
661             CPPUNIT_TEST(skiplist_rcu_gpt_base_less)
662             CPPUNIT_TEST(skiplist_rcu_gpt_base_cmpmix)
663             CPPUNIT_TEST(skiplist_rcu_gpt_base_cmp_stat)
664             CPPUNIT_TEST(skiplist_rcu_gpt_base_less_stat)
665             CPPUNIT_TEST(skiplist_rcu_gpt_base_cmpmix_stat)
666             CPPUNIT_TEST(skiplist_rcu_gpt_base_cmp_xorshift)
667             CPPUNIT_TEST(skiplist_rcu_gpt_base_less_xorshift)
668             CPPUNIT_TEST(skiplist_rcu_gpt_base_cmpmix_xorshift)
669             CPPUNIT_TEST(skiplist_rcu_gpt_base_cmp_xorshift_stat)
670             CPPUNIT_TEST(skiplist_rcu_gpt_base_less_xorshift_stat)
671             CPPUNIT_TEST(skiplist_rcu_gpt_base_cmpmix_xorshift_stat)
672             CPPUNIT_TEST(skiplist_rcu_gpt_base_cmp_pascal)
673             CPPUNIT_TEST(skiplist_rcu_gpt_base_less_pascal)
674             CPPUNIT_TEST(skiplist_rcu_gpt_base_cmpmix_pascal)
675             CPPUNIT_TEST(skiplist_rcu_gpt_base_cmp_pascal_stat)
676             CPPUNIT_TEST(skiplist_rcu_gpt_base_less_pascal_stat)
677             CPPUNIT_TEST(skiplist_rcu_gpt_base_cmpmix_pascal_stat)
678
679             CPPUNIT_TEST(skiplist_rcu_gpt_member_cmp)
680             CPPUNIT_TEST(skiplist_rcu_gpt_member_less)
681             CPPUNIT_TEST(skiplist_rcu_gpt_member_cmpmix)
682             CPPUNIT_TEST(skiplist_rcu_gpt_member_cmp_stat)
683             CPPUNIT_TEST(skiplist_rcu_gpt_member_less_stat)
684             CPPUNIT_TEST(skiplist_rcu_gpt_member_cmpmix_stat)
685             CPPUNIT_TEST(skiplist_rcu_gpt_member_cmp_xorshift)
686             CPPUNIT_TEST(skiplist_rcu_gpt_member_less_xorshift)
687             CPPUNIT_TEST(skiplist_rcu_gpt_member_cmpmix_xorshift)
688             CPPUNIT_TEST(skiplist_rcu_gpt_member_cmp_xorshift_stat)
689             CPPUNIT_TEST(skiplist_rcu_gpt_member_less_xorshift_stat)
690             CPPUNIT_TEST(skiplist_rcu_gpt_member_cmpmix_xorshift_stat)
691             CPPUNIT_TEST(skiplist_rcu_gpt_member_cmp_pascal)
692             CPPUNIT_TEST(skiplist_rcu_gpt_member_less_pascal)
693             CPPUNIT_TEST(skiplist_rcu_gpt_member_cmpmix_pascal)
694             CPPUNIT_TEST(skiplist_rcu_gpt_member_cmp_pascal_stat)
695             CPPUNIT_TEST(skiplist_rcu_gpt_member_less_pascal_stat)
696             CPPUNIT_TEST(skiplist_rcu_gpt_member_cmpmix_pascal_stat)
697
698             //
699             CPPUNIT_TEST(skiplist_rcu_shb_base_cmp)
700             CPPUNIT_TEST(skiplist_rcu_shb_base_less)
701             CPPUNIT_TEST(skiplist_rcu_shb_base_cmpmix)
702             CPPUNIT_TEST(skiplist_rcu_shb_base_cmp_stat)
703             CPPUNIT_TEST(skiplist_rcu_shb_base_less_stat)
704             CPPUNIT_TEST(skiplist_rcu_shb_base_cmpmix_stat)
705             CPPUNIT_TEST(skiplist_rcu_shb_base_cmp_xorshift)
706             CPPUNIT_TEST(skiplist_rcu_shb_base_less_xorshift)
707             CPPUNIT_TEST(skiplist_rcu_shb_base_cmpmix_xorshift)
708             CPPUNIT_TEST(skiplist_rcu_shb_base_cmp_xorshift_stat)
709             CPPUNIT_TEST(skiplist_rcu_shb_base_less_xorshift_stat)
710             CPPUNIT_TEST(skiplist_rcu_shb_base_cmpmix_xorshift_stat)
711             CPPUNIT_TEST(skiplist_rcu_shb_base_cmp_pascal)
712             CPPUNIT_TEST(skiplist_rcu_shb_base_less_pascal)
713             CPPUNIT_TEST(skiplist_rcu_shb_base_cmpmix_pascal)
714             CPPUNIT_TEST(skiplist_rcu_shb_base_cmp_pascal_stat)
715             CPPUNIT_TEST(skiplist_rcu_shb_base_less_pascal_stat)
716             CPPUNIT_TEST(skiplist_rcu_shb_base_cmpmix_pascal_stat)
717
718             CPPUNIT_TEST(skiplist_rcu_shb_member_cmp)
719             CPPUNIT_TEST(skiplist_rcu_shb_member_less)
720             CPPUNIT_TEST(skiplist_rcu_shb_member_cmpmix)
721             CPPUNIT_TEST(skiplist_rcu_shb_member_cmp_stat)
722             CPPUNIT_TEST(skiplist_rcu_shb_member_less_stat)
723             CPPUNIT_TEST(skiplist_rcu_shb_member_cmpmix_stat)
724             CPPUNIT_TEST(skiplist_rcu_shb_member_cmp_xorshift)
725             CPPUNIT_TEST(skiplist_rcu_shb_member_less_xorshift)
726             CPPUNIT_TEST(skiplist_rcu_shb_member_cmpmix_xorshift)
727             CPPUNIT_TEST(skiplist_rcu_shb_member_cmp_xorshift_stat)
728             CPPUNIT_TEST(skiplist_rcu_shb_member_less_xorshift_stat)
729             CPPUNIT_TEST(skiplist_rcu_shb_member_cmpmix_xorshift_stat)
730             CPPUNIT_TEST(skiplist_rcu_shb_member_cmp_pascal)
731             CPPUNIT_TEST(skiplist_rcu_shb_member_less_pascal)
732             CPPUNIT_TEST(skiplist_rcu_shb_member_cmpmix_pascal)
733             CPPUNIT_TEST(skiplist_rcu_shb_member_cmp_pascal_stat)
734             CPPUNIT_TEST(skiplist_rcu_shb_member_less_pascal_stat)
735             CPPUNIT_TEST(skiplist_rcu_shb_member_cmpmix_pascal_stat)
736
737             //
738             CPPUNIT_TEST(skiplist_rcu_sht_base_cmp)
739             CPPUNIT_TEST(skiplist_rcu_sht_base_less)
740             CPPUNIT_TEST(skiplist_rcu_sht_base_cmpmix)
741             CPPUNIT_TEST(skiplist_rcu_sht_base_cmp_stat)
742             CPPUNIT_TEST(skiplist_rcu_sht_base_less_stat)
743             CPPUNIT_TEST(skiplist_rcu_sht_base_cmpmix_stat)
744             CPPUNIT_TEST(skiplist_rcu_sht_base_cmp_xorshift)
745             CPPUNIT_TEST(skiplist_rcu_sht_base_less_xorshift)
746             CPPUNIT_TEST(skiplist_rcu_sht_base_cmpmix_xorshift)
747             CPPUNIT_TEST(skiplist_rcu_sht_base_cmp_xorshift_stat)
748             CPPUNIT_TEST(skiplist_rcu_sht_base_less_xorshift_stat)
749             CPPUNIT_TEST(skiplist_rcu_sht_base_cmpmix_xorshift_stat)
750             CPPUNIT_TEST(skiplist_rcu_sht_base_cmp_pascal)
751             CPPUNIT_TEST(skiplist_rcu_sht_base_less_pascal)
752             CPPUNIT_TEST(skiplist_rcu_sht_base_cmpmix_pascal)
753             CPPUNIT_TEST(skiplist_rcu_sht_base_cmp_pascal_stat)
754             CPPUNIT_TEST(skiplist_rcu_sht_base_less_pascal_stat)
755             CPPUNIT_TEST(skiplist_rcu_sht_base_cmpmix_pascal_stat)
756
757             CPPUNIT_TEST(skiplist_rcu_sht_member_cmp)
758             CPPUNIT_TEST(skiplist_rcu_sht_member_less)
759             CPPUNIT_TEST(skiplist_rcu_sht_member_cmpmix)
760             CPPUNIT_TEST(skiplist_rcu_sht_member_cmp_stat)
761             CPPUNIT_TEST(skiplist_rcu_sht_member_less_stat)
762             CPPUNIT_TEST(skiplist_rcu_sht_member_cmpmix_stat)
763             CPPUNIT_TEST(skiplist_rcu_sht_member_cmp_xorshift)
764             CPPUNIT_TEST(skiplist_rcu_sht_member_less_xorshift)
765             CPPUNIT_TEST(skiplist_rcu_sht_member_cmpmix_xorshift)
766             CPPUNIT_TEST(skiplist_rcu_sht_member_cmp_xorshift_stat)
767             CPPUNIT_TEST(skiplist_rcu_sht_member_less_xorshift_stat)
768             CPPUNIT_TEST(skiplist_rcu_sht_member_cmpmix_xorshift_stat)
769             CPPUNIT_TEST(skiplist_rcu_sht_member_cmp_pascal)
770             CPPUNIT_TEST(skiplist_rcu_sht_member_less_pascal)
771             CPPUNIT_TEST(skiplist_rcu_sht_member_cmpmix_pascal)
772             CPPUNIT_TEST(skiplist_rcu_sht_member_cmp_pascal_stat)
773             CPPUNIT_TEST(skiplist_rcu_sht_member_less_pascal_stat)
774             CPPUNIT_TEST(skiplist_rcu_sht_member_cmpmix_pascal_stat)
775
776         CPPUNIT_TEST_SUITE_END()
777     };
778 } // namespace set