ba105d36cf6142c57998e69a5fccf28fff835c06
[libcds.git] / tests / test-hdr / set / hdr_intrusive_cuckoo_set.h
1 //$$CDS-header$$
2
3 #include "cppunit/cppunit_proxy.h"
4 #include <cds/opt/hash.h>
5
6 // cds::intrusive namespace forward declaration
7 namespace cds { namespace intrusive {}}
8
9 namespace set {
10     namespace ci = cds::intrusive;
11     namespace co = cds::opt;
12
13     // MichaelHashSet
14     class IntrusiveCuckooSetHdrTest: public CppUnitMini::TestCase
15     {
16     public:
17         struct stat
18         {
19             unsigned int nDisposeCount  ;   // count of disposer calling
20             unsigned int nFindCount     ;   // count of find-functor calling
21             unsigned int nFindArgCount;
22             unsigned int nInsertCount;
23             unsigned int nEnsureNewCount;
24             unsigned int nEnsureCount;
25             unsigned int nEraseCount;
26
27             stat()
28             {
29                 memset( this, 0, sizeof(*this));
30             }
31
32             stat& operator=( stat const& s)
33             {
34                 memcpy( this, &s, sizeof(*this));
35                 return *this;
36             }
37         };
38
39         struct item
40         {
41             int nKey;
42             int nVal;
43
44             item()
45             {}
46
47             item(int key, int val)
48                 : nKey( key )
49                 , nVal(val)
50             {}
51
52             item(const item& v )
53                 : nKey( v.nKey )
54                 , nVal( v.nVal )
55             {}
56
57             int key() const
58             {
59                 return nKey;
60             }
61
62             int val() const
63             {
64                 return nVal;
65             }
66         };
67
68         template <typename Hook>
69         struct base_item
70             : public item
71             , public Hook
72             , public stat
73
74         {
75             base_item()
76             {}
77
78             base_item(int key, int val)
79                 : item( key, val )
80             {}
81
82             base_item(const base_item& v )
83                 : item( static_cast<item const&>(v) )
84                 , stat()
85             {}
86         };
87
88         template <typename Hook>
89         struct member_item
90             : public item
91             , public stat
92         {
93             Hook hMember;
94
95             member_item()
96             {}
97
98             member_item(int key, int val)
99                 : item( key, val )
100             {}
101
102             member_item(const member_item& v )
103                 : item( static_cast<item const&>(v))
104                 , stat()
105             {}
106         };
107
108         struct find_key {
109             int nKey;
110
111             find_key( int key )
112                 : nKey(key)
113             {}
114         };
115
116         struct hash_int {
117             size_t operator()( int i ) const
118             {
119                 return co::v::hash<int>()( i );
120             }
121             template <typename Item>
122             size_t operator()( const Item& i ) const
123             {
124                 return (*this)( i.key() );
125             }
126             size_t operator()( find_key const& i) const
127             {
128                 return co::v::hash<int>()( i.nKey );
129             }
130         };
131
132         template <typename T>
133         struct less
134         {
135             bool operator ()(const T& v1, const T& v2 ) const
136             {
137                 return v1.key() < v2.key();
138             }
139
140             template <typename Q>
141             bool operator ()(const T& v1, const Q& v2 ) const
142             {
143                 return v1.key() < v2;
144             }
145
146             template <typename Q>
147             bool operator ()(const Q& v1, const T& v2 ) const
148             {
149                 return v1 < v2.key();
150             }
151         };
152
153         template <typename T>
154         struct cmp {
155             int operator ()(const T& v1, const T& v2 ) const
156             {
157                 if ( v1.key() < v2.key() )
158                     return -1;
159                 return v1.key() > v2.key() ? 1 : 0;
160             }
161
162             template <typename Q>
163             int operator ()(const T& v1, const Q& v2 ) const
164             {
165                 if ( v1.key() < v2 )
166                     return -1;
167                 return v1.key() > v2 ? 1 : 0;
168             }
169
170             template <typename Q>
171             int operator ()(const Q& v1, const T& v2 ) const
172             {
173                 if ( v1 < v2.key() )
174                     return -1;
175                 return v1 > v2.key() ? 1 : 0;
176             }
177         };
178
179         struct faked_disposer
180         {
181             template <typename T>
182             void operator ()( T * p )
183             {
184                 ++p->nDisposeCount;
185             }
186         };
187
188         struct insert_functor {
189             template <typename Item>
190             void operator()( Item& e)
191             {
192                 ++e.nInsertCount;
193             }
194         };
195
196         struct ensure_functor {
197             template <typename Item>
198             void operator()( bool bNew, Item& e, Item& arg )
199             {
200                 if ( bNew ) {
201                     ++e.nEnsureNewCount;
202                     CPPUNIT_ASSERT_CURRENT( &e == &arg );
203                 }
204                 else
205                     ++e.nEnsureCount;
206             }
207         };
208
209         struct erase_functor {
210             template< typename Item >
211             void operator()( Item& e )
212             {
213                 ++e.nEraseCount;
214             }
215         };
216
217         struct find_functor {
218             template <typename Item, typename What>
219             void operator()( Item& e, What& )
220             {
221                 ++e.nFindCount;
222             }
223
224             template <typename Item>
225             void operator()( Item& e, Item& w )
226             {
227                 ++e.nFindCount;
228                 ++w.nFindArgCount;
229             }
230         };
231
232         struct less2 {
233             template <typename Item>
234             bool operator()( Item const& e, find_key const& k ) const
235             {
236                 return e.key() < k.nKey;
237             }
238             template <typename Item>
239             bool operator()( find_key const& k, Item const& e ) const
240             {
241                 return k.nKey < e.key();
242             }
243             template <typename Item>
244             bool operator()( Item const& e, int k ) const
245             {
246                 return e.key() < k;
247             }
248             template <typename Item>
249             bool operator()( int k, Item const& e ) const
250             {
251                 return k < e.key();
252             }
253         };
254
255         struct equal_to2 {
256             template <typename Item>
257             bool operator()( Item const& e, find_key const& k ) const
258             {
259                 return e.key() == k.nKey;
260             }
261             template <typename Item>
262             bool operator()( find_key const& k, Item const& e ) const
263             {
264                 return k.nKey == e.key();
265             }
266             template <typename Item>
267             bool operator()( Item const& e, int k ) const
268             {
269                 return e.key() == k;
270             }
271             template <typename Item>
272             bool operator()( int k, Item const& e ) const
273             {
274                 return k == e.key();
275             }
276         };
277
278         template <typename T>
279         struct auto_dispose {
280             T * m_pArr;
281             auto_dispose( T * pArr ): m_pArr( pArr ) {}
282             ~auto_dispose() { delete[] m_pArr; }
283         };
284
285         template <class Set>
286         void test_with(Set& s)
287         {
288             typedef typename Set::value_type    value_type;
289
290             int const k1 = 10;
291             int const k2 = 25;
292             int const k3 = 51;
293
294             int const v1 = 25;
295             int const v2 = 56;
296             int const v3 = 23;
297
298             value_type e1( k1, v1 );
299             value_type e2( k2, v2 );
300             value_type e3( k3, v3);
301
302             stat s1 = e1;
303             stat s2 = e2;
304             stat s3 = e3;
305
306             CPPUNIT_ASSERT( s.empty() );
307             CPPUNIT_ASSERT( s.size() == 0 );
308
309             CPPUNIT_ASSERT( !s.find(k1));
310             CPPUNIT_ASSERT( !s.find_with(k2, typename std::conditional<Set::c_isSorted, less2, equal_to2>::type() ));
311             CPPUNIT_ASSERT( !s.find(k3));
312
313             CPPUNIT_ASSERT( s.insert(e1));
314             CPPUNIT_ASSERT( s.find(e1));
315             CPPUNIT_ASSERT( s.find(k1));
316             CPPUNIT_ASSERT( s.find_with(k1, typename std::conditional<Set::c_isSorted, less2, equal_to2>::type()));
317             CPPUNIT_ASSERT( !s.find(e2));
318             CPPUNIT_ASSERT( !s.find(e3));
319
320             CPPUNIT_ASSERT( e2.nInsertCount == 0 );
321             CPPUNIT_ASSERT( s.insert(e2, insert_functor() ));
322             CPPUNIT_ASSERT( e2.nInsertCount == 1 );
323             CPPUNIT_ASSERT( s.find(e1, find_functor() ));
324             CPPUNIT_ASSERT( e1.nFindCount == 1 );
325             CPPUNIT_ASSERT( e1.nFindArgCount == 1 );
326             CPPUNIT_ASSERT( s.find(k1, find_functor() ));
327             CPPUNIT_ASSERT( e1.nFindCount == 2 );
328             CPPUNIT_ASSERT( e1.nFindArgCount == 1 );
329             CPPUNIT_ASSERT( s.find_with(k2, typename std::conditional<Set::c_isSorted, less2, equal_to2>::type(), find_functor() ));
330             CPPUNIT_ASSERT( e2.nFindCount == 1 );
331             CPPUNIT_ASSERT( e2.nFindArgCount == 0 );
332             CPPUNIT_ASSERT( s.find(e2, find_functor() ));
333             CPPUNIT_ASSERT( e2.nFindCount == 2 );
334             CPPUNIT_ASSERT( e2.nFindArgCount == 1 );
335             CPPUNIT_ASSERT( !s.find(k3, find_functor()));
336             CPPUNIT_ASSERT( e3.nFindCount == 0 );
337             CPPUNIT_ASSERT( e3.nFindArgCount == 0 );
338             CPPUNIT_ASSERT( !s.find(e3, find_functor()));
339             CPPUNIT_ASSERT( e3.nFindCount == 0 );
340             CPPUNIT_ASSERT( e3.nFindArgCount == 0 );
341
342             s1 = e1 ; s2 = e2 ; s3 = e3;
343
344             CPPUNIT_ASSERT( e3.nEnsureNewCount == 0 );
345             CPPUNIT_ASSERT( e3.nEnsureCount == 0 );
346             CPPUNIT_ASSERT( s.ensure( e3, ensure_functor() ) == std::make_pair(true, true));
347             CPPUNIT_ASSERT( e3.nEnsureNewCount == 1 );
348             CPPUNIT_ASSERT( e3.nEnsureCount == 0 );
349             CPPUNIT_ASSERT( s.find_with(find_key(k1), typename std::conditional<Set::c_isSorted, less2, equal_to2>::type(), find_functor() ));
350             CPPUNIT_ASSERT( e1.nFindCount == s1.nFindCount + 1 );
351             CPPUNIT_ASSERT( e1.nFindArgCount == s1.nFindArgCount );
352             CPPUNIT_ASSERT( s.find_with(k1, typename std::conditional<Set::c_isSorted, less2, equal_to2>::type(), find_functor() ));
353             CPPUNIT_ASSERT( e1.nFindCount == s1.nFindCount + 2 );
354             CPPUNIT_ASSERT( e1.nFindArgCount == s1.nFindArgCount );
355             CPPUNIT_ASSERT( s.find_with(k2, typename std::conditional<Set::c_isSorted, less2, equal_to2>::type(), find_functor() ));
356             CPPUNIT_ASSERT( e2.nFindCount == s2.nFindCount + 1 );
357             CPPUNIT_ASSERT( e2.nFindArgCount == s2.nFindArgCount );
358             CPPUNIT_ASSERT( s.find_with(find_key(k2), typename std::conditional<Set::c_isSorted, less2, equal_to2>::type() ));
359             CPPUNIT_ASSERT( e2.nFindCount == s2.nFindCount + 1 )        ;   // unchanged, no find_functor
360             CPPUNIT_ASSERT( e2.nFindArgCount == s2.nFindArgCount );
361             CPPUNIT_ASSERT( s.find_with(k3, typename std::conditional<Set::c_isSorted, less2, equal_to2>::type() ));
362             CPPUNIT_ASSERT( e3.nFindCount == s3.nFindCount )            ;   // unchanged, no find_functor
363             CPPUNIT_ASSERT( e3.nFindArgCount == s3.nFindArgCount );
364             CPPUNIT_ASSERT( s.find_with(find_key(k3), typename std::conditional<Set::c_isSorted, less2, equal_to2>::type(), find_functor() ));
365             CPPUNIT_ASSERT( e3.nFindCount == s3.nFindCount + 1 );
366             CPPUNIT_ASSERT( e3.nFindArgCount == s3.nFindArgCount );
367
368             s1 = e1 ; s2 = e2 ; s3 = e3;
369
370             // insert existing elements
371             {
372                 value_type eu( k2, 1000 );
373                 CPPUNIT_ASSERT( !s.insert( eu ));
374                 CPPUNIT_ASSERT( !s.insert( eu, insert_functor() ));
375                 CPPUNIT_ASSERT( e2.nInsertCount == s2.nInsertCount );
376
377                 CPPUNIT_ASSERT( s.ensure( eu, ensure_functor()) == std::make_pair(true, false));
378                 CPPUNIT_ASSERT( e2.nInsertCount == s2.nInsertCount );
379                 CPPUNIT_ASSERT( e2.nEnsureCount == s2.nEnsureCount + 1 );
380                 CPPUNIT_ASSERT( e2.nEnsureNewCount == s2.nEnsureNewCount  );
381             }
382
383             s1 = e1 ; s2 = e2 ; s3 = e3;
384
385             // unlink & erase test
386             {
387                 value_type eu( k2, 10 );
388                 CPPUNIT_ASSERT( !s.unlink(eu));
389             }
390
391             CPPUNIT_ASSERT( !s.empty() );
392             CPPUNIT_ASSERT( s.size() == 3 );
393
394             CPPUNIT_ASSERT( s.unlink( e1 ) );
395             CPPUNIT_ASSERT( s.erase_with( k2, typename std::conditional<Set::c_isSorted, less2, equal_to2>::type() ) == &e2 );
396             CPPUNIT_ASSERT( s.erase( e2 ) == NULL );
397             CPPUNIT_ASSERT( e3.nEraseCount == 0 );
398             CPPUNIT_ASSERT( s.erase_with( k3, typename std::conditional<Set::c_isSorted, less2, equal_to2>::type(), erase_functor()) == &e3 );
399             CPPUNIT_ASSERT( e3.nEraseCount == 1 );
400             CPPUNIT_ASSERT( s.erase( k3, erase_functor()) == NULL );
401             CPPUNIT_ASSERT( e3.nEraseCount == 1 );
402
403             CPPUNIT_ASSERT( s.insert( e3 ) );
404             CPPUNIT_ASSERT( s.erase( e3 ) == &e3 );
405             CPPUNIT_ASSERT( e3.nEraseCount == 1 );
406
407             CPPUNIT_ASSERT( s.empty() );
408             CPPUNIT_ASSERT( s.size() == 0 );
409
410             s1 = e1 ; s2 = e2 ; s3 = e3;
411
412             // clear & clear_and_dispose test
413             CPPUNIT_ASSERT( s.insert(e1));
414             CPPUNIT_ASSERT( s.insert(e2));
415             CPPUNIT_ASSERT( s.insert(e3));
416             CPPUNIT_ASSERT( !s.empty() );
417             CPPUNIT_ASSERT( s.size() == 3 );
418             s.clear();
419             CPPUNIT_ASSERT( s.empty() );
420             CPPUNIT_ASSERT( s.size() == 0 );
421
422             CPPUNIT_ASSERT( s.insert(e1));
423             CPPUNIT_ASSERT( s.insert(e2));
424             CPPUNIT_ASSERT( s.insert(e3));
425             CPPUNIT_ASSERT( !s.empty() );
426             CPPUNIT_ASSERT( s.size() == 3 );
427
428             CPPUNIT_ASSERT( e1.nDisposeCount == 0 );
429             CPPUNIT_ASSERT( e2.nDisposeCount == 0 );
430             CPPUNIT_ASSERT( e3.nDisposeCount == 0 );
431             s.clear_and_dispose( faked_disposer() );
432             CPPUNIT_ASSERT( e1.nDisposeCount == 1 );
433             CPPUNIT_ASSERT( e2.nDisposeCount == 1 );
434             CPPUNIT_ASSERT( e3.nDisposeCount == 1 );
435             CPPUNIT_ASSERT( s.empty() );
436             CPPUNIT_ASSERT( s.size() == 0 );
437
438             // resize test (up to 64K elements)
439             size_t const nSize = 64 * 1024;
440             value_type * arr = new value_type[nSize];
441             auto_dispose<value_type> ad(arr);
442             for ( size_t i = 0; i < nSize; ++i ) {
443                 value_type * p = new (arr + i) value_type( (int) i, (int) i * 2 );
444                 CPPUNIT_ASSERT_EX( s.insert( *p, insert_functor() ), "i=" << i );
445                 CPPUNIT_ASSERT_EX( p->nInsertCount == 1, "i=" << i );
446                 //for ( size_t j = 0; j <= i; ++j ) {
447                 //    if ( !s.find((int) j) ) {
448                 //        CPPUNIT_MSG( "Key " << j << " is not found after inserting key " << i );
449                 //    }
450                 //}
451             }
452
453             for ( size_t i = 0; i < nSize; ++i )
454                 CPPUNIT_ASSERT_EX( s.find((int) i), "Key " << i << " is not found" );
455
456             CPPUNIT_ASSERT( !s.empty() );
457             CPPUNIT_ASSERT( s.size() == nSize );
458             s.clear_and_dispose( faked_disposer() );
459             for ( size_t i = 0; i < nSize; ++i ) {
460                 CPPUNIT_ASSERT_EX( arr[i].nDisposeCount == 1, "i=" << i );
461             }
462         }
463
464         template <class Set>
465         void test()
466         {
467             // default ctor
468             {
469                 Set s;
470                 test_with(s);
471             }
472
473             // ctor with explicit initial capacity
474             {
475                 Set s(256);
476                 test_with(s);
477             }
478         }
479
480         template <class Set>
481         void test_cuckoo()
482         {
483             unsigned int nProbesetSize = Set::node_type::probeset_size ? Set::node_type::probeset_size : 4;
484             Set s( 256, nProbesetSize, nProbesetSize / 2 );
485             test_with( s );
486         }
487
488         // ***********************************************************
489         // Cuckoo hashing (striped)
490
491         void Cuckoo_striped_list_basehook_equal();
492         void Cuckoo_striped_vector_basehook_equal();
493         void Cuckoo_striped_list_basehook_sort_cmp();
494         void Cuckoo_striped_vector_basehook_sort_cmp();
495         void Cuckoo_striped_list_basehook_sort_less();
496         void Cuckoo_striped_vector_basehook_sort_less();
497         void Cuckoo_striped_list_basehook_sort_cmpmix();
498         void Cuckoo_striped_vector_basehook_sort_cmpmix();
499         void Cuckoo_striped_vector_basehook_sort_cmpmix_stat();
500
501         void Cuckoo_striped_list_basehook_equal_storehash();
502         void Cuckoo_striped_vector_basehook_equal_storehash();
503         void Cuckoo_striped_list_basehook_sort_cmp_storehash();
504         void Cuckoo_striped_vector_basehook_sort_cmp_storehash();
505         void Cuckoo_striped_list_basehook_sort_less_storehash();
506         void Cuckoo_striped_vector_basehook_sort_less_storehash();
507         void Cuckoo_striped_list_basehook_sort_cmpmix_storehash();
508         void Cuckoo_striped_vector_basehook_sort_cmpmix_storehash();
509
510         void Cuckoo_striped_list_memberhook_equal();
511         void Cuckoo_striped_vector_memberhook_equal();
512         void Cuckoo_striped_list_memberhook_sort_cmp();
513         void Cuckoo_striped_vector_memberhook_sort_cmp();
514         void Cuckoo_striped_list_memberhook_sort_less();
515         void Cuckoo_striped_vector_memberhook_sort_less();
516         void Cuckoo_striped_list_memberhook_sort_cmpmix();
517         void Cuckoo_striped_vector_memberhook_sort_cmpmix();
518
519         void Cuckoo_striped_list_memberhook_equal_storehash();
520         void Cuckoo_striped_vector_memberhook_equal_storehash();
521         void Cuckoo_striped_list_memberhook_sort_cmp_storehash();
522         void Cuckoo_striped_vector_memberhook_sort_cmp_storehash();
523         void Cuckoo_striped_list_memberhook_sort_less_storehash();
524         void Cuckoo_striped_vector_memberhook_sort_less_storehash();
525         void Cuckoo_striped_list_memberhook_sort_cmpmix_storehash();
526         void Cuckoo_striped_vector_memberhook_sort_cmpmix_storehash();
527
528         // ***********************************************************
529         // Cuckoo hashing (refinable)
530
531         void Cuckoo_refinable_list_basehook_equal();
532         void Cuckoo_refinable_vector_basehook_equal();
533         void Cuckoo_refinable_list_basehook_sort_cmp();
534         void Cuckoo_refinable_vector_basehook_sort_cmp();
535         void Cuckoo_refinable_list_basehook_sort_less();
536         void Cuckoo_refinable_vector_basehook_sort_less();
537         void Cuckoo_refinable_list_basehook_sort_cmpmix();
538         void Cuckoo_refinable_vector_basehook_sort_cmpmix();
539         void Cuckoo_refinable_vector_basehook_sort_cmpmix_stat();
540
541         void Cuckoo_refinable_list_basehook_equal_storehash();
542         void Cuckoo_refinable_vector_basehook_equal_storehash();
543         void Cuckoo_refinable_list_basehook_sort_cmp_storehash();
544         void Cuckoo_refinable_vector_basehook_sort_cmp_storehash();
545         void Cuckoo_refinable_list_basehook_sort_less_storehash();
546         void Cuckoo_refinable_vector_basehook_sort_less_storehash();
547         void Cuckoo_refinable_list_basehook_sort_cmpmix_storehash();
548         void Cuckoo_refinable_vector_basehook_sort_cmpmix_storehash();
549
550         void Cuckoo_refinable_list_memberhook_equal();
551         void Cuckoo_refinable_vector_memberhook_equal();
552         void Cuckoo_refinable_list_memberhook_sort_cmp();
553         void Cuckoo_refinable_vector_memberhook_sort_cmp();
554         void Cuckoo_refinable_list_memberhook_sort_less();
555         void Cuckoo_refinable_vector_memberhook_sort_less();
556         void Cuckoo_refinable_list_memberhook_sort_cmpmix();
557         void Cuckoo_refinable_vector_memberhook_sort_cmpmix();
558
559         void Cuckoo_refinable_list_memberhook_equal_storehash();
560         void Cuckoo_refinable_vector_memberhook_equal_storehash();
561         void Cuckoo_refinable_list_memberhook_sort_cmp_storehash();
562         void Cuckoo_refinable_vector_memberhook_sort_cmp_storehash();
563         void Cuckoo_refinable_list_memberhook_sort_less_storehash();
564         void Cuckoo_refinable_vector_memberhook_sort_less_storehash();
565         void Cuckoo_refinable_list_memberhook_sort_cmpmix_storehash();
566         void Cuckoo_refinable_vector_memberhook_sort_cmpmix_storehash();
567
568         CPPUNIT_TEST_SUITE(IntrusiveCuckooSetHdrTest)
569             // ***********************************************************
570             // Cuckoo hashing (striped)
571
572             CPPUNIT_TEST( Cuckoo_striped_list_basehook_equal)
573             CPPUNIT_TEST( Cuckoo_striped_vector_basehook_equal)
574             CPPUNIT_TEST( Cuckoo_striped_list_basehook_sort_cmp)
575             CPPUNIT_TEST( Cuckoo_striped_vector_basehook_sort_cmp)
576             CPPUNIT_TEST( Cuckoo_striped_list_basehook_sort_less)
577             CPPUNIT_TEST( Cuckoo_striped_vector_basehook_sort_less)
578             CPPUNIT_TEST( Cuckoo_striped_list_basehook_sort_cmpmix)
579             CPPUNIT_TEST( Cuckoo_striped_vector_basehook_sort_cmpmix)
580             CPPUNIT_TEST( Cuckoo_striped_vector_basehook_sort_cmpmix_stat)
581
582             CPPUNIT_TEST( Cuckoo_striped_list_basehook_equal_storehash)
583             CPPUNIT_TEST( Cuckoo_striped_vector_basehook_equal_storehash)
584             CPPUNIT_TEST( Cuckoo_striped_list_basehook_sort_cmp_storehash)
585             CPPUNIT_TEST( Cuckoo_striped_vector_basehook_sort_cmp_storehash)
586             CPPUNIT_TEST( Cuckoo_striped_list_basehook_sort_less_storehash)
587             CPPUNIT_TEST( Cuckoo_striped_vector_basehook_sort_less_storehash)
588             CPPUNIT_TEST( Cuckoo_striped_list_basehook_sort_cmpmix_storehash)
589             CPPUNIT_TEST( Cuckoo_striped_vector_basehook_sort_cmpmix_storehash)
590
591             CPPUNIT_TEST( Cuckoo_striped_list_memberhook_equal)
592             CPPUNIT_TEST( Cuckoo_striped_vector_memberhook_equal)
593             CPPUNIT_TEST( Cuckoo_striped_list_memberhook_sort_cmp)
594             CPPUNIT_TEST( Cuckoo_striped_vector_memberhook_sort_cmp)
595             CPPUNIT_TEST( Cuckoo_striped_list_memberhook_sort_less)
596             CPPUNIT_TEST( Cuckoo_striped_vector_memberhook_sort_less)
597             CPPUNIT_TEST( Cuckoo_striped_list_memberhook_sort_cmpmix)
598             CPPUNIT_TEST( Cuckoo_striped_vector_memberhook_sort_cmpmix)
599
600             CPPUNIT_TEST( Cuckoo_striped_list_memberhook_equal_storehash)
601             CPPUNIT_TEST( Cuckoo_striped_vector_memberhook_equal_storehash)
602             CPPUNIT_TEST( Cuckoo_striped_list_memberhook_sort_cmp_storehash)
603             CPPUNIT_TEST( Cuckoo_striped_vector_memberhook_sort_cmp_storehash)
604             CPPUNIT_TEST( Cuckoo_striped_list_memberhook_sort_less_storehash)
605             CPPUNIT_TEST( Cuckoo_striped_vector_memberhook_sort_less_storehash)
606             CPPUNIT_TEST( Cuckoo_striped_list_memberhook_sort_cmpmix_storehash)
607             CPPUNIT_TEST( Cuckoo_striped_vector_memberhook_sort_cmpmix_storehash)
608
609             // ***********************************************************
610             // Cuckoo hashing (refinable)
611
612             CPPUNIT_TEST( Cuckoo_refinable_list_basehook_equal)
613             CPPUNIT_TEST( Cuckoo_refinable_vector_basehook_equal)
614             CPPUNIT_TEST( Cuckoo_refinable_list_basehook_sort_cmp)
615             CPPUNIT_TEST( Cuckoo_refinable_vector_basehook_sort_cmp)
616             CPPUNIT_TEST( Cuckoo_refinable_list_basehook_sort_less)
617             CPPUNIT_TEST( Cuckoo_refinable_vector_basehook_sort_less)
618             CPPUNIT_TEST( Cuckoo_refinable_list_basehook_sort_cmpmix)
619             CPPUNIT_TEST( Cuckoo_refinable_vector_basehook_sort_cmpmix)
620             CPPUNIT_TEST( Cuckoo_refinable_vector_basehook_sort_cmpmix_stat)
621
622             CPPUNIT_TEST( Cuckoo_refinable_list_basehook_equal_storehash)
623             CPPUNIT_TEST( Cuckoo_refinable_vector_basehook_equal_storehash)
624             CPPUNIT_TEST( Cuckoo_refinable_list_basehook_sort_cmp_storehash)
625             CPPUNIT_TEST( Cuckoo_refinable_vector_basehook_sort_cmp_storehash)
626             CPPUNIT_TEST( Cuckoo_refinable_list_basehook_sort_less_storehash)
627             CPPUNIT_TEST( Cuckoo_refinable_vector_basehook_sort_less_storehash)
628             CPPUNIT_TEST( Cuckoo_refinable_list_basehook_sort_cmpmix_storehash)
629             CPPUNIT_TEST( Cuckoo_refinable_vector_basehook_sort_cmpmix_storehash)
630
631             CPPUNIT_TEST( Cuckoo_refinable_list_memberhook_equal)
632             CPPUNIT_TEST( Cuckoo_refinable_vector_memberhook_equal)
633             CPPUNIT_TEST( Cuckoo_refinable_list_memberhook_sort_cmp)
634             CPPUNIT_TEST( Cuckoo_refinable_vector_memberhook_sort_cmp)
635             CPPUNIT_TEST( Cuckoo_refinable_list_memberhook_sort_less)
636             CPPUNIT_TEST( Cuckoo_refinable_vector_memberhook_sort_less)
637             CPPUNIT_TEST( Cuckoo_refinable_list_memberhook_sort_cmpmix)
638             CPPUNIT_TEST( Cuckoo_refinable_vector_memberhook_sort_cmpmix)
639
640             CPPUNIT_TEST( Cuckoo_refinable_list_memberhook_equal_storehash)
641             CPPUNIT_TEST( Cuckoo_refinable_vector_memberhook_equal_storehash)
642             CPPUNIT_TEST( Cuckoo_refinable_list_memberhook_sort_cmp_storehash)
643             CPPUNIT_TEST( Cuckoo_refinable_vector_memberhook_sort_cmp_storehash)
644             CPPUNIT_TEST( Cuckoo_refinable_list_memberhook_sort_less_storehash)
645             CPPUNIT_TEST( Cuckoo_refinable_vector_memberhook_sort_less_storehash)
646             CPPUNIT_TEST( Cuckoo_refinable_list_memberhook_sort_cmpmix_storehash)
647             CPPUNIT_TEST( Cuckoo_refinable_vector_memberhook_sort_cmpmix_storehash)
648
649         CPPUNIT_TEST_SUITE_END()
650     };
651 } // namespace set