Removed old set unit tests
[libcds.git] / tests / test-hdr / set / hdr_intrusive_feldman_hashset.h
diff --git a/tests/test-hdr/set/hdr_intrusive_feldman_hashset.h b/tests/test-hdr/set/hdr_intrusive_feldman_hashset.h
deleted file mode 100644 (file)
index 812bb6b..0000000
+++ /dev/null
@@ -1,817 +0,0 @@
-/*
-    This file is a part of libcds - Concurrent Data Structures library
-
-    (C) Copyright Maxim Khizhinsky (libcds.dev@gmail.com) 2006-2016
-
-    Source code repo: http://github.com/khizmax/libcds/
-    Download: http://sourceforge.net/projects/libcds/files/
-    
-    Redistribution and use in source and binary forms, with or without
-    modification, are permitted provided that the following conditions are met:
-
-    * Redistributions of source code must retain the above copyright notice, this
-      list of conditions and the following disclaimer.
-
-    * Redistributions in binary form must reproduce the above copyright notice,
-      this list of conditions and the following disclaimer in the documentation
-      and/or other materials provided with the distribution.
-
-    THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
-    AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-    IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
-    DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
-    FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-    DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
-    SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
-    CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
-    OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-    OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.     
-*/
-
-#ifndef CDSTEST_HDR_INTRUSIVE_FELDMAN_HASHSET_H
-#define CDSTEST_HDR_INTRUSIVE_FELDMAN_HASHSET_H
-
-#include "cppunit/cppunit_proxy.h"
-
-// forward declaration
-namespace cds {
-    namespace intrusive {}
-    namespace opt {}
-}
-
-namespace set {
-    namespace ci = cds::intrusive;
-    namespace co = cds::opt;
-
-    class IntrusiveFeldmanHashSetHdrTest: public CppUnitMini::TestCase
-    {
-        template <typename Hash>
-        struct Item
-        {
-            unsigned int nDisposeCount  ;   // count of disposer calling
-            Hash hash;
-            unsigned int nInsertCall;
-            unsigned int nFindCall;
-            unsigned int nEraseCall;
-            mutable unsigned int nIteratorCall;
-
-            Item()
-                : nDisposeCount(0)
-                , nInsertCall(0)
-                , nFindCall(0)
-                , nEraseCall(0)
-                , nIteratorCall(0)
-            {}
-        };
-
-        template <typename Hash>
-        struct get_hash
-        {
-            Hash const& operator()( Item<Hash> const& i ) const
-            {
-                return i.hash;
-            }
-        };
-
-        template <typename Key>
-        struct get_key
-        {
-            Key const& operator()(Item<Key> const& i) const
-            {
-                return i.hash;
-            }
-        };
-
-        struct item_disposer {
-            template <typename Hash>
-            void operator()( Item<Hash> * p )
-            {
-                ++p->nDisposeCount;
-            }
-        };
-
-        template <typename Key>
-        struct nohash {
-            Key operator()(Key k) const
-            {
-                return k;
-            }
-        };
-
-        struct hash128
-        {
-            size_t lo;
-            size_t hi;
-
-            hash128() {}
-            hash128(size_t l, size_t h) : lo(l), hi(h) {}
-
-            struct make {
-                hash128 operator()( size_t n ) const
-                {
-                    return hash128( std::hash<size_t>()( n ), std::hash<size_t>()( ~n ));
-                }
-                hash128 operator()( hash128 const& n ) const
-                {
-                    return hash128( std::hash<size_t>()( n.lo ), std::hash<size_t>()( ~n.hi ));
-                }
-            };
-
-            struct less {
-                bool operator()( hash128 const& lhs, hash128 const& rhs ) const
-                {
-                    if ( lhs.hi != rhs.hi )
-                        return lhs.hi < rhs.hi;
-                    return lhs.lo < rhs.lo;
-                }
-            };
-
-            struct cmp {
-                int operator()( hash128 const& lhs, hash128 const& rhs ) const
-                {
-                    if ( lhs.hi != rhs.hi )
-                        return lhs.hi < rhs.hi ? -1 : 1;
-                    return lhs.lo < rhs.lo ? -1 : lhs.lo == rhs.lo ? 0 : 1;
-                }
-            };
-        };
-
-
-        template <typename Set, typename Hash>
-        void test_hp( size_t nHeadBits, size_t nArrayBits )
-        {
-            typedef typename Set::hash_type hash_type;
-            typedef typename Set::value_type value_type;
-
-            Hash hasher;
-
-            size_t const arrCapacity = 1000;
-            std::vector< value_type > arrValue;
-            arrValue.reserve( arrCapacity );
-            for ( size_t i = 0; i < arrCapacity; ++i ) {
-                arrValue.emplace_back( value_type() );
-                arrValue.back().hash = hasher( i );
-            }
-            CPPUNIT_ASSERT( arrValue.size() == arrCapacity );
-
-            Set s( nHeadBits, nArrayBits );
-            CPPUNIT_MSG("Array size: head=" << s.head_size() << ", array_node=" << s.array_node_size());
-            CPPUNIT_ASSERT(s.head_size() >= (size_t(1) << nHeadBits));
-            CPPUNIT_ASSERT(s.array_node_size() == (size_t(1) << nArrayBits));
-
-            // insert() test
-            CPPUNIT_ASSERT(s.size() == 0 );
-            CPPUNIT_ASSERT(s.empty() );
-            for ( auto& el : arrValue ) {
-                CPPUNIT_ASSERT( s.insert( el ));
-                CPPUNIT_ASSERT(s.contains( el.hash ));
-            }
-            CPPUNIT_ASSERT(s.size() == arrCapacity );
-            for ( auto& el : arrValue ) {
-                CPPUNIT_ASSERT(s.contains( el.hash ));
-                CPPUNIT_ASSERT( !s.insert( el ) );
-            }
-            CPPUNIT_ASSERT(s.size() == arrCapacity );
-            CPPUNIT_ASSERT( !s.empty() );
-
-            // Iterator test
-            {
-                typedef typename Set::iterator iterator;
-                for ( iterator it = s.begin(), itEnd = s.end(); it != itEnd; ++it )
-                    ++(it->nIteratorCall);
-                for ( auto& el : arrValue ) {
-                    CPPUNIT_ASSERT( el.nIteratorCall == 1 );
-                    el.nIteratorCall = 0;
-                }
-            }
-
-            {
-                // Const iterator test
-                for ( typename Set::const_iterator it = s.cbegin(), itEnd = s.cend(); it != itEnd; ++it )
-                    (*it).nIteratorCall += 1;
-                for ( auto& el : arrValue ) {
-                    CPPUNIT_ASSERT( el.nIteratorCall == 1 );
-                    el.nIteratorCall = 0;
-                }
-            }
-
-            {
-                // Reverse iterator test
-                for ( typename Set::reverse_iterator it = s.rbegin(), itEnd = s.rend(); it != itEnd; ++it )
-                    it->nIteratorCall += 1;
-                for ( auto& el : arrValue ) {
-                    CPPUNIT_ASSERT( el.nIteratorCall == 1 );
-                    el.nIteratorCall = 0;
-                }
-            }
-
-            {
-                // Reverse const iterator test
-                for ( typename Set::const_reverse_iterator it = s.crbegin(), itEnd = s.crend(); it != itEnd; ++it ) {
-                    (*it).nIteratorCall += 1;
-                    it.release();
-                }
-                for ( auto& el : arrValue ) {
-                    CPPUNIT_ASSERT( el.nIteratorCall == 1 );
-                    el.nIteratorCall = 0;
-                }
-            }
-
-            // update() exists test
-            for ( auto& el : arrValue ) {
-                bool bOp, bInsert;
-                std::tie(bOp, bInsert) = s.update( el, false );
-                CPPUNIT_ASSERT( bOp );
-                CPPUNIT_ASSERT( !bInsert );
-                CPPUNIT_ASSERT( el.nFindCall == 0 );
-                CPPUNIT_ASSERT(s.find(el.hash, [](value_type& v) { v.nFindCall++; } ));
-                CPPUNIT_ASSERT( el.nFindCall == 1 );
-            }
-
-            // unlink test
-            CPPUNIT_ASSERT(s.size() == arrCapacity );
-            for ( auto const& el : arrValue ) {
-                CPPUNIT_ASSERT(s.unlink( el ));
-                CPPUNIT_ASSERT(!s.contains( el.hash ));
-            }
-            CPPUNIT_ASSERT(s.size() == 0 );
-            Set::gc::force_dispose();
-            for ( auto const& el : arrValue ) {
-                CPPUNIT_ASSERT( el.nDisposeCount == 1 );
-            }
-
-            // new hash values
-            for ( auto& el : arrValue )
-                el.hash = hasher( el.hash );
-
-            // insert( func )
-            CPPUNIT_ASSERT(s.size() == 0 );
-            for ( auto& el : arrValue ) {
-                CPPUNIT_ASSERT( s.insert( el, []( value_type& v ) { ++v.nInsertCall; } ));
-                CPPUNIT_ASSERT(s.contains( el.hash ));
-                CPPUNIT_ASSERT( el.nInsertCall == 1 );
-            }
-            CPPUNIT_ASSERT(s.size() == arrCapacity );
-            for ( auto& el : arrValue ) {
-                CPPUNIT_ASSERT(s.contains( el.hash ));
-                CPPUNIT_ASSERT( !s.insert( el ) );
-            }
-            CPPUNIT_ASSERT(s.size() == arrCapacity );
-            CPPUNIT_ASSERT( !s.empty() );
-
-            for ( auto& el : arrValue )
-                el.nDisposeCount = 0;
-
-            s.clear();
-            CPPUNIT_ASSERT(s.size() == 0 );
-            Set::gc::force_dispose();
-            for ( auto const& el : arrValue ) {
-                CPPUNIT_ASSERT( el.nDisposeCount == 1 );
-            }
-
-            // new hash values
-            for ( auto& el : arrValue )
-                el.hash = hasher( el.hash );
-
-            // update test
-            for ( auto& el : arrValue ) {
-                bool bOp, bInsert;
-                std::tie(bOp, bInsert) = s.update( el, false );
-                CPPUNIT_ASSERT( !bOp );
-                CPPUNIT_ASSERT( !bInsert );
-                CPPUNIT_ASSERT( !s.contains( el.hash ));
-
-                std::tie(bOp, bInsert) = s.update( el, true );
-                CPPUNIT_ASSERT( bOp );
-                CPPUNIT_ASSERT( bInsert );
-                CPPUNIT_ASSERT( s.contains( el.hash ));
-            }
-            CPPUNIT_ASSERT(s.size() == arrCapacity );
-
-            // erase test
-            for ( auto& el : arrValue ) {
-                el.nDisposeCount = 0;
-                CPPUNIT_ASSERT( s.contains( el.hash ));
-                CPPUNIT_ASSERT(s.erase( el.hash ));
-                CPPUNIT_ASSERT( !s.contains( el.hash ));
-                CPPUNIT_ASSERT( !s.erase( el.hash ));
-            }
-            CPPUNIT_ASSERT(s.size() == 0 );
-            Set::gc::force_dispose();
-            for ( auto& el : arrValue ) {
-                CPPUNIT_ASSERT( el.nDisposeCount == 1 );
-                CPPUNIT_ASSERT(s.insert( el ));
-            }
-
-            // erase with functor, get() test
-            for ( auto& el : arrValue ) {
-                el.nDisposeCount = 0;
-                CPPUNIT_ASSERT( s.contains( el.hash ) );
-                {
-                    typename Set::guarded_ptr gp{ s.get( el.hash ) };
-                    CPPUNIT_ASSERT( gp );
-                    CPPUNIT_ASSERT( gp->nEraseCall == 0);
-                    CPPUNIT_ASSERT(s.erase( gp->hash, []( value_type& i ) { ++i.nEraseCall; } ));
-                    CPPUNIT_ASSERT( gp->nEraseCall == 1);
-                    Set::gc::force_dispose();
-                    CPPUNIT_ASSERT( gp->nDisposeCount == 0 );
-                }
-                CPPUNIT_ASSERT( !s.contains( el.hash ));
-                CPPUNIT_ASSERT( !s.erase( el.hash ));
-                CPPUNIT_ASSERT( el.nEraseCall == 1 );
-                Set::gc::force_dispose();
-                CPPUNIT_ASSERT( el.nDisposeCount == 1 );
-            }
-            CPPUNIT_ASSERT(s.size() == 0 );
-
-            // new hash values
-            for ( auto& el : arrValue ) {
-                el.hash = hasher( el.hash );
-                el.nDisposeCount = 0;
-                bool bOp, bInsert;
-                std::tie(bOp, bInsert) = s.update( el );
-                CPPUNIT_ASSERT( bOp );
-                CPPUNIT_ASSERT( bInsert );
-            }
-            CPPUNIT_ASSERT(s.size() == arrCapacity );
-
-            // extract test
-            for ( auto& el : arrValue ) {
-                CPPUNIT_ASSERT( s.contains( el.hash ) );
-                typename Set::guarded_ptr gp = s.extract( el.hash );
-                CPPUNIT_ASSERT( gp );
-                Set::gc::force_dispose();
-                CPPUNIT_ASSERT( el.nDisposeCount == 0 );
-                CPPUNIT_ASSERT( gp->nDisposeCount == 0 );
-                gp = s.get( el.hash );
-                CPPUNIT_ASSERT( !gp );
-                Set::gc::force_dispose();
-                CPPUNIT_ASSERT( el.nDisposeCount == 1 );
-                CPPUNIT_ASSERT( !s.contains( el.hash ) );
-            }
-            CPPUNIT_ASSERT(s.size() == 0 );
-            CPPUNIT_ASSERT(s.empty() );
-
-            // erase with iterator
-            for ( auto& el : arrValue ) {
-                el.nDisposeCount = 0;
-                el.nIteratorCall = 0;
-                CPPUNIT_ASSERT(s.insert( el ));
-            }
-            for ( auto it = s.begin(), itEnd = s.end(); it != itEnd; ++it ) {
-                s.erase_at( it );
-                it->nIteratorCall = 1;
-            }
-            CPPUNIT_ASSERT(s.size() == 0 );
-            Set::gc::force_dispose();
-            for ( auto& el : arrValue ) {
-                CPPUNIT_ASSERT( el.nDisposeCount == 1 );
-                CPPUNIT_ASSERT( el.nIteratorCall == 1 );
-            }
-            CPPUNIT_ASSERT(s.empty() );
-
-            // erase with reverse_iterator
-            for ( auto& el : arrValue ) {
-                el.nDisposeCount = 0;
-                el.nIteratorCall = 0;
-                CPPUNIT_ASSERT(s.insert( el ));
-            }
-            for ( auto it = s.rbegin(), itEnd = s.rend(); it != itEnd; ++it ) {
-                s.erase_at( it );
-                it->nIteratorCall = 1;
-            }
-            CPPUNIT_ASSERT(s.size() == 0 );
-            Set::gc::force_dispose();
-            for ( auto& el : arrValue ) {
-                CPPUNIT_ASSERT( el.nDisposeCount == 1 );
-                CPPUNIT_ASSERT( el.nIteratorCall == 1 );
-            }
-            CPPUNIT_ASSERT(s.empty() );
-
-            CPPUNIT_MSG( s.statistics() );
-        }
-
-        template <typename Set, typename Hash>
-        void test_rcu(size_t nHeadBits, size_t nArrayBits)
-        {
-            typedef typename Set::hash_type hash_type;
-            typedef typename Set::value_type value_type;
-            typedef typename Set::rcu_lock  rcu_lock;
-
-            Hash hasher;
-
-            size_t const arrCapacity = 1000;
-            std::vector< value_type > arrValue;
-            arrValue.reserve(arrCapacity);
-            for (size_t i = 0; i < arrCapacity; ++i) {
-                arrValue.emplace_back(value_type());
-                arrValue.back().hash = hasher(i);
-            }
-            CPPUNIT_ASSERT(arrValue.size() == arrCapacity);
-
-            Set s(nHeadBits, nArrayBits);
-            CPPUNIT_MSG("Array size: head=" << s.head_size() << ", array_node=" << s.array_node_size());
-            CPPUNIT_ASSERT(s.head_size() >= (size_t(1) << nHeadBits));
-            CPPUNIT_ASSERT(s.array_node_size() == (size_t(1) << nArrayBits));
-
-            // insert() test
-            CPPUNIT_ASSERT(s.size() == 0);
-            CPPUNIT_ASSERT(s.empty());
-            for (auto& el : arrValue) {
-                CPPUNIT_ASSERT(s.insert(el));
-                CPPUNIT_ASSERT(s.contains(el.hash));
-            }
-            CPPUNIT_ASSERT(s.size() == arrCapacity);
-            for (auto& el : arrValue) {
-                CPPUNIT_ASSERT(s.contains(el.hash));
-                CPPUNIT_ASSERT(!s.insert(el));
-            }
-            CPPUNIT_ASSERT(s.size() == arrCapacity);
-            CPPUNIT_ASSERT(!s.empty());
-
-            // Iterator test
-            {
-                rcu_lock l;
-
-                typedef typename Set::iterator iterator;
-                for (iterator it = s.begin(), itEnd = s.end(); it != itEnd; ++it)
-                    ++(it->nIteratorCall);
-                for (auto& el : arrValue) {
-                    CPPUNIT_ASSERT(el.nIteratorCall == 1);
-                    el.nIteratorCall = 0;
-                }
-            }
-
-            {
-                // Const iterator test
-                rcu_lock l;
-
-                for (typename Set::const_iterator it = s.cbegin(), itEnd = s.cend(); it != itEnd; ++it)
-                    (*it).nIteratorCall += 1;
-                for (auto& el : arrValue) {
-                    CPPUNIT_ASSERT(el.nIteratorCall == 1);
-                    el.nIteratorCall = 0;
-                }
-            }
-
-            {
-                // Reverse iterator test
-                rcu_lock l;
-
-                for (typename Set::reverse_iterator it = s.rbegin(), itEnd = s.rend(); it != itEnd; ++it)
-                    it->nIteratorCall += 1;
-                for (auto& el : arrValue) {
-                    CPPUNIT_ASSERT(el.nIteratorCall == 1);
-                    el.nIteratorCall = 0;
-                }
-            }
-
-            {
-                // Reverse const iterator test
-                rcu_lock l;
-
-                for (typename Set::const_reverse_iterator it = s.crbegin(), itEnd = s.crend(); it != itEnd; ++it) {
-                    (*it).nIteratorCall += 1;
-                }
-                for (auto& el : arrValue) {
-                    CPPUNIT_ASSERT(el.nIteratorCall == 1);
-                    el.nIteratorCall = 0;
-                }
-            }
-
-            // update() exists test
-            for (auto& el : arrValue) {
-                bool bOp, bInsert;
-                std::tie(bOp, bInsert) = s.update(el, false);
-                CPPUNIT_ASSERT(bOp);
-                CPPUNIT_ASSERT(!bInsert);
-                CPPUNIT_ASSERT(el.nFindCall == 0);
-                CPPUNIT_ASSERT(s.find(el.hash, [](value_type& v) { v.nFindCall++; }));
-                CPPUNIT_ASSERT(el.nFindCall == 1);
-            }
-
-            // unlink test
-            CPPUNIT_ASSERT(s.size() == arrCapacity);
-            for (auto const& el : arrValue) {
-                CPPUNIT_ASSERT(s.unlink(el));
-                CPPUNIT_ASSERT(!s.contains(el.hash));
-            }
-            CPPUNIT_ASSERT(s.size() == 0);
-            Set::gc::force_dispose();
-            for (auto const& el : arrValue) {
-                CPPUNIT_ASSERT(el.nDisposeCount == 1);
-            }
-
-            // new hash values
-            for (auto& el : arrValue)
-                el.hash = hasher(el.hash);
-
-            // insert( func )
-            CPPUNIT_ASSERT(s.size() == 0);
-            for (auto& el : arrValue) {
-                CPPUNIT_ASSERT(s.insert(el, [](value_type& v) { ++v.nInsertCall; }));
-                CPPUNIT_ASSERT(s.contains(el.hash));
-                CPPUNIT_ASSERT(el.nInsertCall == 1);
-            }
-            CPPUNIT_ASSERT(s.size() == arrCapacity);
-            for (auto& el : arrValue) {
-                CPPUNIT_ASSERT(s.contains(el.hash));
-                CPPUNIT_ASSERT(!s.insert(el));
-            }
-            CPPUNIT_ASSERT(s.size() == arrCapacity);
-            CPPUNIT_ASSERT(!s.empty());
-
-            for (auto& el : arrValue)
-                el.nDisposeCount = 0;
-
-            s.clear();
-            CPPUNIT_ASSERT(s.size() == 0);
-            Set::gc::force_dispose();
-            for (auto const& el : arrValue) {
-                CPPUNIT_ASSERT(el.nDisposeCount == 1);
-            }
-
-            // new hash values
-            for (auto& el : arrValue)
-                el.hash = hasher(el.hash);
-
-            // update test
-            for (auto& el : arrValue) {
-                bool bOp, bInsert;
-                std::tie(bOp, bInsert) = s.update(el, false);
-                CPPUNIT_ASSERT(!bOp);
-                CPPUNIT_ASSERT(!bInsert);
-                CPPUNIT_ASSERT(!s.contains(el.hash));
-
-                std::tie(bOp, bInsert) = s.update(el, true);
-                CPPUNIT_ASSERT(bOp);
-                CPPUNIT_ASSERT(bInsert);
-                CPPUNIT_ASSERT(s.contains(el.hash));
-            }
-            CPPUNIT_ASSERT(s.size() == arrCapacity);
-
-            // erase test
-            for (auto& el : arrValue) {
-                el.nDisposeCount = 0;
-                CPPUNIT_ASSERT(s.contains(el.hash));
-                CPPUNIT_ASSERT(s.erase(el.hash));
-                CPPUNIT_ASSERT(!s.contains(el.hash));
-                CPPUNIT_ASSERT(!s.erase(el.hash));
-            }
-            CPPUNIT_ASSERT(s.size() == 0);
-            Set::gc::force_dispose();
-            for (auto& el : arrValue) {
-                CPPUNIT_ASSERT(el.nDisposeCount == 1);
-                CPPUNIT_ASSERT(s.insert(el));
-            }
-
-            // erase with functor, get() test
-            for (auto& el : arrValue) {
-                el.nDisposeCount = 0;
-                CPPUNIT_ASSERT(s.contains(el.hash));
-                value_type * p;
-                {
-                    rcu_lock l;
-                    p = s.get(el.hash);
-                    CPPUNIT_ASSERT(p);
-                    CPPUNIT_ASSERT(p->nEraseCall == 0);
-                }
-                // This is single-threaded test with faked disposer
-                // so we can dereference p outside RCU lock section
-                CPPUNIT_ASSERT(s.erase(p->hash, [](value_type& i) { ++i.nEraseCall; }));
-                CPPUNIT_ASSERT(p->nEraseCall == 1);
-                Set::gc::force_dispose();
-                CPPUNIT_ASSERT(p->nDisposeCount == 1);
-
-                CPPUNIT_ASSERT(!s.contains(el.hash));
-                CPPUNIT_ASSERT(!s.erase(el.hash));
-                CPPUNIT_ASSERT(el.nEraseCall == 1);
-                Set::gc::force_dispose();
-                CPPUNIT_ASSERT(el.nDisposeCount == 1);
-            }
-            CPPUNIT_ASSERT(s.size() == 0);
-
-            // new hash values
-            for (auto& el : arrValue) {
-                el.hash = hasher(el.hash);
-                el.nDisposeCount = 0;
-                bool bOp, bInsert;
-                std::tie(bOp, bInsert) = s.update(el);
-                CPPUNIT_ASSERT(bOp);
-                CPPUNIT_ASSERT(bInsert);
-            }
-            CPPUNIT_ASSERT(s.size() == arrCapacity);
-
-            // extract test
-            for (auto& el : arrValue) {
-                CPPUNIT_ASSERT(s.contains(el.hash));
-                typename Set::exempt_ptr xp = s.extract(el.hash);
-                CPPUNIT_ASSERT(xp);
-                Set::gc::force_dispose();
-                CPPUNIT_ASSERT(el.nDisposeCount == 0);
-                CPPUNIT_ASSERT(xp->nDisposeCount == 0);
-                xp.release();
-                {
-                    rcu_lock l;
-                    value_type * p = s.get(el.hash);
-                    CPPUNIT_ASSERT(!p);
-                }
-                Set::gc::force_dispose();
-                CPPUNIT_ASSERT(el.nDisposeCount == 1);
-                CPPUNIT_ASSERT(!s.contains(el.hash));
-            }
-            CPPUNIT_ASSERT(s.size() == 0);
-            CPPUNIT_ASSERT(s.empty());
-
-            CPPUNIT_MSG(s.statistics());
-        }
-
-        void hp_nohash();
-        void hp_nohash_stat();
-        void hp_nohash_5_3();
-        void hp_nohash_5_3_stat();
-        void hp_stdhash();
-        void hp_stdhash_stat();
-        void hp_stdhash_5_3();
-        void hp_stdhash_5_3_stat();
-        void hp_hash128();
-        void hp_hash128_stat();
-        void hp_hash128_4_3();
-        void hp_hash128_4_3_stat();
-
-        void dhp_nohash();
-        void dhp_nohash_stat();
-        void dhp_nohash_5_3();
-        void dhp_nohash_5_3_stat();
-        void dhp_stdhash();
-        void dhp_stdhash_stat();
-        void dhp_stdhash_5_3();
-        void dhp_stdhash_5_3_stat();
-        void dhp_hash128();
-        void dhp_hash128_stat();
-        void dhp_hash128_4_3();
-        void dhp_hash128_4_3_stat();
-
-        void rcu_gpi_nohash();
-        void rcu_gpi_nohash_stat();
-        void rcu_gpi_nohash_5_3();
-        void rcu_gpi_nohash_5_3_stat();
-        void rcu_gpi_stdhash();
-        void rcu_gpi_stdhash_stat();
-        void rcu_gpi_stdhash_5_3();
-        void rcu_gpi_stdhash_5_3_stat();
-        void rcu_gpi_hash128();
-        void rcu_gpi_hash128_stat();
-        void rcu_gpi_hash128_4_3();
-        void rcu_gpi_hash128_4_3_stat();
-
-        void rcu_gpb_nohash();
-        void rcu_gpb_nohash_stat();
-        void rcu_gpb_nohash_5_3();
-        void rcu_gpb_nohash_5_3_stat();
-        void rcu_gpb_stdhash();
-        void rcu_gpb_stdhash_stat();
-        void rcu_gpb_stdhash_5_3();
-        void rcu_gpb_stdhash_5_3_stat();
-        void rcu_gpb_hash128();
-        void rcu_gpb_hash128_stat();
-        void rcu_gpb_hash128_4_3();
-        void rcu_gpb_hash128_4_3_stat();
-
-        void rcu_gpt_nohash();
-        void rcu_gpt_nohash_stat();
-        void rcu_gpt_nohash_5_3();
-        void rcu_gpt_nohash_5_3_stat();
-        void rcu_gpt_stdhash();
-        void rcu_gpt_stdhash_stat();
-        void rcu_gpt_stdhash_5_3();
-        void rcu_gpt_stdhash_5_3_stat();
-        void rcu_gpt_hash128();
-        void rcu_gpt_hash128_stat();
-        void rcu_gpt_hash128_4_3();
-        void rcu_gpt_hash128_4_3_stat();
-
-        void rcu_shb_nohash();
-        void rcu_shb_nohash_stat();
-        void rcu_shb_nohash_5_3();
-        void rcu_shb_nohash_5_3_stat();
-        void rcu_shb_stdhash();
-        void rcu_shb_stdhash_stat();
-        void rcu_shb_stdhash_5_3();
-        void rcu_shb_stdhash_5_3_stat();
-        void rcu_shb_hash128();
-        void rcu_shb_hash128_stat();
-        void rcu_shb_hash128_4_3();
-        void rcu_shb_hash128_4_3_stat();
-
-        void rcu_sht_nohash();
-        void rcu_sht_nohash_stat();
-        void rcu_sht_nohash_5_3();
-        void rcu_sht_nohash_5_3_stat();
-        void rcu_sht_stdhash();
-        void rcu_sht_stdhash_stat();
-        void rcu_sht_stdhash_5_3();
-        void rcu_sht_stdhash_5_3_stat();
-        void rcu_sht_hash128();
-        void rcu_sht_hash128_stat();
-        void rcu_sht_hash128_4_3();
-        void rcu_sht_hash128_4_3_stat();
-
-        CPPUNIT_TEST_SUITE(IntrusiveFeldmanHashSetHdrTest)
-            CPPUNIT_TEST(hp_nohash)
-            CPPUNIT_TEST(hp_nohash_stat)
-            CPPUNIT_TEST(hp_nohash_5_3)
-            CPPUNIT_TEST(hp_nohash_5_3_stat)
-            CPPUNIT_TEST(hp_stdhash)
-            CPPUNIT_TEST(hp_stdhash_stat)
-            CPPUNIT_TEST(hp_stdhash_5_3)
-            CPPUNIT_TEST(hp_stdhash_5_3_stat)
-            CPPUNIT_TEST(hp_hash128)
-            CPPUNIT_TEST(hp_hash128_stat)
-            CPPUNIT_TEST(hp_hash128_4_3)
-            CPPUNIT_TEST(hp_hash128_4_3_stat)
-
-            CPPUNIT_TEST(dhp_nohash)
-            CPPUNIT_TEST(dhp_nohash_stat)
-            CPPUNIT_TEST(dhp_nohash_5_3)
-            CPPUNIT_TEST(dhp_nohash_5_3_stat)
-            CPPUNIT_TEST(dhp_stdhash)
-            CPPUNIT_TEST(dhp_stdhash_stat)
-            CPPUNIT_TEST(dhp_stdhash_5_3)
-            CPPUNIT_TEST(dhp_stdhash_5_3_stat)
-            CPPUNIT_TEST(dhp_hash128)
-            CPPUNIT_TEST(dhp_hash128_stat)
-            CPPUNIT_TEST(dhp_hash128_4_3)
-            CPPUNIT_TEST(dhp_hash128_4_3_stat)
-
-            CPPUNIT_TEST(rcu_gpi_nohash)
-            CPPUNIT_TEST(rcu_gpi_nohash_stat)
-            CPPUNIT_TEST(rcu_gpi_nohash_5_3)
-            CPPUNIT_TEST(rcu_gpi_nohash_5_3_stat)
-            CPPUNIT_TEST(rcu_gpi_stdhash)
-            CPPUNIT_TEST(rcu_gpi_stdhash_stat)
-            CPPUNIT_TEST(rcu_gpi_stdhash_5_3)
-            CPPUNIT_TEST(rcu_gpi_stdhash_5_3_stat)
-            CPPUNIT_TEST(rcu_gpi_hash128)
-            CPPUNIT_TEST(rcu_gpi_hash128_stat)
-            CPPUNIT_TEST(rcu_gpi_hash128_4_3)
-            CPPUNIT_TEST(rcu_gpi_hash128_4_3_stat)
-
-            CPPUNIT_TEST(rcu_gpb_nohash)
-            CPPUNIT_TEST(rcu_gpb_nohash_stat)
-            CPPUNIT_TEST(rcu_gpb_nohash_5_3)
-            CPPUNIT_TEST(rcu_gpb_nohash_5_3_stat)
-            CPPUNIT_TEST(rcu_gpb_stdhash)
-            CPPUNIT_TEST(rcu_gpb_stdhash_stat)
-            CPPUNIT_TEST(rcu_gpb_stdhash_5_3)
-            CPPUNIT_TEST(rcu_gpb_stdhash_5_3_stat)
-            CPPUNIT_TEST(rcu_gpb_hash128)
-            CPPUNIT_TEST(rcu_gpb_hash128_stat)
-            CPPUNIT_TEST(rcu_gpb_hash128_4_3)
-            CPPUNIT_TEST(rcu_gpb_hash128_4_3_stat)
-
-            CPPUNIT_TEST(rcu_gpt_nohash)
-            CPPUNIT_TEST(rcu_gpt_nohash_stat)
-            CPPUNIT_TEST(rcu_gpt_nohash_5_3)
-            CPPUNIT_TEST(rcu_gpt_nohash_5_3_stat)
-            CPPUNIT_TEST(rcu_gpt_stdhash)
-            CPPUNIT_TEST(rcu_gpt_stdhash_stat)
-            CPPUNIT_TEST(rcu_gpt_stdhash_5_3)
-            CPPUNIT_TEST(rcu_gpt_stdhash_5_3_stat)
-            CPPUNIT_TEST(rcu_gpt_hash128)
-            CPPUNIT_TEST(rcu_gpt_hash128_stat)
-            CPPUNIT_TEST(rcu_gpt_hash128_4_3)
-            CPPUNIT_TEST(rcu_gpt_hash128_4_3_stat)
-
-            CPPUNIT_TEST(rcu_shb_nohash)
-            CPPUNIT_TEST(rcu_shb_nohash_stat)
-            CPPUNIT_TEST(rcu_shb_nohash_5_3)
-            CPPUNIT_TEST(rcu_shb_nohash_5_3_stat)
-            CPPUNIT_TEST(rcu_shb_stdhash)
-            CPPUNIT_TEST(rcu_shb_stdhash_stat)
-            CPPUNIT_TEST(rcu_shb_stdhash_5_3)
-            CPPUNIT_TEST(rcu_shb_stdhash_5_3_stat)
-            CPPUNIT_TEST(rcu_shb_hash128)
-            CPPUNIT_TEST(rcu_shb_hash128_stat)
-            CPPUNIT_TEST(rcu_shb_hash128_4_3)
-            CPPUNIT_TEST(rcu_shb_hash128_4_3_stat)
-
-            CPPUNIT_TEST(rcu_sht_nohash)
-            CPPUNIT_TEST(rcu_sht_nohash_stat)
-            CPPUNIT_TEST(rcu_sht_nohash_5_3)
-            CPPUNIT_TEST(rcu_sht_nohash_5_3_stat)
-            CPPUNIT_TEST(rcu_sht_stdhash)
-            CPPUNIT_TEST(rcu_sht_stdhash_stat)
-            CPPUNIT_TEST(rcu_sht_stdhash_5_3)
-            CPPUNIT_TEST(rcu_sht_stdhash_5_3_stat)
-            CPPUNIT_TEST(rcu_sht_hash128)
-            CPPUNIT_TEST(rcu_sht_hash128_stat)
-            CPPUNIT_TEST(rcu_sht_hash128_4_3)
-            CPPUNIT_TEST(rcu_sht_hash128_4_3_stat)
-
-        CPPUNIT_TEST_SUITE_END()
-
-    };
-} // namespace set
-
-#endif // #ifndef CDSTEST_HDR_INTRUSIVE_FELDMAN_HASHSET_H