3 #ifndef CDSTEST_HDR_FELDMAN_HASHSET_H
4 #define CDSTEST_HDR_FELDMAN_HASHSET_H
6 #include "cppunit/cppunit_proxy.h"
10 namespace container {}
15 namespace cc = cds::container;
16 namespace co = cds::opt;
18 class FeldmanHashSetHdrTest : public CppUnitMini::TestCase
20 template <typename Hash>
26 Arg( size_t k, Hash const& h )
32 template <typename Hash>
35 unsigned int nInsertCall;
36 unsigned int nFindCall;
37 unsigned int nEraseCall;
38 mutable unsigned int nIteratorCall;
42 Item( size_t k, Hash const& h )
51 explicit Item( Arg<Hash> const& arg )
70 template <typename Hash>
73 Hash const& operator()( Item<Hash> const& i ) const
79 template <typename Key>
82 Key operator()(Item<Key> const& i)const
88 template <typename Key>
90 Key operator()(Key k) const
102 hash128(size_t l, size_t h) : lo(l), hi(h) {}
103 hash128( hash128 const& h) : lo(h.lo), hi(h.hi) {}
106 hash128 operator()( size_t n ) const
108 return hash128( std::hash<size_t>()( n ), std::hash<size_t>()( ~n ));
110 hash128 operator()( hash128 const& n ) const
112 return hash128( std::hash<size_t>()( n.lo ), std::hash<size_t>()( ~n.hi ));
117 bool operator()( hash128 const& lhs, hash128 const& rhs ) const
119 if ( lhs.hi != rhs.hi )
120 return lhs.hi < rhs.hi;
121 return lhs.lo < rhs.lo;
126 int operator()( hash128 const& lhs, hash128 const& rhs ) const
128 if ( lhs.hi != rhs.hi )
129 return lhs.hi < rhs.hi ? -1 : 1;
130 return lhs.lo < rhs.lo ? -1 : lhs.lo == rhs.lo ? 0 : 1;
134 friend bool operator==( hash128 const& lhs, hash128 const& rhs )
136 return cmp()( lhs, rhs ) == 0;
138 friend bool operator!=(hash128 const& lhs, hash128 const& rhs)
140 return !( lhs == rhs );
144 template <typename Set, typename Hasher>
145 void test_hp( size_t nHeadBits, size_t nArrayBits )
147 typedef typename Set::hash_type hash_type;
148 typedef typename Set::value_type value_type;
149 typedef Arg<hash_type> arg_type;
150 typedef typename Set::guarded_ptr guarded_ptr;
154 size_t const capacity = 1000;
156 Set s( nHeadBits, nArrayBits );
157 CPPUNIT_MSG("Array size: head=" << s.head_size() << ", array_node=" << s.array_node_size());
158 CPPUNIT_ASSERT(s.head_size() >= (size_t(1) << nHeadBits));
159 CPPUNIT_ASSERT(s.array_node_size() == (size_t(1) << nArrayBits));
161 CPPUNIT_ASSERT( s.empty() );
162 CPPUNIT_ASSERT(s.size() == 0);
165 for ( size_t i = 0; i < capacity; ++i ) {
166 hash_type h = hasher(i);
167 CPPUNIT_ASSERT( !s.contains( h ));
168 CPPUNIT_ASSERT( s.insert( value_type( i, h )));
169 CPPUNIT_ASSERT(s.contains( h ));
171 CPPUNIT_ASSERT( !s.empty() );
172 CPPUNIT_ASSERT( s.size() == i + 1);
174 CPPUNIT_ASSERT( !s.insert( arg_type(i, h) ));
175 CPPUNIT_ASSERT( s.size() == i + 1);
178 // update existing test
179 for ( size_t i = 0; i < capacity; ++i ) {
180 hash_type h = hasher(i);
181 CPPUNIT_ASSERT( s.contains( h ));
182 std::pair<bool, bool> ret = s.update( arg_type( i, h ),
183 [](value_type& i, value_type * prev ) {
184 CPPUNIT_ASSERT_CURRENT( prev != nullptr );
185 CPPUNIT_ASSERT_CURRENT( i.key == prev->key );
186 CPPUNIT_ASSERT_CURRENT( i.hash == prev->hash );
189 CPPUNIT_ASSERT( ret.first );
190 CPPUNIT_ASSERT( !ret.second );
191 CPPUNIT_ASSERT( s.contains( h ));
192 CPPUNIT_ASSERT( s.size() == capacity );
194 guarded_ptr gp(s.get( h ));
195 CPPUNIT_ASSERT( gp );
196 CPPUNIT_ASSERT( gp->nInsertCall == 1 );
197 CPPUNIT_ASSERT( gp->key == i );
198 CPPUNIT_ASSERT( gp->hash == h );
202 for ( size_t i = 0; i < capacity; ++i ) {
203 CPPUNIT_ASSERT( !s.empty() );
204 CPPUNIT_ASSERT( s.size() == capacity - i );
205 CPPUNIT_ASSERT(s.find(hasher(i), []( value_type &) {}));
206 CPPUNIT_ASSERT( s.erase(hasher(i)) );
207 CPPUNIT_ASSERT( !s.find(hasher(i), []( value_type &) {}));
208 CPPUNIT_ASSERT( s.size() == capacity - i - 1);
210 CPPUNIT_ASSERT( s.empty() );
212 // Iterators on empty set
213 CPPUNIT_ASSERT(s.begin() == s.end());
214 CPPUNIT_ASSERT(s.cbegin() == s.cend());
215 CPPUNIT_ASSERT(s.rbegin() == s.rend());
216 CPPUNIT_ASSERT(s.crbegin() == s.crend());
218 // insert with functor
219 for ( size_t i = capacity; i > 0; --i ) {
220 CPPUNIT_ASSERT( s.size() == capacity - i );
221 CPPUNIT_ASSERT(s.insert( arg_type( i, hasher(i)), []( value_type& val ) { val.nInsertCall += 1; } ));
222 CPPUNIT_ASSERT( s.size() == capacity - i + 1 );
223 CPPUNIT_ASSERT( !s.empty() );
225 CPPUNIT_ASSERT(s.find( hasher(i), []( value_type& val ) {
226 CPPUNIT_ASSERT_CURRENT( val.nInsertCall == 1 );
230 CPPUNIT_ASSERT( s.size() == capacity );
232 // for-each iterator test
233 for ( auto& el : s ) {
234 CPPUNIT_ASSERT( el.nInsertCall == 1 );
235 CPPUNIT_ASSERT( el.nFindCall == 1 );
240 for ( auto it = s.begin(), itEnd = s.end(); it != itEnd; ++it ) {
241 CPPUNIT_ASSERT( it->nInsertCall == 1 );
242 CPPUNIT_ASSERT( it->nFindCall == 2 );
246 // reverse iterator test
247 for ( auto it = s.rbegin(), itEnd = s.rend(); it != itEnd; ++it ) {
248 CPPUNIT_ASSERT( it->nInsertCall == 1 );
249 CPPUNIT_ASSERT( it->nFindCall == 3 );
253 // const iterator test
254 for ( auto it = s.cbegin(), itEnd = s.cend(); it != itEnd; ++it ) {
255 CPPUNIT_ASSERT( it->nInsertCall == 1 );
256 CPPUNIT_ASSERT( it->nFindCall == 4 );
257 it->nIteratorCall += 1;
260 // const reverse iterator test
261 for ( auto it = s.rbegin(), itEnd = s.rend(); it != itEnd; ++it ) {
262 CPPUNIT_ASSERT( it->nInsertCall == 1 );
263 CPPUNIT_ASSERT( it->nFindCall == 4 );
264 CPPUNIT_ASSERT( it->nIteratorCall == 1 );
265 it->nIteratorCall += 1;
268 // check completeness
269 for ( size_t i = 1; i <= capacity; ++i ) {
270 CPPUNIT_ASSERT( s.find( hasher( i ), []( value_type const& el ) {
271 CPPUNIT_ASSERT_CURRENT( el.nInsertCall == 1 );
272 CPPUNIT_ASSERT_CURRENT( el.nFindCall == 4 );
273 CPPUNIT_ASSERT_CURRENT( el.nIteratorCall == 2 );
277 // erase with functor test
280 for ( size_t i = 1; i <= capacity; ++i ) {
281 CPPUNIT_ASSERT( s.size() == capacity - i + 1 );
282 CPPUNIT_ASSERT(s.erase(hasher(i), [&nSum]( value_type const& val ) {
283 CPPUNIT_ASSERT_CURRENT( val.nInsertCall == 1 );
284 CPPUNIT_ASSERT_CURRENT( val.nFindCall == 4 );
285 CPPUNIT_ASSERT_CURRENT( val.nIteratorCall == 2 );
288 CPPUNIT_ASSERT( s.size() == capacity - i );
289 CPPUNIT_ASSERT( !s.erase(hasher(i), [&nSum]( value_type const& val ) { nSum += val.key; } ))
291 CPPUNIT_ASSERT(s.empty() );
292 CPPUNIT_ASSERT(nSum == (1 + capacity) * capacity / 2 );
295 // update test with insert allowing
296 for ( size_t i = 0; i < capacity; ++i ) {
297 hash_type h = hasher(i);
298 CPPUNIT_ASSERT( !s.contains( h ));
299 guarded_ptr gp(s.get( h ));
300 CPPUNIT_ASSERT( !gp );
301 std::pair<bool, bool> ret = s.update( arg_type( i, h ),
302 [](value_type& i, value_type * prev ) {
303 CPPUNIT_ASSERT_CURRENT( prev == nullptr );
306 CPPUNIT_ASSERT( ret.first );
307 CPPUNIT_ASSERT( ret.second );
308 CPPUNIT_ASSERT( s.contains( h ));
309 CPPUNIT_ASSERT( s.size() == i + 1 );
312 CPPUNIT_ASSERT( gp );
313 CPPUNIT_ASSERT( gp->nInsertCall == 1 );
314 CPPUNIT_ASSERT( gp->key == i );
315 CPPUNIT_ASSERT( gp->hash == h );
317 CPPUNIT_ASSERT( !s.empty() );
318 CPPUNIT_ASSERT(s.size() == capacity );
320 // erase_at( iterator ) test
321 for ( auto it = s.begin(), itEnd = s.end(); it != itEnd; ++it ) {
322 CPPUNIT_ASSERT( s.erase_at( it ));
324 CPPUNIT_ASSERT( s.empty() );
325 CPPUNIT_ASSERT( s.size() == 0 );
328 for ( size_t i = 0; i < capacity; ++i ) {
329 hash_type h = hasher(i);
330 CPPUNIT_ASSERT( !s.contains( h ));
331 CPPUNIT_ASSERT( s.emplace( i, hasher(i) ));
332 CPPUNIT_ASSERT(s.contains( h ));
334 CPPUNIT_ASSERT( !s.empty() );
335 CPPUNIT_ASSERT( s.size() == i + 1);
337 CPPUNIT_ASSERT( !s.emplace( arg_type(i, h) ));
338 CPPUNIT_ASSERT( s.size() == i + 1);
340 CPPUNIT_ASSERT( !s.empty() );
341 CPPUNIT_ASSERT(s.size() == capacity );
343 // erase_at( reverse_iterator ) test
344 for ( auto it = s.rbegin(), itEnd = s.rend(); it != itEnd; ++it ) {
345 CPPUNIT_ASSERT( s.erase_at( it ));
347 CPPUNIT_ASSERT( s.empty() );
348 CPPUNIT_ASSERT( s.size() == 0 );
351 for ( size_t i = 0; i < capacity; ++i ) {
352 hash_type h = hasher(i);
353 CPPUNIT_ASSERT( !s.contains( h ));
354 CPPUNIT_ASSERT( s.emplace( arg_type( i, hasher(i) )));
355 CPPUNIT_ASSERT(s.contains( h ));
357 CPPUNIT_ASSERT( !s.empty() );
358 CPPUNIT_ASSERT( s.size() == i + 1);
360 CPPUNIT_ASSERT( !s.emplace( i, h ));
361 CPPUNIT_ASSERT( s.size() == i + 1);
363 CPPUNIT_ASSERT( !s.empty() );
364 CPPUNIT_ASSERT(s.size() == capacity );
366 for ( size_t i = capacity; i != 0; --i ) {
367 CPPUNIT_ASSERT( !s.empty() );
368 CPPUNIT_ASSERT( s.size() == i );
370 guarded_ptr gp{ s.extract( hasher(i-1)) };
371 CPPUNIT_ASSERT( gp );
372 CPPUNIT_ASSERT( gp->key == i - 1);
373 CPPUNIT_ASSERT(gp->hash == hasher(i-1));
374 CPPUNIT_ASSERT( !s.contains(hasher(i-1)));
376 gp = s.get(hasher(i-1));
377 CPPUNIT_ASSERT( !gp );
379 CPPUNIT_ASSERT( s.size() == i - 1 );
381 CPPUNIT_ASSERT( s.empty() );
382 CPPUNIT_ASSERT(s.size() == 0 );
385 for ( size_t i = 0; i < capacity; ++i ) {
386 hash_type h = hasher(i);
387 CPPUNIT_ASSERT( !s.contains( h ));
388 CPPUNIT_ASSERT( s.emplace( arg_type( i, hasher(i) )));
389 CPPUNIT_ASSERT(s.contains( h ));
391 CPPUNIT_ASSERT( !s.empty() );
392 CPPUNIT_ASSERT( s.size() == i + 1);
394 CPPUNIT_ASSERT( !s.emplace( i, h ));
395 CPPUNIT_ASSERT( s.size() == i + 1);
397 CPPUNIT_ASSERT( !s.empty() );
398 CPPUNIT_ASSERT(s.size() == capacity );
401 CPPUNIT_ASSERT( s.empty() );
402 CPPUNIT_ASSERT(s.size() == 0 );
404 CPPUNIT_MSG( s.statistics() );
407 template <typename Set, typename Hasher>
408 void test_rcu(size_t nHeadBits, size_t nArrayBits)
410 typedef typename Set::hash_type hash_type;
411 typedef typename Set::value_type value_type;
412 typedef Arg<hash_type> arg_type;
413 typedef typename Set::exempt_ptr exempt_ptr;
414 typedef typename Set::rcu_lock rcu_lock;
418 size_t const capacity = 1000;
420 Set s(nHeadBits, nArrayBits);
421 CPPUNIT_MSG("Array size: head=" << s.head_size() << ", array_node=" << s.array_node_size());
422 CPPUNIT_ASSERT(s.head_size() >= (size_t(1) << nHeadBits));
423 CPPUNIT_ASSERT(s.array_node_size() == (size_t(1) << nArrayBits));
425 CPPUNIT_ASSERT(s.empty());
426 CPPUNIT_ASSERT(s.size() == 0);
429 for (size_t i = 0; i < capacity; ++i) {
430 hash_type h = hasher(i);
431 CPPUNIT_ASSERT(!s.contains(h));
432 CPPUNIT_ASSERT(s.insert(value_type(i, h)));
433 CPPUNIT_ASSERT(s.contains(h));
435 CPPUNIT_ASSERT(!s.empty());
436 CPPUNIT_ASSERT(s.size() == i + 1);
438 CPPUNIT_ASSERT(!s.insert(arg_type(i, h)));
439 CPPUNIT_ASSERT(s.size() == i + 1);
442 // update existing test
443 for (size_t i = 0; i < capacity; ++i) {
444 hash_type h = hasher(i);
445 CPPUNIT_ASSERT(s.contains(h));
446 std::pair<bool, bool> ret = s.update(arg_type(i, h),
447 [](value_type& i, value_type * prev) {
448 CPPUNIT_ASSERT_CURRENT(prev != nullptr);
449 CPPUNIT_ASSERT_CURRENT(i.key == prev->key);
450 CPPUNIT_ASSERT_CURRENT(i.hash == prev->hash);
453 CPPUNIT_ASSERT(ret.first);
454 CPPUNIT_ASSERT(!ret.second);
455 CPPUNIT_ASSERT(s.contains(h));
456 CPPUNIT_ASSERT(s.size() == capacity);
460 value_type * p = s.get(h);
462 CPPUNIT_ASSERT(p->nInsertCall == 1);
463 CPPUNIT_ASSERT(p->key == i);
464 CPPUNIT_ASSERT(p->hash == h);
469 for (size_t i = 0; i < capacity; ++i) {
470 CPPUNIT_ASSERT(!s.empty());
471 CPPUNIT_ASSERT(s.size() == capacity - i);
472 CPPUNIT_ASSERT(s.find(hasher(i), [](value_type &) {}));
473 CPPUNIT_ASSERT(s.erase(hasher(i)));
474 CPPUNIT_ASSERT(!s.find(hasher(i), [](value_type &) {}));
475 CPPUNIT_ASSERT(s.size() == capacity - i - 1);
477 CPPUNIT_ASSERT(s.empty());
479 // Iterators on empty set
482 CPPUNIT_ASSERT(s.begin() == s.end());
483 CPPUNIT_ASSERT(s.cbegin() == s.cend());
484 CPPUNIT_ASSERT(s.rbegin() == s.rend());
485 CPPUNIT_ASSERT(s.crbegin() == s.crend());
488 // insert with functor
489 for (size_t i = capacity; i > 0; --i) {
490 CPPUNIT_ASSERT(s.size() == capacity - i);
491 CPPUNIT_ASSERT(s.insert(arg_type(i, hasher(i)), [](value_type& val) { val.nInsertCall += 1; }));
492 CPPUNIT_ASSERT(s.size() == capacity - i + 1);
493 CPPUNIT_ASSERT(!s.empty());
495 CPPUNIT_ASSERT(s.find(hasher(i), [](value_type& val) {
496 CPPUNIT_ASSERT_CURRENT(val.nInsertCall == 1);
500 CPPUNIT_ASSERT(s.size() == capacity);
502 // for-each iterator test
506 CPPUNIT_ASSERT(el.nInsertCall == 1);
507 CPPUNIT_ASSERT(el.nFindCall == 1);
515 for (auto it = s.begin(), itEnd = s.end(); it != itEnd; ++it) {
516 CPPUNIT_ASSERT(it->nInsertCall == 1);
517 CPPUNIT_ASSERT(it->nFindCall == 2);
522 // reverse iterator test
525 for (auto it = s.rbegin(), itEnd = s.rend(); it != itEnd; ++it) {
526 CPPUNIT_ASSERT(it->nInsertCall == 1);
527 CPPUNIT_ASSERT(it->nFindCall == 3);
532 // const iterator test
535 for (auto it = s.cbegin(), itEnd = s.cend(); it != itEnd; ++it) {
536 CPPUNIT_ASSERT(it->nInsertCall == 1);
537 CPPUNIT_ASSERT(it->nFindCall == 4);
538 it->nIteratorCall += 1;
542 // const reverse iterator test
545 for (auto it = s.rbegin(), itEnd = s.rend(); it != itEnd; ++it) {
546 CPPUNIT_ASSERT(it->nInsertCall == 1);
547 CPPUNIT_ASSERT(it->nFindCall == 4);
548 CPPUNIT_ASSERT(it->nIteratorCall == 1);
549 it->nIteratorCall += 1;
553 // check completeness
554 for (size_t i = 1; i <= capacity; ++i) {
555 CPPUNIT_ASSERT(s.find(hasher(i), [](value_type const& el) {
556 CPPUNIT_ASSERT_CURRENT(el.nInsertCall == 1);
557 CPPUNIT_ASSERT_CURRENT(el.nFindCall == 4);
558 CPPUNIT_ASSERT_CURRENT(el.nIteratorCall == 2);
562 // erase with functor test
565 for (size_t i = 1; i <= capacity; ++i) {
566 CPPUNIT_ASSERT(s.size() == capacity - i + 1);
567 CPPUNIT_ASSERT(s.erase(hasher(i), [&nSum](value_type const& val) {
568 CPPUNIT_ASSERT_CURRENT(val.nInsertCall == 1);
569 CPPUNIT_ASSERT_CURRENT(val.nFindCall == 4);
570 CPPUNIT_ASSERT_CURRENT(val.nIteratorCall == 2);
573 CPPUNIT_ASSERT(s.size() == capacity - i);
574 CPPUNIT_ASSERT(!s.erase(hasher(i), [&nSum](value_type const& val) { nSum += val.key; }))
576 CPPUNIT_ASSERT(s.empty());
577 CPPUNIT_ASSERT(nSum == (1 + capacity) * capacity / 2);
580 // update test with insert allowing
581 for (size_t i = 0; i < capacity; ++i) {
582 hash_type h = hasher(i);
583 CPPUNIT_ASSERT(!s.contains(h));
587 value_type * p = s.get(h);
590 std::pair<bool, bool> ret = s.update(arg_type(i, h),
591 [](value_type& i, value_type * prev) {
592 CPPUNIT_ASSERT_CURRENT(prev == nullptr);
595 CPPUNIT_ASSERT(ret.first);
596 CPPUNIT_ASSERT(ret.second);
597 CPPUNIT_ASSERT(s.contains(h));
598 CPPUNIT_ASSERT(s.size() == i + 1);
602 value_type * p = s.get(h);
604 CPPUNIT_ASSERT(p->nInsertCall == 1);
605 CPPUNIT_ASSERT(p->key == i);
606 CPPUNIT_ASSERT(p->hash == h);
609 CPPUNIT_ASSERT(!s.empty());
610 CPPUNIT_ASSERT(s.size() == capacity);
613 CPPUNIT_ASSERT(s.empty());
614 CPPUNIT_ASSERT(s.size() == 0);
617 for (size_t i = 0; i < capacity; ++i) {
618 hash_type h = hasher(i);
619 CPPUNIT_ASSERT(!s.contains(h));
620 CPPUNIT_ASSERT(s.emplace(i, hasher(i)));
621 CPPUNIT_ASSERT(s.contains(h));
623 CPPUNIT_ASSERT(!s.empty());
624 CPPUNIT_ASSERT(s.size() == i + 1);
626 CPPUNIT_ASSERT(!s.emplace(arg_type(i, h)));
627 CPPUNIT_ASSERT(s.size() == i + 1);
629 CPPUNIT_ASSERT(!s.empty());
630 CPPUNIT_ASSERT(s.size() == capacity);
633 for (size_t i = capacity; i != 0; --i) {
634 CPPUNIT_ASSERT(!s.empty());
635 CPPUNIT_ASSERT(s.size() == i);
637 exempt_ptr gp{ s.extract(hasher(i - 1)) };
639 CPPUNIT_ASSERT(gp->key == i - 1);
640 CPPUNIT_ASSERT(gp->hash == hasher(i - 1));
641 CPPUNIT_ASSERT(!s.contains(hasher(i - 1)));
645 value_type * p = s.get(hasher(i - 1));
646 CPPUNIT_ASSERT( p == nullptr );
648 CPPUNIT_ASSERT(s.size() == i - 1);
650 CPPUNIT_ASSERT(s.empty());
651 CPPUNIT_ASSERT(s.size() == 0);
653 CPPUNIT_MSG(s.statistics());
657 void hp_nohash_stat();
658 void hp_nohash_5_3();
659 void hp_nohash_5_3_stat();
661 void hp_stdhash_stat();
662 void hp_stdhash_5_3();
663 void hp_stdhash_5_3_stat();
665 void hp_hash128_stat();
666 void hp_hash128_4_3();
667 void hp_hash128_4_3_stat();
670 void dhp_nohash_stat();
671 void dhp_nohash_5_3();
672 void dhp_nohash_5_3_stat();
674 void dhp_stdhash_stat();
675 void dhp_stdhash_5_3();
676 void dhp_stdhash_5_3_stat();
678 void dhp_hash128_stat();
679 void dhp_hash128_4_3();
680 void dhp_hash128_4_3_stat();
682 void rcu_gpi_nohash();
683 void rcu_gpi_nohash_stat();
684 void rcu_gpi_nohash_5_3();
685 void rcu_gpi_nohash_5_3_stat();
686 void rcu_gpi_stdhash();
687 void rcu_gpi_stdhash_stat();
688 void rcu_gpi_stdhash_5_3();
689 void rcu_gpi_stdhash_5_3_stat();
690 void rcu_gpi_hash128();
691 void rcu_gpi_hash128_stat();
692 void rcu_gpi_hash128_4_3();
693 void rcu_gpi_hash128_4_3_stat();
695 void rcu_gpb_nohash();
696 void rcu_gpb_nohash_stat();
697 void rcu_gpb_nohash_5_3();
698 void rcu_gpb_nohash_5_3_stat();
699 void rcu_gpb_stdhash();
700 void rcu_gpb_stdhash_stat();
701 void rcu_gpb_stdhash_5_3();
702 void rcu_gpb_stdhash_5_3_stat();
703 void rcu_gpb_hash128();
704 void rcu_gpb_hash128_stat();
705 void rcu_gpb_hash128_4_3();
706 void rcu_gpb_hash128_4_3_stat();
708 void rcu_gpt_nohash();
709 void rcu_gpt_nohash_stat();
710 void rcu_gpt_nohash_5_3();
711 void rcu_gpt_nohash_5_3_stat();
712 void rcu_gpt_stdhash();
713 void rcu_gpt_stdhash_stat();
714 void rcu_gpt_stdhash_5_3();
715 void rcu_gpt_stdhash_5_3_stat();
716 void rcu_gpt_hash128();
717 void rcu_gpt_hash128_stat();
718 void rcu_gpt_hash128_4_3();
719 void rcu_gpt_hash128_4_3_stat();
721 void rcu_shb_nohash();
722 void rcu_shb_nohash_stat();
723 void rcu_shb_nohash_5_3();
724 void rcu_shb_nohash_5_3_stat();
725 void rcu_shb_stdhash();
726 void rcu_shb_stdhash_stat();
727 void rcu_shb_stdhash_5_3();
728 void rcu_shb_stdhash_5_3_stat();
729 void rcu_shb_hash128();
730 void rcu_shb_hash128_stat();
731 void rcu_shb_hash128_4_3();
732 void rcu_shb_hash128_4_3_stat();
734 void rcu_sht_nohash();
735 void rcu_sht_nohash_stat();
736 void rcu_sht_nohash_5_3();
737 void rcu_sht_nohash_5_3_stat();
738 void rcu_sht_stdhash();
739 void rcu_sht_stdhash_stat();
740 void rcu_sht_stdhash_5_3();
741 void rcu_sht_stdhash_5_3_stat();
742 void rcu_sht_hash128();
743 void rcu_sht_hash128_stat();
744 void rcu_sht_hash128_4_3();
745 void rcu_sht_hash128_4_3_stat();
747 CPPUNIT_TEST_SUITE(FeldmanHashSetHdrTest)
748 CPPUNIT_TEST(hp_nohash)
749 CPPUNIT_TEST(hp_nohash_stat)
750 CPPUNIT_TEST(hp_nohash_5_3)
751 CPPUNIT_TEST(hp_nohash_5_3_stat)
752 CPPUNIT_TEST(hp_stdhash)
753 CPPUNIT_TEST(hp_stdhash_stat)
754 CPPUNIT_TEST(hp_stdhash_5_3)
755 CPPUNIT_TEST(hp_stdhash_5_3_stat)
756 CPPUNIT_TEST(hp_hash128)
757 CPPUNIT_TEST(hp_hash128_stat)
758 CPPUNIT_TEST(hp_hash128_4_3)
759 CPPUNIT_TEST(hp_hash128_4_3_stat)
761 CPPUNIT_TEST(dhp_nohash)
762 CPPUNIT_TEST(dhp_nohash_stat)
763 CPPUNIT_TEST(dhp_nohash_5_3)
764 CPPUNIT_TEST(dhp_nohash_5_3_stat)
765 CPPUNIT_TEST(dhp_stdhash)
766 CPPUNIT_TEST(dhp_stdhash_stat)
767 CPPUNIT_TEST(dhp_stdhash_5_3)
768 CPPUNIT_TEST(dhp_stdhash_5_3_stat)
769 CPPUNIT_TEST(dhp_hash128)
770 CPPUNIT_TEST(dhp_hash128_stat)
771 CPPUNIT_TEST(dhp_hash128_4_3)
772 CPPUNIT_TEST(dhp_hash128_4_3_stat)
774 CPPUNIT_TEST(rcu_gpi_nohash)
775 CPPUNIT_TEST(rcu_gpi_nohash_stat)
776 CPPUNIT_TEST(rcu_gpi_nohash_5_3)
777 CPPUNIT_TEST(rcu_gpi_nohash_5_3_stat)
778 CPPUNIT_TEST(rcu_gpi_stdhash)
779 CPPUNIT_TEST(rcu_gpi_stdhash_stat)
780 CPPUNIT_TEST(rcu_gpi_stdhash_5_3)
781 CPPUNIT_TEST(rcu_gpi_stdhash_5_3_stat)
782 CPPUNIT_TEST(rcu_gpi_hash128)
783 CPPUNIT_TEST(rcu_gpi_hash128_stat)
784 CPPUNIT_TEST(rcu_gpi_hash128_4_3)
785 CPPUNIT_TEST(rcu_gpi_hash128_4_3_stat)
787 CPPUNIT_TEST(rcu_gpb_nohash)
788 CPPUNIT_TEST(rcu_gpb_nohash_stat)
789 CPPUNIT_TEST(rcu_gpb_nohash_5_3)
790 CPPUNIT_TEST(rcu_gpb_nohash_5_3_stat)
791 CPPUNIT_TEST(rcu_gpb_stdhash)
792 CPPUNIT_TEST(rcu_gpb_stdhash_stat)
793 CPPUNIT_TEST(rcu_gpb_stdhash_5_3)
794 CPPUNIT_TEST(rcu_gpb_stdhash_5_3_stat)
795 CPPUNIT_TEST(rcu_gpb_hash128)
796 CPPUNIT_TEST(rcu_gpb_hash128_stat)
797 CPPUNIT_TEST(rcu_gpb_hash128_4_3)
798 CPPUNIT_TEST(rcu_gpb_hash128_4_3_stat)
800 CPPUNIT_TEST(rcu_gpt_nohash)
801 CPPUNIT_TEST(rcu_gpt_nohash_stat)
802 CPPUNIT_TEST(rcu_gpt_nohash_5_3)
803 CPPUNIT_TEST(rcu_gpt_nohash_5_3_stat)
804 CPPUNIT_TEST(rcu_gpt_stdhash)
805 CPPUNIT_TEST(rcu_gpt_stdhash_stat)
806 CPPUNIT_TEST(rcu_gpt_stdhash_5_3)
807 CPPUNIT_TEST(rcu_gpt_stdhash_5_3_stat)
808 CPPUNIT_TEST(rcu_gpt_hash128)
809 CPPUNIT_TEST(rcu_gpt_hash128_stat)
810 CPPUNIT_TEST(rcu_gpt_hash128_4_3)
811 CPPUNIT_TEST(rcu_gpt_hash128_4_3_stat)
813 CPPUNIT_TEST(rcu_shb_nohash)
814 CPPUNIT_TEST(rcu_shb_nohash_stat)
815 CPPUNIT_TEST(rcu_shb_nohash_5_3)
816 CPPUNIT_TEST(rcu_shb_nohash_5_3_stat)
817 CPPUNIT_TEST(rcu_shb_stdhash)
818 CPPUNIT_TEST(rcu_shb_stdhash_stat)
819 CPPUNIT_TEST(rcu_shb_stdhash_5_3)
820 CPPUNIT_TEST(rcu_shb_stdhash_5_3_stat)
821 CPPUNIT_TEST(rcu_shb_hash128)
822 CPPUNIT_TEST(rcu_shb_hash128_stat)
823 CPPUNIT_TEST(rcu_shb_hash128_4_3)
824 CPPUNIT_TEST(rcu_shb_hash128_4_3_stat)
826 CPPUNIT_TEST(rcu_sht_nohash)
827 CPPUNIT_TEST(rcu_sht_nohash_stat)
828 CPPUNIT_TEST(rcu_sht_nohash_5_3)
829 CPPUNIT_TEST(rcu_sht_nohash_5_3_stat)
830 CPPUNIT_TEST(rcu_sht_stdhash)
831 CPPUNIT_TEST(rcu_sht_stdhash_stat)
832 CPPUNIT_TEST(rcu_sht_stdhash_5_3)
833 CPPUNIT_TEST(rcu_sht_stdhash_5_3_stat)
834 CPPUNIT_TEST(rcu_sht_hash128)
835 CPPUNIT_TEST(rcu_sht_hash128_stat)
836 CPPUNIT_TEST(rcu_sht_hash128_4_3)
837 CPPUNIT_TEST(rcu_sht_hash128_4_3_stat)
838 CPPUNIT_TEST_SUITE_END()
843 #endif // #ifndef CDSTEST_HDR_FELDMAN_HASHSET_H