3 #ifndef CDSTEST_HDR_MULTILEVEL_HASHMAP_H
4 #define CDSTEST_HDR_MULTILEVEL_HASHMAP_H
6 #include "cppunit/cppunit_proxy.h"
10 namespace container {}
15 namespace cc = cds::container;
16 namespace co = cds::opt;
18 class MultiLevelHashMapHdrTest : public CppUnitMini::TestCase
22 unsigned int nInsertCall;
23 unsigned int nFindCall;
24 unsigned int nEraseCall;
25 mutable unsigned int nIteratorCall;
34 explicit Item( unsigned int n )
48 hash128(size_t l, size_t h) : lo(l), hi(h) {}
49 hash128( hash128 const& h) : lo(h.lo), hi(h.hi) {}
52 hash128 operator()( size_t n ) const
54 return hash128( std::hash<size_t>()( n ), std::hash<size_t>()( ~n ));
56 hash128 operator()( hash128 const& n ) const
58 return hash128( std::hash<size_t>()( n.lo ), std::hash<size_t>()( ~n.hi ));
63 bool operator()( hash128 const& lhs, hash128 const& rhs ) const
65 if ( lhs.hi != rhs.hi )
66 return lhs.hi < rhs.hi;
67 return lhs.lo < rhs.lo;
72 int operator()( hash128 const& lhs, hash128 const& rhs ) const
74 if ( lhs.hi != rhs.hi )
75 return lhs.hi < rhs.hi ? -1 : 1;
76 return lhs.lo < rhs.lo ? -1 : lhs.lo == rhs.lo ? 0 : 1;
80 friend bool operator==( hash128 const& lhs, hash128 const& rhs )
82 return cmp()( lhs, rhs ) == 0;
84 friend bool operator!=(hash128 const& lhs, hash128 const& rhs)
86 return !( lhs == rhs );
90 template <typename Map>
91 void test_hp( size_t nHeadBits, size_t nArrayBits )
93 typedef typename Map::hash_type hash_type;
94 typedef typename Map::key_type key_type;
95 typedef typename Map::mapped_type mapped_type;
96 typedef typename Map::value_type value_type;
97 typedef typename Map::guarded_ptr guarded_ptr;
99 size_t const capacity = 1000;
101 Map m( nHeadBits, nArrayBits );
102 CPPUNIT_MSG("Array size: head=" << m.head_size() << ", array_node=" << m.array_node_size());
103 //CPPUNIT_ASSERT(m.head_size() >= (size_t(1) << nHeadBits));
104 //CPPUNIT_ASSERT(m.array_node_size() == (size_t(1) << nArrayBits));
106 CPPUNIT_ASSERT(m.empty());
107 CPPUNIT_ASSERT(m.size() == 0);
109 // insert( key )/update()/get()/find()
110 for ( size_t i = 0; i < capacity; ++i ) {
112 CPPUNIT_ASSERT(!m.contains( key ))
113 CPPUNIT_ASSERT(m.insert( key ));
114 CPPUNIT_ASSERT(m.contains( key ));
115 CPPUNIT_ASSERT(m.size() == i + 1);
117 auto ret = m.update(key, [] ( value_type& v, value_type * old ) {
118 CPPUNIT_ASSERT_CURRENT( old != nullptr );
119 ++v.second.nInsertCall;
121 CPPUNIT_ASSERT( ret.first );
122 CPPUNIT_ASSERT( !ret.second );
124 CPPUNIT_ASSERT(m.find(key, [](value_type& v) { ++v.second.nFindCall;} ));
126 guarded_ptr gp{ m.get( key ) };
127 CPPUNIT_ASSERT( gp );
128 CPPUNIT_ASSERT( gp->first == key );
129 CPPUNIT_ASSERT( gp->second.nInsertCall == 1 );
130 CPPUNIT_ASSERT( gp->second.nFindCall == 1 );
132 CPPUNIT_ASSERT(!m.empty());
133 CPPUNIT_ASSERT(m.size() == capacity);
137 for ( auto it = m.begin(), itEnd = m.end(); it != itEnd; ++it ) {
138 CPPUNIT_ASSERT( it->second.nIteratorCall == 0 );
139 CPPUNIT_ASSERT( it->second.nInsertCall == 1 );
140 CPPUNIT_ASSERT( (*it).second.nFindCall == 1 );
141 it->second.nIteratorCall += 1;
144 CPPUNIT_ASSERT( nCount == capacity );
147 for ( auto it = m.rbegin(), itEnd = m.rend(); it != itEnd; ++it ) {
148 CPPUNIT_ASSERT( it->second.nInsertCall == 1 );
149 CPPUNIT_ASSERT( (*it).second.nFindCall == 1 );
150 CPPUNIT_ASSERT( it->second.nIteratorCall == 1 );
151 (*it).second.nIteratorCall += 1;
154 CPPUNIT_ASSERT( nCount == capacity );
157 for ( auto it = m.cbegin(), itEnd = m.cend(); it != itEnd; ++it ) {
158 CPPUNIT_ASSERT( it->second.nInsertCall == 1 );
159 CPPUNIT_ASSERT( (*it).second.nFindCall == 1 );
160 CPPUNIT_ASSERT( it->second.nIteratorCall == 2 );
161 (*it).second.nIteratorCall += 1;
164 CPPUNIT_ASSERT( nCount == capacity );
167 for ( auto it = m.crbegin(), itEnd = m.crend(); it != itEnd; ++it ) {
168 CPPUNIT_ASSERT( it->second.nInsertCall == 1 );
169 CPPUNIT_ASSERT( (*it).second.nFindCall == 1 );
170 CPPUNIT_ASSERT( it->second.nIteratorCall == 3 );
171 (*it).second.nIteratorCall += 1;
174 CPPUNIT_ASSERT( nCount == capacity );
177 for ( size_t i = 0; i < capacity; i++ ) {
179 CPPUNIT_ASSERT( m.find( key, [key]( value_type& v ) {
180 CPPUNIT_ASSERT_CURRENT( v.first == key );
181 CPPUNIT_ASSERT_CURRENT( v.second.nInsertCall == 1 );
182 CPPUNIT_ASSERT_CURRENT( v.second.nFindCall == 1 );
183 CPPUNIT_ASSERT_CURRENT( v.second.nIteratorCall == 4 );
188 for ( size_t i = capacity; i > 0; --i ) {
189 size_t key = (i -1) * 57;
190 guarded_ptr gp = m.get( key );
191 CPPUNIT_ASSERT( gp );
192 CPPUNIT_ASSERT( gp->first == key );
193 CPPUNIT_ASSERT( gp->second.nInsertCall == 1 );
194 CPPUNIT_ASSERT( gp->second.nFindCall == 1 );
195 CPPUNIT_ASSERT( (*gp).second.nIteratorCall == 4 );
197 CPPUNIT_ASSERT(m.erase( key ));
200 CPPUNIT_ASSERT( !gp );
201 CPPUNIT_ASSERT(!m.contains( key ));
203 CPPUNIT_ASSERT( m.empty());
204 CPPUNIT_ASSERT(m.size() == 0);
206 // Iterators on empty map
207 CPPUNIT_ASSERT(m.begin() == m.end());
208 CPPUNIT_ASSERT(m.cbegin() == m.cend());
209 CPPUNIT_ASSERT(m.rbegin() == m.rend());
210 CPPUNIT_ASSERT(m.crbegin() == m.crend());
212 // insert( key, val )
213 for ( size_t i = 0; i < capacity; ++i ) {
214 CPPUNIT_ASSERT(!m.contains(i));
215 CPPUNIT_ASSERT(m.insert( i, (unsigned int) i * 100));
216 CPPUNIT_ASSERT( m.contains(i));
217 CPPUNIT_ASSERT( m.find( i, [i]( value_type& v ) {
218 CPPUNIT_ASSERT_CURRENT( v.first == i );
219 CPPUNIT_ASSERT_CURRENT( v.second.nInsertCall == i * 100 );
222 CPPUNIT_ASSERT( !m.empty());
223 CPPUNIT_ASSERT(m.size() == capacity);
225 // erase( key, func )
226 for ( size_t i = 0; i < capacity; ++i ) {
227 CPPUNIT_ASSERT( m.contains(i));
228 CPPUNIT_ASSERT( m.erase( i, [i]( value_type& v ) {
229 CPPUNIT_ASSERT_CURRENT( v.first == i );
230 CPPUNIT_ASSERT_CURRENT( v.second.nInsertCall == i * 100 );
231 v.second.nInsertCall = 0;
234 CPPUNIT_ASSERT( m.empty());
235 CPPUNIT_ASSERT(m.size() == 0 );
238 for ( size_t i = 0; i < capacity; ++i ) {
239 size_t key = i * 121;
240 CPPUNIT_ASSERT(!m.contains(key));
241 CPPUNIT_ASSERT( m.insert_with( key, [key]( value_type& v ) {
242 CPPUNIT_ASSERT_CURRENT( v.first == key );
243 CPPUNIT_ASSERT_CURRENT( v.second.nInsertCall == 0 );
244 v.second.nInsertCall = decltype(v.second.nInsertCall)( key );
246 CPPUNIT_ASSERT(m.find(key, [key] (value_type& v ) {
247 CPPUNIT_ASSERT_CURRENT( v.first == key );
248 CPPUNIT_ASSERT_CURRENT( v.second.nInsertCall == key );
250 CPPUNIT_ASSERT(m.size() == i + 1);
252 CPPUNIT_ASSERT( !m.empty());
253 CPPUNIT_ASSERT(m.size() == capacity);
256 for ( auto it = m.begin(), itEnd = m.end(); it != itEnd; ++it ) {
257 CPPUNIT_ASSERT( it->first == it->second.nInsertCall );
258 CPPUNIT_ASSERT( it->second.nIteratorCall == 0 );
259 it->second.nIteratorCall += 1;
262 CPPUNIT_ASSERT( nCount == capacity );
265 for ( auto it = m.rbegin(), itEnd = m.rend(); it != itEnd; ++it ) {
266 CPPUNIT_ASSERT( it->first == it->second.nInsertCall );
267 CPPUNIT_ASSERT( it->second.nIteratorCall == 1 );
268 it->second.nIteratorCall += 1;
271 CPPUNIT_ASSERT( nCount == capacity );
273 // erase_at( iterator )
275 for ( auto it = m.begin(), itEnd = m.end(); it != itEnd; ++it ) {
276 CPPUNIT_ASSERT( it->first == it->second.nInsertCall );
277 CPPUNIT_ASSERT( it->second.nIteratorCall == 2 );
278 CPPUNIT_ASSERT(m.erase_at( it ));
280 CPPUNIT_ASSERT(!m.contains( it->first ));
282 CPPUNIT_ASSERT( nCount == capacity );
283 CPPUNIT_ASSERT( m.empty());
284 CPPUNIT_ASSERT(m.size() == 0 );
287 for ( size_t i = 0; i < capacity; ++i ) {
288 size_t key = i * 1023;
289 CPPUNIT_ASSERT(!m.contains(key));
290 CPPUNIT_ASSERT( m.emplace( key, (unsigned int) i ));
291 CPPUNIT_ASSERT(m.find(key, [key] (value_type& v ) {
292 CPPUNIT_ASSERT_CURRENT( v.first == key );
293 CPPUNIT_ASSERT_CURRENT( v.second.nInsertCall * 1023 == key );
295 CPPUNIT_ASSERT(m.size() == i + 1);
297 CPPUNIT_ASSERT( !m.empty());
298 CPPUNIT_ASSERT(m.size() == capacity);
300 // erase_at( reverse_iterator )
302 for ( auto it = m.rbegin(), itEnd = m.rend(); it != itEnd; ++it ) {
303 CPPUNIT_ASSERT( it->first == it->second.nInsertCall * 1023 );
304 CPPUNIT_ASSERT(m.erase_at( it ));
306 CPPUNIT_ASSERT(!m.contains( it->first ));
308 CPPUNIT_ASSERT( nCount == capacity );
309 CPPUNIT_ASSERT( m.empty());
310 CPPUNIT_ASSERT(m.size() == 0 );
314 for ( size_t i = 0; i < capacity; ++i ) {
315 size_t key = i * 711;
316 CPPUNIT_ASSERT(!m.contains(key));
317 auto ret = m.update( key, [i]( value_type& v, value_type * old ) {
318 CPPUNIT_ASSERT_CURRENT( old == nullptr );
319 v.second.nInsertCall = (unsigned int) i;
321 CPPUNIT_ASSERT( ret.first );
322 CPPUNIT_ASSERT( ret.second );
323 CPPUNIT_ASSERT(m.find(key, [i, key] (value_type& v ) {
324 CPPUNIT_ASSERT_CURRENT( v.first == key );
325 CPPUNIT_ASSERT_CURRENT( v.second.nInsertCall == i );
327 CPPUNIT_ASSERT(m.size() == i + 1);
329 CPPUNIT_ASSERT( !m.empty());
330 CPPUNIT_ASSERT(m.size() == capacity);
332 for ( size_t i = capacity; i > 0; --i ) {
333 size_t key = (i-1) * 711;
334 guarded_ptr gp{ m.extract(key) };
335 CPPUNIT_ASSERT( gp );
336 CPPUNIT_ASSERT( gp->first == key );
337 CPPUNIT_ASSERT((*gp).second.nInsertCall == i - 1 );
339 CPPUNIT_ASSERT( !gp );
341 CPPUNIT_ASSERT( m.empty());
342 CPPUNIT_ASSERT(m.size() == 0 );
345 for ( size_t i = 0; i < capacity; ++i ) {
346 CPPUNIT_ASSERT(!m.contains( i ))
347 CPPUNIT_ASSERT(m.insert( i ));
348 CPPUNIT_ASSERT(m.contains( i ));
349 CPPUNIT_ASSERT(m.size() == i + 1);
351 CPPUNIT_ASSERT( !m.empty());
352 CPPUNIT_ASSERT(m.size() == capacity );
355 CPPUNIT_ASSERT( m.empty());
356 CPPUNIT_ASSERT(m.size() == 0 );
359 CPPUNIT_MSG( m.statistics() );
362 template <typename Map>
363 void test_rcu(size_t nHeadBits, size_t nArrayBits)
365 typedef typename Map::hash_type hash_type;
366 typedef typename Map::key_type key_type;
367 typedef typename Map::mapped_type mapped_type;
368 typedef typename Map::value_type value_type;
369 typedef typename Map::exempt_ptr exempt_ptr;
370 typedef typename Map::rcu_lock rcu_lock;
372 size_t const capacity = 1000;
374 Map m(nHeadBits, nArrayBits);
375 CPPUNIT_MSG("Array size: head=" << m.head_size() << ", array_node=" << m.array_node_size());
376 CPPUNIT_ASSERT(m.head_size() >= (size_t(1) << nHeadBits));
377 CPPUNIT_ASSERT(m.array_node_size() == (size_t(1) << nArrayBits));
379 CPPUNIT_ASSERT(m.empty());
380 CPPUNIT_ASSERT(m.size() == 0);
382 // insert( key )/update()/get()/find()
383 for (size_t i = 0; i < capacity; ++i) {
385 CPPUNIT_ASSERT(!m.contains(key))
386 CPPUNIT_ASSERT(m.insert(key));
387 CPPUNIT_ASSERT(m.contains(key));
388 CPPUNIT_ASSERT(m.size() == i + 1);
390 auto ret = m.update(key, [](value_type& v, value_type * old) {
391 CPPUNIT_ASSERT_CURRENT(old != nullptr);
392 ++v.second.nInsertCall;
394 CPPUNIT_ASSERT(ret.first);
395 CPPUNIT_ASSERT(!ret.second);
397 CPPUNIT_ASSERT(m.find(key, [](value_type& v) { ++v.second.nFindCall;}));
401 value_type* p{ m.get(key) };
403 CPPUNIT_ASSERT(p->first == key);
404 CPPUNIT_ASSERT(p->second.nInsertCall == 1);
405 CPPUNIT_ASSERT(p->second.nFindCall == 1);
408 CPPUNIT_ASSERT(!m.empty());
409 CPPUNIT_ASSERT(m.size() == capacity);
415 for (auto it = m.begin(), itEnd = m.end(); it != itEnd; ++it) {
416 CPPUNIT_ASSERT(it->second.nIteratorCall == 0);
417 CPPUNIT_ASSERT(it->second.nInsertCall == 1);
418 CPPUNIT_ASSERT((*it).second.nFindCall == 1);
419 it->second.nIteratorCall += 1;
423 CPPUNIT_ASSERT(nCount == capacity);
428 for (auto it = m.rbegin(), itEnd = m.rend(); it != itEnd; ++it) {
429 CPPUNIT_ASSERT(it->second.nInsertCall == 1);
430 CPPUNIT_ASSERT((*it).second.nFindCall == 1);
431 CPPUNIT_ASSERT(it->second.nIteratorCall == 1);
432 (*it).second.nIteratorCall += 1;
436 CPPUNIT_ASSERT(nCount == capacity);
441 for (auto it = m.cbegin(), itEnd = m.cend(); it != itEnd; ++it) {
442 CPPUNIT_ASSERT(it->second.nInsertCall == 1);
443 CPPUNIT_ASSERT((*it).second.nFindCall == 1);
444 CPPUNIT_ASSERT(it->second.nIteratorCall == 2);
445 (*it).second.nIteratorCall += 1;
449 CPPUNIT_ASSERT(nCount == capacity);
454 for (auto it = m.crbegin(), itEnd = m.crend(); it != itEnd; ++it) {
455 CPPUNIT_ASSERT(it->second.nInsertCall == 1);
456 CPPUNIT_ASSERT((*it).second.nFindCall == 1);
457 CPPUNIT_ASSERT(it->second.nIteratorCall == 3);
458 (*it).second.nIteratorCall += 1;
462 CPPUNIT_ASSERT(nCount == capacity);
465 for (size_t i = 0; i < capacity; i++) {
467 CPPUNIT_ASSERT(m.find(key, [key](value_type& v) {
468 CPPUNIT_ASSERT_CURRENT(v.first == key);
469 CPPUNIT_ASSERT_CURRENT(v.second.nInsertCall == 1);
470 CPPUNIT_ASSERT_CURRENT(v.second.nFindCall == 1);
471 CPPUNIT_ASSERT_CURRENT(v.second.nIteratorCall == 4);
476 for (size_t i = capacity; i > 0; --i) {
477 size_t key = (i - 1) * 57;
480 value_type* p = m.get(key);
482 CPPUNIT_ASSERT(p->first == key);
483 CPPUNIT_ASSERT(p->second.nInsertCall == 1);
484 CPPUNIT_ASSERT(p->second.nFindCall == 1);
485 CPPUNIT_ASSERT(p->second.nIteratorCall == 4);
488 CPPUNIT_ASSERT(m.erase(key));
492 value_type* p = m.get(key);
495 CPPUNIT_ASSERT(!m.contains(key));
497 CPPUNIT_ASSERT(m.empty());
498 CPPUNIT_ASSERT(m.size() == 0);
500 // Iterators on empty map
503 CPPUNIT_ASSERT(m.begin() == m.end());
504 CPPUNIT_ASSERT(m.cbegin() == m.cend());
505 CPPUNIT_ASSERT(m.rbegin() == m.rend());
506 CPPUNIT_ASSERT(m.crbegin() == m.crend());
509 // insert( key, val )
510 for (size_t i = 0; i < capacity; ++i) {
511 CPPUNIT_ASSERT(!m.contains(i));
512 CPPUNIT_ASSERT(m.insert(i, (unsigned int)i * 100));
513 CPPUNIT_ASSERT(m.contains(i));
514 CPPUNIT_ASSERT(m.find(i, [i](value_type& v) {
515 CPPUNIT_ASSERT_CURRENT(v.first == i);
516 CPPUNIT_ASSERT_CURRENT(v.second.nInsertCall == i * 100);
519 CPPUNIT_ASSERT(!m.empty());
520 CPPUNIT_ASSERT(m.size() == capacity);
522 // erase( key, func )
523 for (size_t i = 0; i < capacity; ++i) {
524 CPPUNIT_ASSERT(m.contains(i));
525 CPPUNIT_ASSERT(m.erase(i, [i](value_type& v) {
526 CPPUNIT_ASSERT_CURRENT(v.first == i);
527 CPPUNIT_ASSERT_CURRENT(v.second.nInsertCall == i * 100);
528 v.second.nInsertCall = 0;
531 CPPUNIT_ASSERT(m.empty());
532 CPPUNIT_ASSERT(m.size() == 0);
535 for (size_t i = 0; i < capacity; ++i) {
536 size_t key = i * 121;
537 CPPUNIT_ASSERT(!m.contains(key));
538 CPPUNIT_ASSERT(m.insert_with(key, [key](value_type& v) {
539 CPPUNIT_ASSERT_CURRENT(v.first == key);
540 CPPUNIT_ASSERT_CURRENT(v.second.nInsertCall == 0);
541 v.second.nInsertCall = decltype(v.second.nInsertCall)(key);
543 CPPUNIT_ASSERT(m.find(key, [key](value_type& v) {
544 CPPUNIT_ASSERT_CURRENT(v.first == key);
545 CPPUNIT_ASSERT_CURRENT(v.second.nInsertCall == key);
547 CPPUNIT_ASSERT(m.size() == i + 1);
549 CPPUNIT_ASSERT(!m.empty());
550 CPPUNIT_ASSERT(m.size() == capacity);
555 for (auto it = m.begin(), itEnd = m.end(); it != itEnd; ++it) {
556 CPPUNIT_ASSERT(it->first == it->second.nInsertCall);
557 CPPUNIT_ASSERT(it->second.nIteratorCall == 0);
558 it->second.nIteratorCall += 1;
562 CPPUNIT_ASSERT(nCount == capacity);
567 for (auto it = m.rbegin(), itEnd = m.rend(); it != itEnd; ++it) {
568 CPPUNIT_ASSERT(it->first == it->second.nInsertCall);
569 CPPUNIT_ASSERT(it->second.nIteratorCall == 1);
570 it->second.nIteratorCall += 1;
574 CPPUNIT_ASSERT(nCount == capacity);
578 CPPUNIT_ASSERT(m.empty());
579 CPPUNIT_ASSERT(m.size() == 0);
582 for (size_t i = 0; i < capacity; ++i) {
583 size_t key = i * 1023;
584 CPPUNIT_ASSERT(!m.contains(key));
585 CPPUNIT_ASSERT(m.emplace(key, static_cast<unsigned int>(i)));
586 CPPUNIT_ASSERT(m.find(key, [key](value_type& v) {
587 CPPUNIT_ASSERT_CURRENT(v.first == key);
588 CPPUNIT_ASSERT_CURRENT(v.second.nInsertCall * 1023 == key);
590 CPPUNIT_ASSERT(m.size() == i + 1);
592 CPPUNIT_ASSERT(!m.empty());
593 CPPUNIT_ASSERT(m.size() == capacity);
596 for (size_t i = capacity; i > 0; --i) {
597 size_t key = (i - 1) * 1023;
598 exempt_ptr xp{ m.extract(key) };
600 CPPUNIT_ASSERT(xp->first == key);
601 CPPUNIT_ASSERT((*xp).second.nInsertCall == static_cast<unsigned int>(i - 1));
605 CPPUNIT_ASSERT(m.empty());
606 CPPUNIT_ASSERT(m.size() == 0);
608 CPPUNIT_MSG(m.statistics());
612 void hp_stdhash_stat();
613 void hp_stdhash_5_3();
614 void hp_stdhash_5_3_stat();
616 void hp_hash128_stat();
617 void hp_hash128_4_3();
618 void hp_hash128_4_3_stat();
621 void dhp_stdhash_stat();
622 void dhp_stdhash_5_3();
623 void dhp_stdhash_5_3_stat();
625 void dhp_hash128_stat();
626 void dhp_hash128_4_3();
627 void dhp_hash128_4_3_stat();
629 void rcu_gpb_stdhash();
630 void rcu_gpb_stdhash_stat();
631 void rcu_gpb_stdhash_5_3();
632 void rcu_gpb_stdhash_5_3_stat();
633 void rcu_gpb_hash128();
634 void rcu_gpb_hash128_stat();
635 void rcu_gpb_hash128_4_3();
636 void rcu_gpb_hash128_4_3_stat();
638 void rcu_gpi_stdhash();
639 void rcu_gpi_stdhash_stat();
640 void rcu_gpi_stdhash_5_3();
641 void rcu_gpi_stdhash_5_3_stat();
642 void rcu_gpi_hash128();
643 void rcu_gpi_hash128_stat();
644 void rcu_gpi_hash128_4_3();
645 void rcu_gpi_hash128_4_3_stat();
647 void rcu_gpt_stdhash();
648 void rcu_gpt_stdhash_stat();
649 void rcu_gpt_stdhash_5_3();
650 void rcu_gpt_stdhash_5_3_stat();
651 void rcu_gpt_hash128();
652 void rcu_gpt_hash128_stat();
653 void rcu_gpt_hash128_4_3();
654 void rcu_gpt_hash128_4_3_stat();
656 void rcu_shb_stdhash();
657 void rcu_shb_stdhash_stat();
658 void rcu_shb_stdhash_5_3();
659 void rcu_shb_stdhash_5_3_stat();
660 void rcu_shb_hash128();
661 void rcu_shb_hash128_stat();
662 void rcu_shb_hash128_4_3();
663 void rcu_shb_hash128_4_3_stat();
665 void rcu_sht_stdhash();
666 void rcu_sht_stdhash_stat();
667 void rcu_sht_stdhash_5_3();
668 void rcu_sht_stdhash_5_3_stat();
669 void rcu_sht_hash128();
670 void rcu_sht_hash128_stat();
671 void rcu_sht_hash128_4_3();
672 void rcu_sht_hash128_4_3_stat();
674 CPPUNIT_TEST_SUITE(MultiLevelHashMapHdrTest)
675 CPPUNIT_TEST(hp_stdhash)
676 CPPUNIT_TEST(hp_stdhash_stat)
677 CPPUNIT_TEST(hp_stdhash_5_3)
678 CPPUNIT_TEST(hp_stdhash_5_3_stat)
679 CPPUNIT_TEST(hp_hash128)
680 CPPUNIT_TEST(hp_hash128_stat)
681 CPPUNIT_TEST(hp_hash128_4_3)
682 CPPUNIT_TEST(hp_hash128_4_3_stat)
684 CPPUNIT_TEST(dhp_stdhash)
685 CPPUNIT_TEST(dhp_stdhash_stat)
686 CPPUNIT_TEST(dhp_stdhash_5_3)
687 CPPUNIT_TEST(dhp_stdhash_5_3_stat)
688 CPPUNIT_TEST(dhp_hash128)
689 CPPUNIT_TEST(dhp_hash128_stat)
690 CPPUNIT_TEST(dhp_hash128_4_3)
691 CPPUNIT_TEST(dhp_hash128_4_3_stat)
693 CPPUNIT_TEST(rcu_gpb_stdhash)
694 CPPUNIT_TEST(rcu_gpb_stdhash_stat)
695 CPPUNIT_TEST(rcu_gpb_stdhash_5_3)
696 CPPUNIT_TEST(rcu_gpb_stdhash_5_3_stat)
697 CPPUNIT_TEST(rcu_gpb_hash128)
698 CPPUNIT_TEST(rcu_gpb_hash128_stat)
699 CPPUNIT_TEST(rcu_gpb_hash128_4_3)
700 CPPUNIT_TEST(rcu_gpb_hash128_4_3_stat)
702 CPPUNIT_TEST(rcu_gpi_stdhash)
703 CPPUNIT_TEST(rcu_gpi_stdhash_stat)
704 CPPUNIT_TEST(rcu_gpi_stdhash_5_3)
705 CPPUNIT_TEST(rcu_gpi_stdhash_5_3_stat)
706 CPPUNIT_TEST(rcu_gpi_hash128)
707 CPPUNIT_TEST(rcu_gpi_hash128_stat)
708 CPPUNIT_TEST(rcu_gpi_hash128_4_3)
709 CPPUNIT_TEST(rcu_gpi_hash128_4_3_stat)
711 CPPUNIT_TEST(rcu_gpt_stdhash)
712 CPPUNIT_TEST(rcu_gpt_stdhash_stat)
713 CPPUNIT_TEST(rcu_gpt_stdhash_5_3)
714 CPPUNIT_TEST(rcu_gpt_stdhash_5_3_stat)
715 CPPUNIT_TEST(rcu_gpt_hash128)
716 CPPUNIT_TEST(rcu_gpt_hash128_stat)
717 CPPUNIT_TEST(rcu_gpt_hash128_4_3)
718 CPPUNIT_TEST(rcu_gpt_hash128_4_3_stat)
720 CPPUNIT_TEST(rcu_shb_stdhash)
721 CPPUNIT_TEST(rcu_shb_stdhash_stat)
722 CPPUNIT_TEST(rcu_shb_stdhash_5_3)
723 CPPUNIT_TEST(rcu_shb_stdhash_5_3_stat)
724 CPPUNIT_TEST(rcu_shb_hash128)
725 CPPUNIT_TEST(rcu_shb_hash128_stat)
726 CPPUNIT_TEST(rcu_shb_hash128_4_3)
727 CPPUNIT_TEST(rcu_shb_hash128_4_3_stat)
729 CPPUNIT_TEST(rcu_sht_stdhash)
730 CPPUNIT_TEST(rcu_sht_stdhash_stat)
731 CPPUNIT_TEST(rcu_sht_stdhash_5_3)
732 CPPUNIT_TEST(rcu_sht_stdhash_5_3_stat)
733 CPPUNIT_TEST(rcu_sht_hash128)
734 CPPUNIT_TEST(rcu_sht_hash128_stat)
735 CPPUNIT_TEST(rcu_sht_hash128_4_3)
736 CPPUNIT_TEST(rcu_sht_hash128_4_3_stat)
737 CPPUNIT_TEST_SUITE_END()
743 #endif //#ifndef CDSTEST_HDR_MULTILEVEL_HASHMAP_H