issue#11: tests/test-hdr: changed .h file guard prefix to CDSTEST_xxx
[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 ensure_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.find(k1));
313             CPPUNIT_ASSERT( !s.find_with(k2, typename std::conditional<Set::c_isSorted, less2, equal_to2>::type() ));
314             CPPUNIT_ASSERT( !s.find(k3));
315
316             CPPUNIT_ASSERT( s.insert(e1));
317             CPPUNIT_ASSERT( s.find(e1));
318             CPPUNIT_ASSERT( s.find(k1));
319             CPPUNIT_ASSERT( s.find_with(k1, typename std::conditional<Set::c_isSorted, less2, equal_to2>::type()));
320             CPPUNIT_ASSERT( !s.find(e2));
321             CPPUNIT_ASSERT( !s.find(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.ensure( e3, ensure_functor() ) == std::make_pair(true, true));
350             CPPUNIT_ASSERT( e3.nEnsureNewCount == 1 );
351             CPPUNIT_ASSERT( e3.nEnsureCount == 0 );
352             CPPUNIT_ASSERT( s.find_with(find_key(k1), typename std::conditional<Set::c_isSorted, less2, equal_to2>::type(), find_functor() ));
353             CPPUNIT_ASSERT( e1.nFindCount == s1.nFindCount + 1 );
354             CPPUNIT_ASSERT( e1.nFindArgCount == s1.nFindArgCount );
355             CPPUNIT_ASSERT( s.find_with(k1, typename std::conditional<Set::c_isSorted, less2, equal_to2>::type(), find_functor() ));
356             CPPUNIT_ASSERT( e1.nFindCount == s1.nFindCount + 2 );
357             CPPUNIT_ASSERT( e1.nFindArgCount == s1.nFindArgCount );
358             CPPUNIT_ASSERT( s.find_with(k2, typename std::conditional<Set::c_isSorted, less2, equal_to2>::type(), find_functor() ));
359             CPPUNIT_ASSERT( e2.nFindCount == s2.nFindCount + 1 );
360             CPPUNIT_ASSERT( e2.nFindArgCount == s2.nFindArgCount );
361             CPPUNIT_ASSERT( s.find_with(find_key(k2), typename std::conditional<Set::c_isSorted, less2, equal_to2>::type() ));
362             CPPUNIT_ASSERT( e2.nFindCount == s2.nFindCount + 1 )        ;   // unchanged, no find_functor
363             CPPUNIT_ASSERT( e2.nFindArgCount == s2.nFindArgCount );
364             CPPUNIT_ASSERT( s.find_with(k3, typename std::conditional<Set::c_isSorted, less2, equal_to2>::type() ));
365             CPPUNIT_ASSERT( e3.nFindCount == s3.nFindCount )            ;   // unchanged, no find_functor
366             CPPUNIT_ASSERT( e3.nFindArgCount == s3.nFindArgCount );
367             CPPUNIT_ASSERT( s.find_with(find_key(k3), typename std::conditional<Set::c_isSorted, less2, equal_to2>::type(), find_functor() ));
368             CPPUNIT_ASSERT( e3.nFindCount == s3.nFindCount + 1 );
369             CPPUNIT_ASSERT( e3.nFindArgCount == s3.nFindArgCount );
370
371             s1 = e1 ; s2 = e2 ; s3 = e3;
372
373             // insert existing elements
374             {
375                 value_type eu( k2, 1000 );
376                 CPPUNIT_ASSERT( !s.insert( eu ));
377                 CPPUNIT_ASSERT( !s.insert( eu, insert_functor() ));
378                 CPPUNIT_ASSERT( e2.nInsertCount == s2.nInsertCount );
379
380                 CPPUNIT_ASSERT( s.ensure( eu, ensure_functor()) == std::make_pair(true, false));
381                 CPPUNIT_ASSERT( e2.nInsertCount == s2.nInsertCount );
382                 CPPUNIT_ASSERT( e2.nEnsureCount == s2.nEnsureCount + 1 );
383                 CPPUNIT_ASSERT( e2.nEnsureNewCount == s2.nEnsureNewCount  );
384             }
385
386             s1 = e1 ; s2 = e2 ; s3 = e3;
387
388             // unlink & erase test
389             {
390                 value_type eu( k2, 10 );
391                 CPPUNIT_ASSERT( !s.unlink(eu));
392             }
393
394             CPPUNIT_ASSERT( !s.empty() );
395             CPPUNIT_ASSERT( s.size() == 3 );
396
397             CPPUNIT_ASSERT( s.unlink( e1 ) );
398             CPPUNIT_ASSERT( s.erase_with( k2, typename std::conditional<Set::c_isSorted, less2, equal_to2>::type() ) == &e2 );
399             CPPUNIT_ASSERT( s.erase( e2 ) == nullptr );
400             CPPUNIT_ASSERT( e3.nEraseCount == 0 );
401             CPPUNIT_ASSERT( s.erase_with( k3, typename std::conditional<Set::c_isSorted, less2, equal_to2>::type(), erase_functor()) == &e3 );
402             CPPUNIT_ASSERT( e3.nEraseCount == 1 );
403             CPPUNIT_ASSERT( s.erase( k3, erase_functor() ) == nullptr );
404             CPPUNIT_ASSERT( e3.nEraseCount == 1 );
405
406             CPPUNIT_ASSERT( s.insert( e3 ) );
407             CPPUNIT_ASSERT( s.erase( e3 ) == &e3 );
408             CPPUNIT_ASSERT( e3.nEraseCount == 1 );
409
410             CPPUNIT_ASSERT( s.empty() );
411             CPPUNIT_ASSERT( s.size() == 0 );
412
413             s1 = e1 ; s2 = e2 ; s3 = e3;
414
415             // clear & clear_and_dispose test
416             CPPUNIT_ASSERT( s.insert(e1));
417             CPPUNIT_ASSERT( s.insert(e2));
418             CPPUNIT_ASSERT( s.insert(e3));
419             CPPUNIT_ASSERT( !s.empty() );
420             CPPUNIT_ASSERT( s.size() == 3 );
421             s.clear();
422             CPPUNIT_ASSERT( s.empty() );
423             CPPUNIT_ASSERT( s.size() == 0 );
424
425             CPPUNIT_ASSERT( s.insert(e1));
426             CPPUNIT_ASSERT( s.insert(e2));
427             CPPUNIT_ASSERT( s.insert(e3));
428             CPPUNIT_ASSERT( !s.empty() );
429             CPPUNIT_ASSERT( s.size() == 3 );
430
431             CPPUNIT_ASSERT( e1.nDisposeCount == 0 );
432             CPPUNIT_ASSERT( e2.nDisposeCount == 0 );
433             CPPUNIT_ASSERT( e3.nDisposeCount == 0 );
434             s.clear_and_dispose( faked_disposer() );
435             CPPUNIT_ASSERT( e1.nDisposeCount == 1 );
436             CPPUNIT_ASSERT( e2.nDisposeCount == 1 );
437             CPPUNIT_ASSERT( e3.nDisposeCount == 1 );
438             CPPUNIT_ASSERT( s.empty() );
439             CPPUNIT_ASSERT( s.size() == 0 );
440
441             // resize test (up to 64K elements)
442             size_t const nSize = 64 * 1024;
443             value_type * arr = new value_type[nSize];
444             auto_dispose<value_type> ad(arr);
445             for ( size_t i = 0; i < nSize; ++i ) {
446                 value_type * p = new (arr + i) value_type( (int) i, (int) i * 2 );
447                 CPPUNIT_ASSERT_EX( s.insert( *p, insert_functor() ), "i=" << i );
448                 CPPUNIT_ASSERT_EX( p->nInsertCount == 1, "i=" << i );
449                 //for ( size_t j = 0; j <= i; ++j ) {
450                 //    if ( !s.find((int) j) ) {
451                 //        CPPUNIT_MSG( "Key " << j << " is not found after inserting key " << i );
452                 //    }
453                 //}
454             }
455
456             for ( size_t i = 0; i < nSize; ++i )
457                 CPPUNIT_ASSERT_EX( s.find((int) i), "Key " << i << " is not found" );
458
459             CPPUNIT_ASSERT( !s.empty() );
460             CPPUNIT_ASSERT( s.size() == nSize );
461             s.clear_and_dispose( faked_disposer() );
462             for ( size_t i = 0; i < nSize; ++i ) {
463                 CPPUNIT_ASSERT_EX( arr[i].nDisposeCount == 1, "i=" << i );
464             }
465         }
466
467         template <class Set>
468         void test()
469         {
470             // default ctor
471             {
472                 Set s;
473                 test_with(s);
474             }
475
476             // ctor with explicit initial capacity
477             {
478                 Set s(256);
479                 test_with(s);
480             }
481         }
482
483         template <class Set>
484         void test_cuckoo()
485         {
486             unsigned int nProbesetSize = Set::node_type::probeset_size ? Set::node_type::probeset_size : 4;
487             Set s( 256, nProbesetSize, nProbesetSize / 2 );
488             test_with( s );
489         }
490
491         // ***********************************************************
492         // Cuckoo hashing (striped)
493
494         void Cuckoo_striped_list_basehook_equal();
495         void Cuckoo_striped_vector_basehook_equal();
496         void Cuckoo_striped_list_basehook_sort_cmp();
497         void Cuckoo_striped_vector_basehook_sort_cmp();
498         void Cuckoo_striped_list_basehook_sort_less();
499         void Cuckoo_striped_vector_basehook_sort_less();
500         void Cuckoo_striped_list_basehook_sort_cmpmix();
501         void Cuckoo_striped_vector_basehook_sort_cmpmix();
502         void Cuckoo_striped_vector_basehook_sort_cmpmix_stat();
503
504         void Cuckoo_striped_list_basehook_equal_storehash();
505         void Cuckoo_striped_vector_basehook_equal_storehash();
506         void Cuckoo_striped_list_basehook_sort_cmp_storehash();
507         void Cuckoo_striped_vector_basehook_sort_cmp_storehash();
508         void Cuckoo_striped_list_basehook_sort_less_storehash();
509         void Cuckoo_striped_vector_basehook_sort_less_storehash();
510         void Cuckoo_striped_list_basehook_sort_cmpmix_storehash();
511         void Cuckoo_striped_vector_basehook_sort_cmpmix_storehash();
512
513         void Cuckoo_striped_list_memberhook_equal();
514         void Cuckoo_striped_vector_memberhook_equal();
515         void Cuckoo_striped_list_memberhook_sort_cmp();
516         void Cuckoo_striped_vector_memberhook_sort_cmp();
517         void Cuckoo_striped_list_memberhook_sort_less();
518         void Cuckoo_striped_vector_memberhook_sort_less();
519         void Cuckoo_striped_list_memberhook_sort_cmpmix();
520         void Cuckoo_striped_vector_memberhook_sort_cmpmix();
521
522         void Cuckoo_striped_list_memberhook_equal_storehash();
523         void Cuckoo_striped_vector_memberhook_equal_storehash();
524         void Cuckoo_striped_list_memberhook_sort_cmp_storehash();
525         void Cuckoo_striped_vector_memberhook_sort_cmp_storehash();
526         void Cuckoo_striped_list_memberhook_sort_less_storehash();
527         void Cuckoo_striped_vector_memberhook_sort_less_storehash();
528         void Cuckoo_striped_list_memberhook_sort_cmpmix_storehash();
529         void Cuckoo_striped_vector_memberhook_sort_cmpmix_storehash();
530
531         // ***********************************************************
532         // Cuckoo hashing (refinable)
533
534         void Cuckoo_refinable_list_basehook_equal();
535         void Cuckoo_refinable_vector_basehook_equal();
536         void Cuckoo_refinable_list_basehook_sort_cmp();
537         void Cuckoo_refinable_vector_basehook_sort_cmp();
538         void Cuckoo_refinable_list_basehook_sort_less();
539         void Cuckoo_refinable_vector_basehook_sort_less();
540         void Cuckoo_refinable_list_basehook_sort_cmpmix();
541         void Cuckoo_refinable_vector_basehook_sort_cmpmix();
542         void Cuckoo_refinable_vector_basehook_sort_cmpmix_stat();
543
544         void Cuckoo_refinable_list_basehook_equal_storehash();
545         void Cuckoo_refinable_vector_basehook_equal_storehash();
546         void Cuckoo_refinable_list_basehook_sort_cmp_storehash();
547         void Cuckoo_refinable_vector_basehook_sort_cmp_storehash();
548         void Cuckoo_refinable_list_basehook_sort_less_storehash();
549         void Cuckoo_refinable_vector_basehook_sort_less_storehash();
550         void Cuckoo_refinable_list_basehook_sort_cmpmix_storehash();
551         void Cuckoo_refinable_vector_basehook_sort_cmpmix_storehash();
552
553         void Cuckoo_refinable_list_memberhook_equal();
554         void Cuckoo_refinable_vector_memberhook_equal();
555         void Cuckoo_refinable_list_memberhook_sort_cmp();
556         void Cuckoo_refinable_vector_memberhook_sort_cmp();
557         void Cuckoo_refinable_list_memberhook_sort_less();
558         void Cuckoo_refinable_vector_memberhook_sort_less();
559         void Cuckoo_refinable_list_memberhook_sort_cmpmix();
560         void Cuckoo_refinable_vector_memberhook_sort_cmpmix();
561
562         void Cuckoo_refinable_list_memberhook_equal_storehash();
563         void Cuckoo_refinable_vector_memberhook_equal_storehash();
564         void Cuckoo_refinable_list_memberhook_sort_cmp_storehash();
565         void Cuckoo_refinable_vector_memberhook_sort_cmp_storehash();
566         void Cuckoo_refinable_list_memberhook_sort_less_storehash();
567         void Cuckoo_refinable_vector_memberhook_sort_less_storehash();
568         void Cuckoo_refinable_list_memberhook_sort_cmpmix_storehash();
569         void Cuckoo_refinable_vector_memberhook_sort_cmpmix_storehash();
570
571         CPPUNIT_TEST_SUITE(IntrusiveCuckooSetHdrTest)
572             // ***********************************************************
573             // Cuckoo hashing (striped)
574
575             CPPUNIT_TEST( Cuckoo_striped_list_basehook_equal)
576             CPPUNIT_TEST( Cuckoo_striped_vector_basehook_equal)
577             CPPUNIT_TEST( Cuckoo_striped_list_basehook_sort_cmp)
578             CPPUNIT_TEST( Cuckoo_striped_vector_basehook_sort_cmp)
579             CPPUNIT_TEST( Cuckoo_striped_list_basehook_sort_less)
580             CPPUNIT_TEST( Cuckoo_striped_vector_basehook_sort_less)
581             CPPUNIT_TEST( Cuckoo_striped_list_basehook_sort_cmpmix)
582             CPPUNIT_TEST( Cuckoo_striped_vector_basehook_sort_cmpmix)
583             CPPUNIT_TEST( Cuckoo_striped_vector_basehook_sort_cmpmix_stat)
584
585             CPPUNIT_TEST( Cuckoo_striped_list_basehook_equal_storehash)
586             CPPUNIT_TEST( Cuckoo_striped_vector_basehook_equal_storehash)
587             CPPUNIT_TEST( Cuckoo_striped_list_basehook_sort_cmp_storehash)
588             CPPUNIT_TEST( Cuckoo_striped_vector_basehook_sort_cmp_storehash)
589             CPPUNIT_TEST( Cuckoo_striped_list_basehook_sort_less_storehash)
590             CPPUNIT_TEST( Cuckoo_striped_vector_basehook_sort_less_storehash)
591             CPPUNIT_TEST( Cuckoo_striped_list_basehook_sort_cmpmix_storehash)
592             CPPUNIT_TEST( Cuckoo_striped_vector_basehook_sort_cmpmix_storehash)
593
594             CPPUNIT_TEST( Cuckoo_striped_list_memberhook_equal)
595             CPPUNIT_TEST( Cuckoo_striped_vector_memberhook_equal)
596             CPPUNIT_TEST( Cuckoo_striped_list_memberhook_sort_cmp)
597             CPPUNIT_TEST( Cuckoo_striped_vector_memberhook_sort_cmp)
598             CPPUNIT_TEST( Cuckoo_striped_list_memberhook_sort_less)
599             CPPUNIT_TEST( Cuckoo_striped_vector_memberhook_sort_less)
600             CPPUNIT_TEST( Cuckoo_striped_list_memberhook_sort_cmpmix)
601             CPPUNIT_TEST( Cuckoo_striped_vector_memberhook_sort_cmpmix)
602
603             CPPUNIT_TEST( Cuckoo_striped_list_memberhook_equal_storehash)
604             CPPUNIT_TEST( Cuckoo_striped_vector_memberhook_equal_storehash)
605             CPPUNIT_TEST( Cuckoo_striped_list_memberhook_sort_cmp_storehash)
606             CPPUNIT_TEST( Cuckoo_striped_vector_memberhook_sort_cmp_storehash)
607             CPPUNIT_TEST( Cuckoo_striped_list_memberhook_sort_less_storehash)
608             CPPUNIT_TEST( Cuckoo_striped_vector_memberhook_sort_less_storehash)
609             CPPUNIT_TEST( Cuckoo_striped_list_memberhook_sort_cmpmix_storehash)
610             CPPUNIT_TEST( Cuckoo_striped_vector_memberhook_sort_cmpmix_storehash)
611
612             // ***********************************************************
613             // Cuckoo hashing (refinable)
614
615             CPPUNIT_TEST( Cuckoo_refinable_list_basehook_equal)
616             CPPUNIT_TEST( Cuckoo_refinable_vector_basehook_equal)
617             CPPUNIT_TEST( Cuckoo_refinable_list_basehook_sort_cmp)
618             CPPUNIT_TEST( Cuckoo_refinable_vector_basehook_sort_cmp)
619             CPPUNIT_TEST( Cuckoo_refinable_list_basehook_sort_less)
620             CPPUNIT_TEST( Cuckoo_refinable_vector_basehook_sort_less)
621             CPPUNIT_TEST( Cuckoo_refinable_list_basehook_sort_cmpmix)
622             CPPUNIT_TEST( Cuckoo_refinable_vector_basehook_sort_cmpmix)
623             CPPUNIT_TEST( Cuckoo_refinable_vector_basehook_sort_cmpmix_stat)
624
625             CPPUNIT_TEST( Cuckoo_refinable_list_basehook_equal_storehash)
626             CPPUNIT_TEST( Cuckoo_refinable_vector_basehook_equal_storehash)
627             CPPUNIT_TEST( Cuckoo_refinable_list_basehook_sort_cmp_storehash)
628             CPPUNIT_TEST( Cuckoo_refinable_vector_basehook_sort_cmp_storehash)
629             CPPUNIT_TEST( Cuckoo_refinable_list_basehook_sort_less_storehash)
630             CPPUNIT_TEST( Cuckoo_refinable_vector_basehook_sort_less_storehash)
631             CPPUNIT_TEST( Cuckoo_refinable_list_basehook_sort_cmpmix_storehash)
632             CPPUNIT_TEST( Cuckoo_refinable_vector_basehook_sort_cmpmix_storehash)
633
634             CPPUNIT_TEST( Cuckoo_refinable_list_memberhook_equal)
635             CPPUNIT_TEST( Cuckoo_refinable_vector_memberhook_equal)
636             CPPUNIT_TEST( Cuckoo_refinable_list_memberhook_sort_cmp)
637             CPPUNIT_TEST( Cuckoo_refinable_vector_memberhook_sort_cmp)
638             CPPUNIT_TEST( Cuckoo_refinable_list_memberhook_sort_less)
639             CPPUNIT_TEST( Cuckoo_refinable_vector_memberhook_sort_less)
640             CPPUNIT_TEST( Cuckoo_refinable_list_memberhook_sort_cmpmix)
641             CPPUNIT_TEST( Cuckoo_refinable_vector_memberhook_sort_cmpmix)
642
643             CPPUNIT_TEST( Cuckoo_refinable_list_memberhook_equal_storehash)
644             CPPUNIT_TEST( Cuckoo_refinable_vector_memberhook_equal_storehash)
645             CPPUNIT_TEST( Cuckoo_refinable_list_memberhook_sort_cmp_storehash)
646             CPPUNIT_TEST( Cuckoo_refinable_vector_memberhook_sort_cmp_storehash)
647             CPPUNIT_TEST( Cuckoo_refinable_list_memberhook_sort_less_storehash)
648             CPPUNIT_TEST( Cuckoo_refinable_vector_memberhook_sort_less_storehash)
649             CPPUNIT_TEST( Cuckoo_refinable_list_memberhook_sort_cmpmix_storehash)
650             CPPUNIT_TEST( Cuckoo_refinable_vector_memberhook_sort_cmpmix_storehash)
651
652         CPPUNIT_TEST_SUITE_END()
653     };
654 } // namespace set
655
656 #endif // #ifndef CDSTEST_HDR_INTRUSIVE_CUCKOO_SET_H