Added copyright and license
[libcds.git] / tests / test-hdr / map / hdr_skiplist_map_rcu.h
1 /*
2     This file is a part of libcds - Concurrent Data Structures library
3
4     (C) Copyright Maxim Khizhinsky (libcds.dev@gmail.com) 2006-2016
5
6     Source code repo: http://github.com/khizmax/libcds/
7     Download: http://sourceforge.net/projects/libcds/files/
8     
9     Redistribution and use in source and binary forms, with or without
10     modification, are permitted provided that the following conditions are met:
11
12     * Redistributions of source code must retain the above copyright notice, this
13       list of conditions and the following disclaimer.
14
15     * Redistributions in binary form must reproduce the above copyright notice,
16       this list of conditions and the following disclaimer in the documentation
17       and/or other materials provided with the distribution.
18
19     THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
20     AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
21     IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
22     DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
23     FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
24     DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
25     SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
26     CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
27     OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
28     OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.     
29 */
30
31 #ifndef CDSTEST_HDR_SKIPLIST_MAP_RCU_H
32 #define CDSTEST_HDR_SKIPLIST_MAP_RCU_H
33
34 #include "map/hdr_map.h"
35
36 namespace map {
37
38     class SkipListMapRCUHdrTest: public HashMapHdrTest
39     {
40         typedef HashMapHdrTest base_class;
41         typedef base_class::other_item  wrapped_item;
42         typedef base_class::other_less  wrapped_less;
43
44         template <class Map, typename PrintStat >
45         void test()
46         {
47             Map m;
48             test_int_with( m );
49
50             static int const nLimit = 10000;
51             typedef typename Map::iterator          set_iterator;
52             typedef typename Map::const_iterator    const_set_iterator;
53             typedef typename Map::gc::scoped_lock   rcu_lock;
54
55             int nCount = 0;
56             int nPrevKey = 0;
57
58             // Test iterator - ascending order
59             m.clear();
60             CPPUNIT_ASSERT( m.empty() );
61
62             for ( int i = 0; i < nLimit; ++i ) {
63                 CPPUNIT_ASSERT( m.insert(i, i) );
64             }
65             CPPUNIT_MSG( PrintStat()(m, "Iterator test, ascending insert order") );
66
67             nCount = 0;
68             nPrevKey = 0;
69             {
70                 rcu_lock sl;
71                 for ( set_iterator it = m.begin(), itEnd = m.end(); it != itEnd; ++it ) {
72                     CPPUNIT_ASSERT( (*it).first == it->second.m_val );
73                     CPPUNIT_ASSERT( m.contains( it->first ));
74                     it->second.m_val = (*it).first * 2;
75                     ++nCount;
76                     if ( it != m.begin() ) {
77                         CPPUNIT_ASSERT( nPrevKey + 1 == it->first );
78                     }
79                     nPrevKey = it->first;
80                 }
81             }
82             CPPUNIT_ASSERT( nCount == nLimit );
83
84             nCount = 0;
85             {
86                 rcu_lock sl;
87                 for ( const_set_iterator it = m.cbegin(), itEnd = m.cend(); it != itEnd; ++it ) {
88                     CPPUNIT_ASSERT( (*it).first * 2 == it->second.m_val );
89                     ++nCount;
90                     if ( it != m.cbegin() ) {
91                         CPPUNIT_ASSERT( nPrevKey + 1 == it->first );
92                     }
93                     nPrevKey = it->first;
94                 }
95             }
96             CPPUNIT_ASSERT( nCount == nLimit );
97
98             // Test iterator - descending order
99             m.clear();
100             CPPUNIT_ASSERT( m.empty() );
101
102             for ( int i = nLimit; i > 0; --i ) {
103                 CPPUNIT_ASSERT( m.insert( i - 1, (i-1) * 2) );
104             }
105             CPPUNIT_MSG( PrintStat()(m, "Iterator test, descending insert order") );
106
107             nCount = 0;
108             nPrevKey = 0;
109             {
110                 rcu_lock sl;
111                 for ( set_iterator it = m.begin(), itEnd = m.end(); it != itEnd; ++it ) {
112                     CPPUNIT_ASSERT( (*it).first * 2 == it->second.m_val );
113                     CPPUNIT_ASSERT( m.contains( it->first ));
114                     it->second.m_val = (*it).first;
115                     ++nCount;
116                     if ( it != m.begin() ) {
117                         CPPUNIT_ASSERT( nPrevKey + 1 == it->first );
118                     }
119                     nPrevKey = it->first;
120                 }
121             }
122             CPPUNIT_ASSERT( nCount == nLimit );
123
124             nCount = 0;
125             {
126                 rcu_lock sl;
127                 for ( const_set_iterator it = m.cbegin(), itEnd = m.cend(); it != itEnd; ++it ) {
128                     CPPUNIT_ASSERT( (*it).first == it->second.m_val );
129                     ++nCount;
130                     if ( it != m.cbegin() ) {
131                         CPPUNIT_ASSERT( nPrevKey + 1 == it->first );
132                     }
133                     nPrevKey = it->first;
134                 }
135             }
136             CPPUNIT_ASSERT( nCount == nLimit );
137
138             // Test iterator - random order
139             m.clear();
140             CPPUNIT_ASSERT( m.empty() );
141             {
142                 int nRand[nLimit];
143                 for ( int i = 0; i < nLimit; ++i ) {
144                     nRand[i] = i;
145                 }
146                 shuffle( nRand, nRand + nLimit );
147
148                 for ( int i = 0; i < nLimit; ++i ) {
149                     CPPUNIT_ASSERT( m.insert(i, i) );
150                 }
151                 CPPUNIT_MSG( PrintStat()(m, "Iterator test, random insert order") );
152             }
153
154             nCount = 0;
155             nPrevKey = 0;
156             {
157                 rcu_lock sl;
158                 for ( set_iterator it = m.begin(), itEnd = m.end(); it != itEnd; ++it ) {
159                     CPPUNIT_ASSERT( (*it).first == it->second.m_val );
160                     CPPUNIT_ASSERT( m.contains( it->first ));
161                     it->second.m_val = (*it).first * 2;
162                     ++nCount;
163                     if ( it != m.begin() ) {
164                         CPPUNIT_ASSERT( nPrevKey + 1 == it->first );
165                     }
166                     nPrevKey = it->first;
167                 }
168             }
169             CPPUNIT_ASSERT( nCount == nLimit );
170
171             nCount = 0;
172             {
173                 rcu_lock sl;
174                 for ( const_set_iterator it = m.cbegin(), itEnd = m.cend(); it != itEnd; ++it ) {
175                     CPPUNIT_ASSERT( (*it).first * 2 == it->second.m_val );
176                     ++nCount;
177                     if ( it != m.cbegin() ) {
178                         CPPUNIT_ASSERT( nPrevKey + 1 == it->first );
179                     }
180                     nPrevKey = it->first;
181                 }
182             }
183             CPPUNIT_ASSERT( nCount == nLimit );
184
185             {
186                 int arrItem[nLimit];
187                 for ( int i = 0; i < nLimit; ++i )
188                     arrItem[i] = i;
189                 shuffle( arrItem, arrItem + nLimit );
190
191                 typedef typename Map::value_type value_type;
192                 typename Map::exempt_ptr ep;
193                 typename Map::raw_ptr rp;
194
195                 // extract/get
196                 for ( int i = 0; i < nLimit; ++i ) {
197                     int nKey = arrItem[i];
198                     {
199                         rcu_lock l;
200                         rp = m.get( nKey );
201                         CPPUNIT_ASSERT( rp );
202                         CPPUNIT_CHECK( rp->first == nKey );
203                         CPPUNIT_CHECK( rp->second.m_val == nKey * 2 );
204                     }
205                     rp.release();
206
207                     ep = m.extract( nKey );
208                     CPPUNIT_ASSERT( ep );
209                     CPPUNIT_ASSERT( !ep.empty() );
210                     CPPUNIT_CHECK( ep->first == nKey );
211                     CPPUNIT_CHECK( ep->second.m_val == nKey * 2 );
212                     ep.release();
213
214                     {
215                         rcu_lock l;
216                         CPPUNIT_CHECK( !m.get( nKey ));
217                     }
218                     ep = m.extract( nKey );
219                     CPPUNIT_CHECK( !ep );
220                 }
221                 CPPUNIT_ASSERT( m.empty() );
222
223                 // extract_with/get_with
224                 for ( int i = 0; i < nLimit; ++i )
225                     CPPUNIT_ASSERT( m.insert(arrItem[i], arrItem[i]*2) );
226
227                 for ( int i = 0; i < nLimit; ++i ) {
228                     int nKey = arrItem[i];
229                     {
230                         rcu_lock l;
231                         rp = m.get_with( wrapped_item(nKey), wrapped_less() );
232                         CPPUNIT_ASSERT( rp );
233                         CPPUNIT_CHECK( rp->first == nKey );
234                         CPPUNIT_CHECK( rp->second.m_val == nKey * 2 );
235                     }
236                     rp.release();
237
238                     ep = m.extract_with( wrapped_item( nKey ), wrapped_less() );
239                     CPPUNIT_ASSERT( ep );
240                     CPPUNIT_ASSERT( !ep.empty() );
241                     CPPUNIT_CHECK( ep->first == nKey );
242                     CPPUNIT_CHECK( ep->second.m_val == nKey * 2 );
243                     ep.release();
244
245                     {
246                         rcu_lock l;
247                         CPPUNIT_CHECK( !m.get_with( wrapped_item(nKey), wrapped_less() ));
248                     }
249                     ep = m.extract_with( wrapped_item( nKey ), wrapped_less() );
250                     CPPUNIT_CHECK( !ep );
251                 }
252                 CPPUNIT_ASSERT( m.empty() );
253
254                 // extract_min
255                 for ( int i = 0; i < nLimit; ++i )
256                     CPPUNIT_ASSERT( m.insert(arrItem[i], arrItem[i]*2) );
257                 for ( int i = 0; i < nLimit; ++i ) {
258                     ep = m.extract_min();
259                     CPPUNIT_ASSERT( ep );
260                     CPPUNIT_ASSERT( !ep.empty() );
261                     CPPUNIT_CHECK( ep->first == i );
262                     CPPUNIT_CHECK( ep->second.m_val == i * 2 );
263                     ep.release();
264                 }
265                 CPPUNIT_ASSERT( m.empty() );
266                 ep = m.extract_min();
267                 CPPUNIT_CHECK( !ep );
268
269                 // extract_max
270                 for ( int i = 0; i < nLimit; ++i )
271                     CPPUNIT_ASSERT( m.insert(arrItem[i], arrItem[i]*2) );
272                 for ( int i = nLimit-1; i >= 0; --i ) {
273                     ep = m.extract_max();
274                     CPPUNIT_ASSERT( ep );
275                     CPPUNIT_ASSERT( !ep.empty() );
276                     CPPUNIT_CHECK( ep->first == i );
277                     CPPUNIT_CHECK( ep->second.m_val == i * 2 );
278                     ep.release();
279                 }
280                 CPPUNIT_ASSERT( m.empty() );
281                 ep = m.extract_max();
282                 CPPUNIT_CHECK( !ep );
283             }
284
285             CPPUNIT_MSG( PrintStat()(m, nullptr) );
286         }
287
288     public:
289         void SkipList_RCU_GPI_less();
290         void SkipList_RCU_GPI_cmp();
291         void SkipList_RCU_GPI_cmpless();
292         void SkipList_RCU_GPI_less_stat();
293         void SkipList_RCU_GPI_cmp_stat();
294         void SkipList_RCU_GPI_cmpless_stat();
295         void SkipList_RCU_GPI_xorshift_less();
296         void SkipList_RCU_GPI_xorshift_cmp();
297         void SkipList_RCU_GPI_xorshift_cmpless();
298         void SkipList_RCU_GPI_xorshift_less_stat();
299         void SkipList_RCU_GPI_xorshift_cmp_stat();
300         void SkipList_RCU_GPI_xorshift_cmpless_stat();
301         void SkipList_RCU_GPI_turbopas_less();
302         void SkipList_RCU_GPI_turbopas_cmp();
303         void SkipList_RCU_GPI_turbopas_cmpless();
304         void SkipList_RCU_GPI_turbopas_less_stat();
305         void SkipList_RCU_GPI_turbopas_cmp_stat();
306         void SkipList_RCU_GPI_turbopas_cmpless_stat();
307         void SkipList_RCU_GPI_michaelalloc_less();
308         void SkipList_RCU_GPI_michaelalloc_cmp();
309         void SkipList_RCU_GPI_michaelalloc_cmpless();
310         void SkipList_RCU_GPI_michaelalloc_less_stat();
311         void SkipList_RCU_GPI_michaelalloc_cmp_stat();
312         void SkipList_RCU_GPI_michaelalloc_cmpless_stat();
313
314         void SkipList_RCU_GPB_less();
315         void SkipList_RCU_GPB_cmp();
316         void SkipList_RCU_GPB_cmpless();
317         void SkipList_RCU_GPB_less_stat();
318         void SkipList_RCU_GPB_cmp_stat();
319         void SkipList_RCU_GPB_cmpless_stat();
320         void SkipList_RCU_GPB_xorshift_less();
321         void SkipList_RCU_GPB_xorshift_cmp();
322         void SkipList_RCU_GPB_xorshift_cmpless();
323         void SkipList_RCU_GPB_xorshift_less_stat();
324         void SkipList_RCU_GPB_xorshift_cmp_stat();
325         void SkipList_RCU_GPB_xorshift_cmpless_stat();
326         void SkipList_RCU_GPB_turbopas_less();
327         void SkipList_RCU_GPB_turbopas_cmp();
328         void SkipList_RCU_GPB_turbopas_cmpless();
329         void SkipList_RCU_GPB_turbopas_less_stat();
330         void SkipList_RCU_GPB_turbopas_cmp_stat();
331         void SkipList_RCU_GPB_turbopas_cmpless_stat();
332         void SkipList_RCU_GPB_michaelalloc_less();
333         void SkipList_RCU_GPB_michaelalloc_cmp();
334         void SkipList_RCU_GPB_michaelalloc_cmpless();
335         void SkipList_RCU_GPB_michaelalloc_less_stat();
336         void SkipList_RCU_GPB_michaelalloc_cmp_stat();
337         void SkipList_RCU_GPB_michaelalloc_cmpless_stat();
338
339         void SkipList_RCU_GPT_less();
340         void SkipList_RCU_GPT_cmp();
341         void SkipList_RCU_GPT_cmpless();
342         void SkipList_RCU_GPT_less_stat();
343         void SkipList_RCU_GPT_cmp_stat();
344         void SkipList_RCU_GPT_cmpless_stat();
345         void SkipList_RCU_GPT_xorshift_less();
346         void SkipList_RCU_GPT_xorshift_cmp();
347         void SkipList_RCU_GPT_xorshift_cmpless();
348         void SkipList_RCU_GPT_xorshift_less_stat();
349         void SkipList_RCU_GPT_xorshift_cmp_stat();
350         void SkipList_RCU_GPT_xorshift_cmpless_stat();
351         void SkipList_RCU_GPT_turbopas_less();
352         void SkipList_RCU_GPT_turbopas_cmp();
353         void SkipList_RCU_GPT_turbopas_cmpless();
354         void SkipList_RCU_GPT_turbopas_less_stat();
355         void SkipList_RCU_GPT_turbopas_cmp_stat();
356         void SkipList_RCU_GPT_turbopas_cmpless_stat();
357         void SkipList_RCU_GPT_michaelalloc_less();
358         void SkipList_RCU_GPT_michaelalloc_cmp();
359         void SkipList_RCU_GPT_michaelalloc_cmpless();
360         void SkipList_RCU_GPT_michaelalloc_less_stat();
361         void SkipList_RCU_GPT_michaelalloc_cmp_stat();
362         void SkipList_RCU_GPT_michaelalloc_cmpless_stat();
363
364         void SkipList_RCU_SHB_less();
365         void SkipList_RCU_SHB_cmp();
366         void SkipList_RCU_SHB_cmpless();
367         void SkipList_RCU_SHB_less_stat();
368         void SkipList_RCU_SHB_cmp_stat();
369         void SkipList_RCU_SHB_cmpless_stat();
370         void SkipList_RCU_SHB_xorshift_less();
371         void SkipList_RCU_SHB_xorshift_cmp();
372         void SkipList_RCU_SHB_xorshift_cmpless();
373         void SkipList_RCU_SHB_xorshift_less_stat();
374         void SkipList_RCU_SHB_xorshift_cmp_stat();
375         void SkipList_RCU_SHB_xorshift_cmpless_stat();
376         void SkipList_RCU_SHB_turbopas_less();
377         void SkipList_RCU_SHB_turbopas_cmp();
378         void SkipList_RCU_SHB_turbopas_cmpless();
379         void SkipList_RCU_SHB_turbopas_less_stat();
380         void SkipList_RCU_SHB_turbopas_cmp_stat();
381         void SkipList_RCU_SHB_turbopas_cmpless_stat();
382         void SkipList_RCU_SHB_michaelalloc_less();
383         void SkipList_RCU_SHB_michaelalloc_cmp();
384         void SkipList_RCU_SHB_michaelalloc_cmpless();
385         void SkipList_RCU_SHB_michaelalloc_less_stat();
386         void SkipList_RCU_SHB_michaelalloc_cmp_stat();
387         void SkipList_RCU_SHB_michaelalloc_cmpless_stat();
388
389         void SkipList_RCU_SHT_less();
390         void SkipList_RCU_SHT_cmp();
391         void SkipList_RCU_SHT_cmpless();
392         void SkipList_RCU_SHT_less_stat();
393         void SkipList_RCU_SHT_cmp_stat();
394         void SkipList_RCU_SHT_cmpless_stat();
395         void SkipList_RCU_SHT_xorshift_less();
396         void SkipList_RCU_SHT_xorshift_cmp();
397         void SkipList_RCU_SHT_xorshift_cmpless();
398         void SkipList_RCU_SHT_xorshift_less_stat();
399         void SkipList_RCU_SHT_xorshift_cmp_stat();
400         void SkipList_RCU_SHT_xorshift_cmpless_stat();
401         void SkipList_RCU_SHT_turbopas_less();
402         void SkipList_RCU_SHT_turbopas_cmp();
403         void SkipList_RCU_SHT_turbopas_cmpless();
404         void SkipList_RCU_SHT_turbopas_less_stat();
405         void SkipList_RCU_SHT_turbopas_cmp_stat();
406         void SkipList_RCU_SHT_turbopas_cmpless_stat();
407         void SkipList_RCU_SHT_michaelalloc_less();
408         void SkipList_RCU_SHT_michaelalloc_cmp();
409         void SkipList_RCU_SHT_michaelalloc_cmpless();
410         void SkipList_RCU_SHT_michaelalloc_less_stat();
411         void SkipList_RCU_SHT_michaelalloc_cmp_stat();
412         void SkipList_RCU_SHT_michaelalloc_cmpless_stat();
413
414         CPPUNIT_TEST_SUITE(SkipListMapRCUHdrTest)
415             CPPUNIT_TEST(SkipList_RCU_GPI_less)
416             CPPUNIT_TEST(SkipList_RCU_GPI_cmp)
417             CPPUNIT_TEST(SkipList_RCU_GPI_cmpless)
418             CPPUNIT_TEST(SkipList_RCU_GPI_less_stat)
419             CPPUNIT_TEST(SkipList_RCU_GPI_cmp_stat)
420             CPPUNIT_TEST(SkipList_RCU_GPI_cmpless_stat)
421             CPPUNIT_TEST(SkipList_RCU_GPI_xorshift_less)
422             CPPUNIT_TEST(SkipList_RCU_GPI_xorshift_cmp)
423             CPPUNIT_TEST(SkipList_RCU_GPI_xorshift_cmpless)
424             CPPUNIT_TEST(SkipList_RCU_GPI_xorshift_less_stat)
425             CPPUNIT_TEST(SkipList_RCU_GPI_xorshift_cmp_stat)
426             CPPUNIT_TEST(SkipList_RCU_GPI_xorshift_cmpless_stat)
427             CPPUNIT_TEST(SkipList_RCU_GPI_turbopas_less)
428             CPPUNIT_TEST(SkipList_RCU_GPI_turbopas_cmp)
429             CPPUNIT_TEST(SkipList_RCU_GPI_turbopas_cmpless)
430             CPPUNIT_TEST(SkipList_RCU_GPI_turbopas_less_stat)
431             CPPUNIT_TEST(SkipList_RCU_GPI_turbopas_cmp_stat)
432             CPPUNIT_TEST(SkipList_RCU_GPI_turbopas_cmpless_stat)
433             CPPUNIT_TEST(SkipList_RCU_GPI_michaelalloc_less)
434             CPPUNIT_TEST(SkipList_RCU_GPI_michaelalloc_cmp)
435             CPPUNIT_TEST(SkipList_RCU_GPI_michaelalloc_cmpless)
436             CPPUNIT_TEST(SkipList_RCU_GPI_michaelalloc_less_stat)
437             CPPUNIT_TEST(SkipList_RCU_GPI_michaelalloc_cmp_stat)
438             CPPUNIT_TEST(SkipList_RCU_GPI_michaelalloc_cmpless_stat)
439
440             CPPUNIT_TEST(SkipList_RCU_GPB_less)
441             CPPUNIT_TEST(SkipList_RCU_GPB_cmp)
442             CPPUNIT_TEST(SkipList_RCU_GPB_cmpless)
443             CPPUNIT_TEST(SkipList_RCU_GPB_less_stat)
444             CPPUNIT_TEST(SkipList_RCU_GPB_cmp_stat)
445             CPPUNIT_TEST(SkipList_RCU_GPB_cmpless_stat)
446             CPPUNIT_TEST(SkipList_RCU_GPB_xorshift_less)
447             CPPUNIT_TEST(SkipList_RCU_GPB_xorshift_cmp)
448             CPPUNIT_TEST(SkipList_RCU_GPB_xorshift_cmpless)
449             CPPUNIT_TEST(SkipList_RCU_GPB_xorshift_less_stat)
450             CPPUNIT_TEST(SkipList_RCU_GPB_xorshift_cmp_stat)
451             CPPUNIT_TEST(SkipList_RCU_GPB_xorshift_cmpless_stat)
452             CPPUNIT_TEST(SkipList_RCU_GPB_turbopas_less)
453             CPPUNIT_TEST(SkipList_RCU_GPB_turbopas_cmp)
454             CPPUNIT_TEST(SkipList_RCU_GPB_turbopas_cmpless)
455             CPPUNIT_TEST(SkipList_RCU_GPB_turbopas_less_stat)
456             CPPUNIT_TEST(SkipList_RCU_GPB_turbopas_cmp_stat)
457             CPPUNIT_TEST(SkipList_RCU_GPB_turbopas_cmpless_stat)
458             CPPUNIT_TEST(SkipList_RCU_GPB_michaelalloc_less)
459             CPPUNIT_TEST(SkipList_RCU_GPB_michaelalloc_cmp)
460             CPPUNIT_TEST(SkipList_RCU_GPB_michaelalloc_cmpless)
461             CPPUNIT_TEST(SkipList_RCU_GPB_michaelalloc_less_stat)
462             CPPUNIT_TEST(SkipList_RCU_GPB_michaelalloc_cmp_stat)
463             CPPUNIT_TEST(SkipList_RCU_GPB_michaelalloc_cmpless_stat)
464
465             CPPUNIT_TEST(SkipList_RCU_GPT_less)
466             CPPUNIT_TEST(SkipList_RCU_GPT_cmp)
467             CPPUNIT_TEST(SkipList_RCU_GPT_cmpless)
468             CPPUNIT_TEST(SkipList_RCU_GPT_less_stat)
469             CPPUNIT_TEST(SkipList_RCU_GPT_cmp_stat)
470             CPPUNIT_TEST(SkipList_RCU_GPT_cmpless_stat)
471             CPPUNIT_TEST(SkipList_RCU_GPT_xorshift_less)
472             CPPUNIT_TEST(SkipList_RCU_GPT_xorshift_cmp)
473             CPPUNIT_TEST(SkipList_RCU_GPT_xorshift_cmpless)
474             CPPUNIT_TEST(SkipList_RCU_GPT_xorshift_less_stat)
475             CPPUNIT_TEST(SkipList_RCU_GPT_xorshift_cmp_stat)
476             CPPUNIT_TEST(SkipList_RCU_GPT_xorshift_cmpless_stat)
477             CPPUNIT_TEST(SkipList_RCU_GPT_turbopas_less)
478             CPPUNIT_TEST(SkipList_RCU_GPT_turbopas_cmp)
479             CPPUNIT_TEST(SkipList_RCU_GPT_turbopas_cmpless)
480             CPPUNIT_TEST(SkipList_RCU_GPT_turbopas_less_stat)
481             CPPUNIT_TEST(SkipList_RCU_GPT_turbopas_cmp_stat)
482             CPPUNIT_TEST(SkipList_RCU_GPT_turbopas_cmpless_stat)
483             CPPUNIT_TEST(SkipList_RCU_GPT_michaelalloc_less)
484             CPPUNIT_TEST(SkipList_RCU_GPT_michaelalloc_cmp)
485             CPPUNIT_TEST(SkipList_RCU_GPT_michaelalloc_cmpless)
486             CPPUNIT_TEST(SkipList_RCU_GPT_michaelalloc_less_stat)
487             CPPUNIT_TEST(SkipList_RCU_GPT_michaelalloc_cmp_stat)
488             CPPUNIT_TEST(SkipList_RCU_GPT_michaelalloc_cmpless_stat)
489
490             CPPUNIT_TEST(SkipList_RCU_SHB_less)
491             CPPUNIT_TEST(SkipList_RCU_SHB_cmp)
492             CPPUNIT_TEST(SkipList_RCU_SHB_cmpless)
493             CPPUNIT_TEST(SkipList_RCU_SHB_less_stat)
494             CPPUNIT_TEST(SkipList_RCU_SHB_cmp_stat)
495             CPPUNIT_TEST(SkipList_RCU_SHB_cmpless_stat)
496             CPPUNIT_TEST(SkipList_RCU_SHB_xorshift_less)
497             CPPUNIT_TEST(SkipList_RCU_SHB_xorshift_cmp)
498             CPPUNIT_TEST(SkipList_RCU_SHB_xorshift_cmpless)
499             CPPUNIT_TEST(SkipList_RCU_SHB_xorshift_less_stat)
500             CPPUNIT_TEST(SkipList_RCU_SHB_xorshift_cmp_stat)
501             CPPUNIT_TEST(SkipList_RCU_SHB_xorshift_cmpless_stat)
502             CPPUNIT_TEST(SkipList_RCU_SHB_turbopas_less)
503             CPPUNIT_TEST(SkipList_RCU_SHB_turbopas_cmp)
504             CPPUNIT_TEST(SkipList_RCU_SHB_turbopas_cmpless)
505             CPPUNIT_TEST(SkipList_RCU_SHB_turbopas_less_stat)
506             CPPUNIT_TEST(SkipList_RCU_SHB_turbopas_cmp_stat)
507             CPPUNIT_TEST(SkipList_RCU_SHB_turbopas_cmpless_stat)
508             CPPUNIT_TEST(SkipList_RCU_SHB_michaelalloc_less)
509             CPPUNIT_TEST(SkipList_RCU_SHB_michaelalloc_cmp)
510             CPPUNIT_TEST(SkipList_RCU_SHB_michaelalloc_cmpless)
511             CPPUNIT_TEST(SkipList_RCU_SHB_michaelalloc_less_stat)
512             CPPUNIT_TEST(SkipList_RCU_SHB_michaelalloc_cmp_stat)
513             CPPUNIT_TEST(SkipList_RCU_SHB_michaelalloc_cmpless_stat)
514
515             CPPUNIT_TEST(SkipList_RCU_SHT_less)
516             CPPUNIT_TEST(SkipList_RCU_SHT_cmp)
517             CPPUNIT_TEST(SkipList_RCU_SHT_cmpless)
518             CPPUNIT_TEST(SkipList_RCU_SHT_less_stat)
519             CPPUNIT_TEST(SkipList_RCU_SHT_cmp_stat)
520             CPPUNIT_TEST(SkipList_RCU_SHT_cmpless_stat)
521             CPPUNIT_TEST(SkipList_RCU_SHT_xorshift_less)
522             CPPUNIT_TEST(SkipList_RCU_SHT_xorshift_cmp)
523             CPPUNIT_TEST(SkipList_RCU_SHT_xorshift_cmpless)
524             CPPUNIT_TEST(SkipList_RCU_SHT_xorshift_less_stat)
525             CPPUNIT_TEST(SkipList_RCU_SHT_xorshift_cmp_stat)
526             CPPUNIT_TEST(SkipList_RCU_SHT_xorshift_cmpless_stat)
527             CPPUNIT_TEST(SkipList_RCU_SHT_turbopas_less)
528             CPPUNIT_TEST(SkipList_RCU_SHT_turbopas_cmp)
529             CPPUNIT_TEST(SkipList_RCU_SHT_turbopas_cmpless)
530             CPPUNIT_TEST(SkipList_RCU_SHT_turbopas_less_stat)
531             CPPUNIT_TEST(SkipList_RCU_SHT_turbopas_cmp_stat)
532             CPPUNIT_TEST(SkipList_RCU_SHT_turbopas_cmpless_stat)
533             CPPUNIT_TEST(SkipList_RCU_SHT_michaelalloc_less)
534             CPPUNIT_TEST(SkipList_RCU_SHT_michaelalloc_cmp)
535             CPPUNIT_TEST(SkipList_RCU_SHT_michaelalloc_cmpless)
536             CPPUNIT_TEST(SkipList_RCU_SHT_michaelalloc_less_stat)
537             CPPUNIT_TEST(SkipList_RCU_SHT_michaelalloc_cmp_stat)
538             CPPUNIT_TEST(SkipList_RCU_SHT_michaelalloc_cmpless_stat)
539
540         CPPUNIT_TEST_SUITE_END()
541
542     };
543
544 } // namespace map
545
546 #endif // #ifndef CDSTEST_HDR_SKIPLIST_MAP_RCU_H