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