fix tests for guarded_ptr and exempt_ptr
[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 != nullptr );
266                             CPPUNIT_CHECK( pVal->nKey == i );
267                             CPPUNIT_CHECK( pVal->nVal == i * 2 );
268                             pVal->nVal *= 2;
269                         }
270
271                         ep = s.extract( i );
272                         CPPUNIT_ASSERT( ep );
273                         CPPUNIT_ASSERT( !ep.empty() );
274                         CPPUNIT_CHECK( ep->nKey == i );
275                         CPPUNIT_CHECK( ep->nVal == i * 4 );
276                         ep.release();
277
278                         {
279                             rcu_lock l;
280                             CPPUNIT_CHECK( s.get( i ) == nullptr );
281                         }
282                         ep = s.extract( i );
283                         CPPUNIT_CHECK( !ep );
284                         CPPUNIT_ASSERT( ep.empty() );
285                     }
286                     CPPUNIT_CHECK( s.empty() );
287                 }
288                 Set::gc::force_dispose();
289
290                 // extract_with
291                 {
292                     fill_skiplist( s, v );
293                     for ( int i = c_nArrSize - 1; i >= 0; i -= 1 ) {
294                         {
295                             rcu_lock l;
296                             value_type * pVal = s.get_with( other_key(i), other_key_less<typename Set::value_type>() );
297                             CPPUNIT_ASSERT( pVal != nullptr );
298                             CPPUNIT_CHECK( pVal->nKey == i );
299                             CPPUNIT_CHECK( pVal->nVal == i * 2 );
300                             pVal->nVal *= 2;
301                         }
302
303                         ep = s.extract_with( other_key( i ), other_key_less<typename Set::value_type>() );
304                         CPPUNIT_ASSERT( ep );
305                         CPPUNIT_ASSERT( !ep.empty() );
306                         CPPUNIT_CHECK( ep->nKey == i );
307                         CPPUNIT_CHECK( ep->nVal == i * 4 );
308                         ep.release();
309
310                         {
311                             rcu_lock l;
312                             CPPUNIT_CHECK( s.get_with( other_key( i ), other_key_less<typename Set::value_type>() ) == nullptr );
313                         }
314                         ep = s.extract_with( other_key( i ), other_key_less<typename Set::value_type>() );
315                         CPPUNIT_CHECK( !ep );
316                     }
317                     CPPUNIT_CHECK( s.empty() );
318                 }
319                 Set::gc::force_dispose();
320
321                 // extract_min
322                 {
323                     fill_skiplist( s, v );
324                     int nPrevKey;
325
326                     ep = s.extract_min();
327                     CPPUNIT_ASSERT( ep );
328                     CPPUNIT_ASSERT( !ep.empty());
329                     nPrevKey = ep->nKey;
330                     ep.release();
331
332                     while ( !s.empty() ) {
333                         ep = s.extract_min();
334                         CPPUNIT_ASSERT( ep );
335                         CPPUNIT_ASSERT( !ep.empty());
336                         CPPUNIT_CHECK( ep->nKey == nPrevKey + 1 );
337                         CPPUNIT_CHECK( ep->nVal == (nPrevKey + 1) * 2 );
338                         nPrevKey = ep->nKey;
339                         ep.release();
340                     }
341                     ep = s.extract_min();
342                     CPPUNIT_CHECK( !ep );
343                     CPPUNIT_CHECK( !s.extract_max() );
344                 }
345                 Set::gc::force_dispose();
346
347                 // extract_max
348                 {
349                     fill_skiplist( s, v );
350                     int nPrevKey;
351
352                     ep = s.extract_max();
353                     CPPUNIT_ASSERT( ep );
354                     CPPUNIT_ASSERT( !ep.empty());
355                     nPrevKey = ep->nKey;
356                     ep.release();
357
358                     while ( !s.empty() ) {
359                         ep = s.extract_max();
360                         CPPUNIT_ASSERT( ep );
361                         CPPUNIT_ASSERT( !ep.empty());
362                         CPPUNIT_CHECK( ep->nKey == nPrevKey - 1 );
363                         CPPUNIT_CHECK( ep->nVal == (nPrevKey - 1) * 2 );
364                         nPrevKey = ep->nKey;
365                         ep.release();
366                     }
367                     ep = s.extract_min();
368                     CPPUNIT_CHECK( !ep );
369                     CPPUNIT_CHECK( !s.extract_max() );
370                 }
371                 Set::gc::force_dispose();
372             }
373
374             CPPUNIT_MSG( PrintStat()(s, nullptr) );
375         }
376
377         template <typename Set>
378         void fill_skiplist( Set& s, typename Set::value_type * pArr )
379         {
380             int nRand[c_nArrSize];
381             for ( int i = 0; i < (int) c_nArrSize; ++i ) {
382                 nRand[i] = i;
383             }
384             std::random_shuffle( nRand, nRand + c_nArrSize );
385
386             for ( int i = 0; i < (int) c_nArrSize; ++i ) {
387                 pArr[i].nKey = nRand[i];
388                 pArr[i].nVal = nRand[i] * 2;
389                 CPPUNIT_ASSERT( s.insert( pArr[i] ));
390             }
391             CPPUNIT_CHECK( check_size( s, c_nArrSize ));
392         }
393
394     public:
395
396         // Skip-list RCU
397         void skiplist_rcu_gpi_base_cmp();
398         void skiplist_rcu_gpi_base_less();
399         void skiplist_rcu_gpi_base_cmpmix();
400         void skiplist_rcu_gpi_base_cmp_stat();
401         void skiplist_rcu_gpi_base_less_stat();
402         void skiplist_rcu_gpi_base_cmpmix_stat();
403         void skiplist_rcu_gpi_base_cmp_xorshift();
404         void skiplist_rcu_gpi_base_less_xorshift();
405         void skiplist_rcu_gpi_base_cmpmix_xorshift();
406         void skiplist_rcu_gpi_base_cmp_xorshift_stat();
407         void skiplist_rcu_gpi_base_less_xorshift_stat();
408         void skiplist_rcu_gpi_base_cmpmix_xorshift_stat();
409         void skiplist_rcu_gpi_base_cmp_pascal();
410         void skiplist_rcu_gpi_base_less_pascal();
411         void skiplist_rcu_gpi_base_cmpmix_pascal();
412         void skiplist_rcu_gpi_base_cmp_pascal_stat();
413         void skiplist_rcu_gpi_base_less_pascal_stat();
414         void skiplist_rcu_gpi_base_cmpmix_pascal_stat();
415
416         void skiplist_rcu_gpi_member_cmp();
417         void skiplist_rcu_gpi_member_less();
418         void skiplist_rcu_gpi_member_cmpmix();
419         void skiplist_rcu_gpi_member_cmp_stat();
420         void skiplist_rcu_gpi_member_less_stat();
421         void skiplist_rcu_gpi_member_cmpmix_stat();
422         void skiplist_rcu_gpi_member_cmp_xorshift();
423         void skiplist_rcu_gpi_member_less_xorshift();
424         void skiplist_rcu_gpi_member_cmpmix_xorshift();
425         void skiplist_rcu_gpi_member_cmp_xorshift_stat();
426         void skiplist_rcu_gpi_member_less_xorshift_stat();
427         void skiplist_rcu_gpi_member_cmpmix_xorshift_stat();
428         void skiplist_rcu_gpi_member_cmp_pascal();
429         void skiplist_rcu_gpi_member_less_pascal();
430         void skiplist_rcu_gpi_member_cmpmix_pascal();
431         void skiplist_rcu_gpi_member_cmp_pascal_stat();
432         void skiplist_rcu_gpi_member_less_pascal_stat();
433         void skiplist_rcu_gpi_member_cmpmix_pascal_stat();
434
435         // general_buffered
436         void skiplist_rcu_gpb_base_cmp();
437         void skiplist_rcu_gpb_base_less();
438         void skiplist_rcu_gpb_base_cmpmix();
439         void skiplist_rcu_gpb_base_cmp_stat();
440         void skiplist_rcu_gpb_base_less_stat();
441         void skiplist_rcu_gpb_base_cmpmix_stat();
442         void skiplist_rcu_gpb_base_cmp_xorshift();
443         void skiplist_rcu_gpb_base_less_xorshift();
444         void skiplist_rcu_gpb_base_cmpmix_xorshift();
445         void skiplist_rcu_gpb_base_cmp_xorshift_stat();
446         void skiplist_rcu_gpb_base_less_xorshift_stat();
447         void skiplist_rcu_gpb_base_cmpmix_xorshift_stat();
448         void skiplist_rcu_gpb_base_cmp_pascal();
449         void skiplist_rcu_gpb_base_less_pascal();
450         void skiplist_rcu_gpb_base_cmpmix_pascal();
451         void skiplist_rcu_gpb_base_cmp_pascal_stat();
452         void skiplist_rcu_gpb_base_less_pascal_stat();
453         void skiplist_rcu_gpb_base_cmpmix_pascal_stat();
454
455         void skiplist_rcu_gpb_member_cmp();
456         void skiplist_rcu_gpb_member_less();
457         void skiplist_rcu_gpb_member_cmpmix();
458         void skiplist_rcu_gpb_member_cmp_stat();
459         void skiplist_rcu_gpb_member_less_stat();
460         void skiplist_rcu_gpb_member_cmpmix_stat();
461         void skiplist_rcu_gpb_member_cmp_xorshift();
462         void skiplist_rcu_gpb_member_less_xorshift();
463         void skiplist_rcu_gpb_member_cmpmix_xorshift();
464         void skiplist_rcu_gpb_member_cmp_xorshift_stat();
465         void skiplist_rcu_gpb_member_less_xorshift_stat();
466         void skiplist_rcu_gpb_member_cmpmix_xorshift_stat();
467         void skiplist_rcu_gpb_member_cmp_pascal();
468         void skiplist_rcu_gpb_member_less_pascal();
469         void skiplist_rcu_gpb_member_cmpmix_pascal();
470         void skiplist_rcu_gpb_member_cmp_pascal_stat();
471         void skiplist_rcu_gpb_member_less_pascal_stat();
472         void skiplist_rcu_gpb_member_cmpmix_pascal_stat();
473
474         // general_threaded
475         void skiplist_rcu_gpt_base_cmp();
476         void skiplist_rcu_gpt_base_less();
477         void skiplist_rcu_gpt_base_cmpmix();
478         void skiplist_rcu_gpt_base_cmp_stat();
479         void skiplist_rcu_gpt_base_less_stat();
480         void skiplist_rcu_gpt_base_cmpmix_stat();
481         void skiplist_rcu_gpt_base_cmp_xorshift();
482         void skiplist_rcu_gpt_base_less_xorshift();
483         void skiplist_rcu_gpt_base_cmpmix_xorshift();
484         void skiplist_rcu_gpt_base_cmp_xorshift_stat();
485         void skiplist_rcu_gpt_base_less_xorshift_stat();
486         void skiplist_rcu_gpt_base_cmpmix_xorshift_stat();
487         void skiplist_rcu_gpt_base_cmp_pascal();
488         void skiplist_rcu_gpt_base_less_pascal();
489         void skiplist_rcu_gpt_base_cmpmix_pascal();
490         void skiplist_rcu_gpt_base_cmp_pascal_stat();
491         void skiplist_rcu_gpt_base_less_pascal_stat();
492         void skiplist_rcu_gpt_base_cmpmix_pascal_stat();
493
494         void skiplist_rcu_gpt_member_cmp();
495         void skiplist_rcu_gpt_member_less();
496         void skiplist_rcu_gpt_member_cmpmix();
497         void skiplist_rcu_gpt_member_cmp_stat();
498         void skiplist_rcu_gpt_member_less_stat();
499         void skiplist_rcu_gpt_member_cmpmix_stat();
500         void skiplist_rcu_gpt_member_cmp_xorshift();
501         void skiplist_rcu_gpt_member_less_xorshift();
502         void skiplist_rcu_gpt_member_cmpmix_xorshift();
503         void skiplist_rcu_gpt_member_cmp_xorshift_stat();
504         void skiplist_rcu_gpt_member_less_xorshift_stat();
505         void skiplist_rcu_gpt_member_cmpmix_xorshift_stat();
506         void skiplist_rcu_gpt_member_cmp_pascal();
507         void skiplist_rcu_gpt_member_less_pascal();
508         void skiplist_rcu_gpt_member_cmpmix_pascal();
509         void skiplist_rcu_gpt_member_cmp_pascal_stat();
510         void skiplist_rcu_gpt_member_less_pascal_stat();
511         void skiplist_rcu_gpt_member_cmpmix_pascal_stat();
512
513         // signal_buffered
514         void skiplist_rcu_shb_base_cmp();
515         void skiplist_rcu_shb_base_less();
516         void skiplist_rcu_shb_base_cmpmix();
517         void skiplist_rcu_shb_base_cmp_stat();
518         void skiplist_rcu_shb_base_less_stat();
519         void skiplist_rcu_shb_base_cmpmix_stat();
520         void skiplist_rcu_shb_base_cmp_xorshift();
521         void skiplist_rcu_shb_base_less_xorshift();
522         void skiplist_rcu_shb_base_cmpmix_xorshift();
523         void skiplist_rcu_shb_base_cmp_xorshift_stat();
524         void skiplist_rcu_shb_base_less_xorshift_stat();
525         void skiplist_rcu_shb_base_cmpmix_xorshift_stat();
526         void skiplist_rcu_shb_base_cmp_pascal();
527         void skiplist_rcu_shb_base_less_pascal();
528         void skiplist_rcu_shb_base_cmpmix_pascal();
529         void skiplist_rcu_shb_base_cmp_pascal_stat();
530         void skiplist_rcu_shb_base_less_pascal_stat();
531         void skiplist_rcu_shb_base_cmpmix_pascal_stat();
532
533         void skiplist_rcu_shb_member_cmp();
534         void skiplist_rcu_shb_member_less();
535         void skiplist_rcu_shb_member_cmpmix();
536         void skiplist_rcu_shb_member_cmp_stat();
537         void skiplist_rcu_shb_member_less_stat();
538         void skiplist_rcu_shb_member_cmpmix_stat();
539         void skiplist_rcu_shb_member_cmp_xorshift();
540         void skiplist_rcu_shb_member_less_xorshift();
541         void skiplist_rcu_shb_member_cmpmix_xorshift();
542         void skiplist_rcu_shb_member_cmp_xorshift_stat();
543         void skiplist_rcu_shb_member_less_xorshift_stat();
544         void skiplist_rcu_shb_member_cmpmix_xorshift_stat();
545         void skiplist_rcu_shb_member_cmp_pascal();
546         void skiplist_rcu_shb_member_less_pascal();
547         void skiplist_rcu_shb_member_cmpmix_pascal();
548         void skiplist_rcu_shb_member_cmp_pascal_stat();
549         void skiplist_rcu_shb_member_less_pascal_stat();
550         void skiplist_rcu_shb_member_cmpmix_pascal_stat();
551
552         // signal_threaded
553         void skiplist_rcu_sht_base_cmp();
554         void skiplist_rcu_sht_base_less();
555         void skiplist_rcu_sht_base_cmpmix();
556         void skiplist_rcu_sht_base_cmp_stat();
557         void skiplist_rcu_sht_base_less_stat();
558         void skiplist_rcu_sht_base_cmpmix_stat();
559         void skiplist_rcu_sht_base_cmp_xorshift();
560         void skiplist_rcu_sht_base_less_xorshift();
561         void skiplist_rcu_sht_base_cmpmix_xorshift();
562         void skiplist_rcu_sht_base_cmp_xorshift_stat();
563         void skiplist_rcu_sht_base_less_xorshift_stat();
564         void skiplist_rcu_sht_base_cmpmix_xorshift_stat();
565         void skiplist_rcu_sht_base_cmp_pascal();
566         void skiplist_rcu_sht_base_less_pascal();
567         void skiplist_rcu_sht_base_cmpmix_pascal();
568         void skiplist_rcu_sht_base_cmp_pascal_stat();
569         void skiplist_rcu_sht_base_less_pascal_stat();
570         void skiplist_rcu_sht_base_cmpmix_pascal_stat();
571
572         void skiplist_rcu_sht_member_cmp();
573         void skiplist_rcu_sht_member_less();
574         void skiplist_rcu_sht_member_cmpmix();
575         void skiplist_rcu_sht_member_cmp_stat();
576         void skiplist_rcu_sht_member_less_stat();
577         void skiplist_rcu_sht_member_cmpmix_stat();
578         void skiplist_rcu_sht_member_cmp_xorshift();
579         void skiplist_rcu_sht_member_less_xorshift();
580         void skiplist_rcu_sht_member_cmpmix_xorshift();
581         void skiplist_rcu_sht_member_cmp_xorshift_stat();
582         void skiplist_rcu_sht_member_less_xorshift_stat();
583         void skiplist_rcu_sht_member_cmpmix_xorshift_stat();
584         void skiplist_rcu_sht_member_cmp_pascal();
585         void skiplist_rcu_sht_member_less_pascal();
586         void skiplist_rcu_sht_member_cmpmix_pascal();
587         void skiplist_rcu_sht_member_cmp_pascal_stat();
588         void skiplist_rcu_sht_member_less_pascal_stat();
589         void skiplist_rcu_sht_member_cmpmix_pascal_stat();
590
591         CPPUNIT_TEST_SUITE(IntrusiveSkipListSetRCU)
592             CPPUNIT_TEST(skiplist_rcu_gpi_base_cmp)
593             CPPUNIT_TEST(skiplist_rcu_gpi_base_less)
594             CPPUNIT_TEST(skiplist_rcu_gpi_base_cmpmix)
595             CPPUNIT_TEST(skiplist_rcu_gpi_base_cmp_stat)
596             CPPUNIT_TEST(skiplist_rcu_gpi_base_less_stat)
597             CPPUNIT_TEST(skiplist_rcu_gpi_base_cmpmix_stat)
598             CPPUNIT_TEST(skiplist_rcu_gpi_base_cmp_xorshift)
599             CPPUNIT_TEST(skiplist_rcu_gpi_base_less_xorshift)
600             CPPUNIT_TEST(skiplist_rcu_gpi_base_cmpmix_xorshift)
601             CPPUNIT_TEST(skiplist_rcu_gpi_base_cmp_xorshift_stat)
602             CPPUNIT_TEST(skiplist_rcu_gpi_base_less_xorshift_stat)
603             CPPUNIT_TEST(skiplist_rcu_gpi_base_cmpmix_xorshift_stat)
604             CPPUNIT_TEST(skiplist_rcu_gpi_base_cmp_pascal)
605             CPPUNIT_TEST(skiplist_rcu_gpi_base_less_pascal)
606             CPPUNIT_TEST(skiplist_rcu_gpi_base_cmpmix_pascal)
607             CPPUNIT_TEST(skiplist_rcu_gpi_base_cmp_pascal_stat)
608             CPPUNIT_TEST(skiplist_rcu_gpi_base_less_pascal_stat)
609             CPPUNIT_TEST(skiplist_rcu_gpi_base_cmpmix_pascal_stat)
610
611             CPPUNIT_TEST(skiplist_rcu_gpi_member_cmp)
612             CPPUNIT_TEST(skiplist_rcu_gpi_member_less)
613             CPPUNIT_TEST(skiplist_rcu_gpi_member_cmpmix)
614             CPPUNIT_TEST(skiplist_rcu_gpi_member_cmp_stat)
615             CPPUNIT_TEST(skiplist_rcu_gpi_member_less_stat)
616             CPPUNIT_TEST(skiplist_rcu_gpi_member_cmpmix_stat)
617             CPPUNIT_TEST(skiplist_rcu_gpi_member_cmp_xorshift)
618             CPPUNIT_TEST(skiplist_rcu_gpi_member_less_xorshift)
619             CPPUNIT_TEST(skiplist_rcu_gpi_member_cmpmix_xorshift)
620             CPPUNIT_TEST(skiplist_rcu_gpi_member_cmp_xorshift_stat)
621             CPPUNIT_TEST(skiplist_rcu_gpi_member_less_xorshift_stat)
622             CPPUNIT_TEST(skiplist_rcu_gpi_member_cmpmix_xorshift_stat)
623             CPPUNIT_TEST(skiplist_rcu_gpi_member_cmp_pascal)
624             CPPUNIT_TEST(skiplist_rcu_gpi_member_less_pascal)
625             CPPUNIT_TEST(skiplist_rcu_gpi_member_cmpmix_pascal)
626             CPPUNIT_TEST(skiplist_rcu_gpi_member_cmp_pascal_stat)
627             CPPUNIT_TEST(skiplist_rcu_gpi_member_less_pascal_stat)
628             CPPUNIT_TEST(skiplist_rcu_gpi_member_cmpmix_pascal_stat)
629
630             //
631             CPPUNIT_TEST(skiplist_rcu_gpb_base_cmp)
632             CPPUNIT_TEST(skiplist_rcu_gpb_base_less)
633             CPPUNIT_TEST(skiplist_rcu_gpb_base_cmpmix)
634             CPPUNIT_TEST(skiplist_rcu_gpb_base_cmp_stat)
635             CPPUNIT_TEST(skiplist_rcu_gpb_base_less_stat)
636             CPPUNIT_TEST(skiplist_rcu_gpb_base_cmpmix_stat)
637             CPPUNIT_TEST(skiplist_rcu_gpb_base_cmp_xorshift)
638             CPPUNIT_TEST(skiplist_rcu_gpb_base_less_xorshift)
639             CPPUNIT_TEST(skiplist_rcu_gpb_base_cmpmix_xorshift)
640             CPPUNIT_TEST(skiplist_rcu_gpb_base_cmp_xorshift_stat)
641             CPPUNIT_TEST(skiplist_rcu_gpb_base_less_xorshift_stat)
642             CPPUNIT_TEST(skiplist_rcu_gpb_base_cmpmix_xorshift_stat)
643             CPPUNIT_TEST(skiplist_rcu_gpb_base_cmp_pascal)
644             CPPUNIT_TEST(skiplist_rcu_gpb_base_less_pascal)
645             CPPUNIT_TEST(skiplist_rcu_gpb_base_cmpmix_pascal)
646             CPPUNIT_TEST(skiplist_rcu_gpb_base_cmp_pascal_stat)
647             CPPUNIT_TEST(skiplist_rcu_gpb_base_less_pascal_stat)
648             CPPUNIT_TEST(skiplist_rcu_gpb_base_cmpmix_pascal_stat)
649
650             CPPUNIT_TEST(skiplist_rcu_gpb_member_cmp)
651             CPPUNIT_TEST(skiplist_rcu_gpb_member_less)
652             CPPUNIT_TEST(skiplist_rcu_gpb_member_cmpmix)
653             CPPUNIT_TEST(skiplist_rcu_gpb_member_cmp_stat)
654             CPPUNIT_TEST(skiplist_rcu_gpb_member_less_stat)
655             CPPUNIT_TEST(skiplist_rcu_gpb_member_cmpmix_stat)
656             CPPUNIT_TEST(skiplist_rcu_gpb_member_cmp_xorshift)
657             CPPUNIT_TEST(skiplist_rcu_gpb_member_less_xorshift)
658             CPPUNIT_TEST(skiplist_rcu_gpb_member_cmpmix_xorshift)
659             CPPUNIT_TEST(skiplist_rcu_gpb_member_cmp_xorshift_stat)
660             CPPUNIT_TEST(skiplist_rcu_gpb_member_less_xorshift_stat)
661             CPPUNIT_TEST(skiplist_rcu_gpb_member_cmpmix_xorshift_stat)
662             CPPUNIT_TEST(skiplist_rcu_gpb_member_cmp_pascal)
663             CPPUNIT_TEST(skiplist_rcu_gpb_member_less_pascal)
664             CPPUNIT_TEST(skiplist_rcu_gpb_member_cmpmix_pascal)
665             CPPUNIT_TEST(skiplist_rcu_gpb_member_cmp_pascal_stat)
666             CPPUNIT_TEST(skiplist_rcu_gpb_member_less_pascal_stat)
667             CPPUNIT_TEST(skiplist_rcu_gpb_member_cmpmix_pascal_stat)
668
669             //
670             CPPUNIT_TEST(skiplist_rcu_gpt_base_cmp)
671             CPPUNIT_TEST(skiplist_rcu_gpt_base_less)
672             CPPUNIT_TEST(skiplist_rcu_gpt_base_cmpmix)
673             CPPUNIT_TEST(skiplist_rcu_gpt_base_cmp_stat)
674             CPPUNIT_TEST(skiplist_rcu_gpt_base_less_stat)
675             CPPUNIT_TEST(skiplist_rcu_gpt_base_cmpmix_stat)
676             CPPUNIT_TEST(skiplist_rcu_gpt_base_cmp_xorshift)
677             CPPUNIT_TEST(skiplist_rcu_gpt_base_less_xorshift)
678             CPPUNIT_TEST(skiplist_rcu_gpt_base_cmpmix_xorshift)
679             CPPUNIT_TEST(skiplist_rcu_gpt_base_cmp_xorshift_stat)
680             CPPUNIT_TEST(skiplist_rcu_gpt_base_less_xorshift_stat)
681             CPPUNIT_TEST(skiplist_rcu_gpt_base_cmpmix_xorshift_stat)
682             CPPUNIT_TEST(skiplist_rcu_gpt_base_cmp_pascal)
683             CPPUNIT_TEST(skiplist_rcu_gpt_base_less_pascal)
684             CPPUNIT_TEST(skiplist_rcu_gpt_base_cmpmix_pascal)
685             CPPUNIT_TEST(skiplist_rcu_gpt_base_cmp_pascal_stat)
686             CPPUNIT_TEST(skiplist_rcu_gpt_base_less_pascal_stat)
687             CPPUNIT_TEST(skiplist_rcu_gpt_base_cmpmix_pascal_stat)
688
689             CPPUNIT_TEST(skiplist_rcu_gpt_member_cmp)
690             CPPUNIT_TEST(skiplist_rcu_gpt_member_less)
691             CPPUNIT_TEST(skiplist_rcu_gpt_member_cmpmix)
692             CPPUNIT_TEST(skiplist_rcu_gpt_member_cmp_stat)
693             CPPUNIT_TEST(skiplist_rcu_gpt_member_less_stat)
694             CPPUNIT_TEST(skiplist_rcu_gpt_member_cmpmix_stat)
695             CPPUNIT_TEST(skiplist_rcu_gpt_member_cmp_xorshift)
696             CPPUNIT_TEST(skiplist_rcu_gpt_member_less_xorshift)
697             CPPUNIT_TEST(skiplist_rcu_gpt_member_cmpmix_xorshift)
698             CPPUNIT_TEST(skiplist_rcu_gpt_member_cmp_xorshift_stat)
699             CPPUNIT_TEST(skiplist_rcu_gpt_member_less_xorshift_stat)
700             CPPUNIT_TEST(skiplist_rcu_gpt_member_cmpmix_xorshift_stat)
701             CPPUNIT_TEST(skiplist_rcu_gpt_member_cmp_pascal)
702             CPPUNIT_TEST(skiplist_rcu_gpt_member_less_pascal)
703             CPPUNIT_TEST(skiplist_rcu_gpt_member_cmpmix_pascal)
704             CPPUNIT_TEST(skiplist_rcu_gpt_member_cmp_pascal_stat)
705             CPPUNIT_TEST(skiplist_rcu_gpt_member_less_pascal_stat)
706             CPPUNIT_TEST(skiplist_rcu_gpt_member_cmpmix_pascal_stat)
707
708             //
709             CPPUNIT_TEST(skiplist_rcu_shb_base_cmp)
710             CPPUNIT_TEST(skiplist_rcu_shb_base_less)
711             CPPUNIT_TEST(skiplist_rcu_shb_base_cmpmix)
712             CPPUNIT_TEST(skiplist_rcu_shb_base_cmp_stat)
713             CPPUNIT_TEST(skiplist_rcu_shb_base_less_stat)
714             CPPUNIT_TEST(skiplist_rcu_shb_base_cmpmix_stat)
715             CPPUNIT_TEST(skiplist_rcu_shb_base_cmp_xorshift)
716             CPPUNIT_TEST(skiplist_rcu_shb_base_less_xorshift)
717             CPPUNIT_TEST(skiplist_rcu_shb_base_cmpmix_xorshift)
718             CPPUNIT_TEST(skiplist_rcu_shb_base_cmp_xorshift_stat)
719             CPPUNIT_TEST(skiplist_rcu_shb_base_less_xorshift_stat)
720             CPPUNIT_TEST(skiplist_rcu_shb_base_cmpmix_xorshift_stat)
721             CPPUNIT_TEST(skiplist_rcu_shb_base_cmp_pascal)
722             CPPUNIT_TEST(skiplist_rcu_shb_base_less_pascal)
723             CPPUNIT_TEST(skiplist_rcu_shb_base_cmpmix_pascal)
724             CPPUNIT_TEST(skiplist_rcu_shb_base_cmp_pascal_stat)
725             CPPUNIT_TEST(skiplist_rcu_shb_base_less_pascal_stat)
726             CPPUNIT_TEST(skiplist_rcu_shb_base_cmpmix_pascal_stat)
727
728             CPPUNIT_TEST(skiplist_rcu_shb_member_cmp)
729             CPPUNIT_TEST(skiplist_rcu_shb_member_less)
730             CPPUNIT_TEST(skiplist_rcu_shb_member_cmpmix)
731             CPPUNIT_TEST(skiplist_rcu_shb_member_cmp_stat)
732             CPPUNIT_TEST(skiplist_rcu_shb_member_less_stat)
733             CPPUNIT_TEST(skiplist_rcu_shb_member_cmpmix_stat)
734             CPPUNIT_TEST(skiplist_rcu_shb_member_cmp_xorshift)
735             CPPUNIT_TEST(skiplist_rcu_shb_member_less_xorshift)
736             CPPUNIT_TEST(skiplist_rcu_shb_member_cmpmix_xorshift)
737             CPPUNIT_TEST(skiplist_rcu_shb_member_cmp_xorshift_stat)
738             CPPUNIT_TEST(skiplist_rcu_shb_member_less_xorshift_stat)
739             CPPUNIT_TEST(skiplist_rcu_shb_member_cmpmix_xorshift_stat)
740             CPPUNIT_TEST(skiplist_rcu_shb_member_cmp_pascal)
741             CPPUNIT_TEST(skiplist_rcu_shb_member_less_pascal)
742             CPPUNIT_TEST(skiplist_rcu_shb_member_cmpmix_pascal)
743             CPPUNIT_TEST(skiplist_rcu_shb_member_cmp_pascal_stat)
744             CPPUNIT_TEST(skiplist_rcu_shb_member_less_pascal_stat)
745             CPPUNIT_TEST(skiplist_rcu_shb_member_cmpmix_pascal_stat)
746
747             //
748             CPPUNIT_TEST(skiplist_rcu_sht_base_cmp)
749             CPPUNIT_TEST(skiplist_rcu_sht_base_less)
750             CPPUNIT_TEST(skiplist_rcu_sht_base_cmpmix)
751             CPPUNIT_TEST(skiplist_rcu_sht_base_cmp_stat)
752             CPPUNIT_TEST(skiplist_rcu_sht_base_less_stat)
753             CPPUNIT_TEST(skiplist_rcu_sht_base_cmpmix_stat)
754             CPPUNIT_TEST(skiplist_rcu_sht_base_cmp_xorshift)
755             CPPUNIT_TEST(skiplist_rcu_sht_base_less_xorshift)
756             CPPUNIT_TEST(skiplist_rcu_sht_base_cmpmix_xorshift)
757             CPPUNIT_TEST(skiplist_rcu_sht_base_cmp_xorshift_stat)
758             CPPUNIT_TEST(skiplist_rcu_sht_base_less_xorshift_stat)
759             CPPUNIT_TEST(skiplist_rcu_sht_base_cmpmix_xorshift_stat)
760             CPPUNIT_TEST(skiplist_rcu_sht_base_cmp_pascal)
761             CPPUNIT_TEST(skiplist_rcu_sht_base_less_pascal)
762             CPPUNIT_TEST(skiplist_rcu_sht_base_cmpmix_pascal)
763             CPPUNIT_TEST(skiplist_rcu_sht_base_cmp_pascal_stat)
764             CPPUNIT_TEST(skiplist_rcu_sht_base_less_pascal_stat)
765             CPPUNIT_TEST(skiplist_rcu_sht_base_cmpmix_pascal_stat)
766
767             CPPUNIT_TEST(skiplist_rcu_sht_member_cmp)
768             CPPUNIT_TEST(skiplist_rcu_sht_member_less)
769             CPPUNIT_TEST(skiplist_rcu_sht_member_cmpmix)
770             CPPUNIT_TEST(skiplist_rcu_sht_member_cmp_stat)
771             CPPUNIT_TEST(skiplist_rcu_sht_member_less_stat)
772             CPPUNIT_TEST(skiplist_rcu_sht_member_cmpmix_stat)
773             CPPUNIT_TEST(skiplist_rcu_sht_member_cmp_xorshift)
774             CPPUNIT_TEST(skiplist_rcu_sht_member_less_xorshift)
775             CPPUNIT_TEST(skiplist_rcu_sht_member_cmpmix_xorshift)
776             CPPUNIT_TEST(skiplist_rcu_sht_member_cmp_xorshift_stat)
777             CPPUNIT_TEST(skiplist_rcu_sht_member_less_xorshift_stat)
778             CPPUNIT_TEST(skiplist_rcu_sht_member_cmpmix_xorshift_stat)
779             CPPUNIT_TEST(skiplist_rcu_sht_member_cmp_pascal)
780             CPPUNIT_TEST(skiplist_rcu_sht_member_less_pascal)
781             CPPUNIT_TEST(skiplist_rcu_sht_member_cmpmix_pascal)
782             CPPUNIT_TEST(skiplist_rcu_sht_member_cmp_pascal_stat)
783             CPPUNIT_TEST(skiplist_rcu_sht_member_less_pascal_stat)
784             CPPUNIT_TEST(skiplist_rcu_sht_member_cmpmix_pascal_stat)
785
786         CPPUNIT_TEST_SUITE_END()
787     };
788 } // namespace set