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