Split up set2 unit test to reduce compiling time and memory
authorkhizmax <khizmax@gmail.com>
Mon, 6 Apr 2015 15:29:49 +0000 (18:29 +0300)
committerkhizmax <khizmax@gmail.com>
Mon, 6 Apr 2015 15:29:49 +0000 (18:29 +0300)
100 files changed:
cds/container/cuckoo_map.h
cds/container/cuckoo_set.h
cds/container/details/cuckoo_base.h
cds/container/details/ellen_bintree_base.h
cds/container/details/michael_map_base.h
cds/container/details/michael_set_base.h
cds/container/details/skip_list_base.h
cds/container/details/split_list_base.h
cds/container/ellen_bintree_map_rcu.h
cds/container/ellen_bintree_set_rcu.h
cds/container/impl/ellen_bintree_map.h
cds/container/impl/ellen_bintree_set.h
cds/container/impl/skip_list_map.h
cds/container/impl/skip_list_set.h
cds/container/michael_map.h
cds/container/michael_map_nogc.h
cds/container/michael_map_rcu.h
cds/container/michael_set.h
cds/container/michael_set_nogc.h
cds/container/michael_set_rcu.h
cds/container/skip_list_map_nogc.h
cds/container/skip_list_map_rcu.h
cds/container/skip_list_set_nogc.h
cds/container/skip_list_set_rcu.h
cds/container/split_list_map.h
cds/container/split_list_map_nogc.h
cds/container/split_list_map_rcu.h
cds/container/split_list_set.h
cds/container/split_list_set_nogc.h
cds/container/split_list_set_rcu.h
cds/container/striped_map.h
cds/container/striped_set.h
cds/container/striped_set/adapter.h
cds/intrusive/cuckoo_set.h
cds/intrusive/details/ellen_bintree_base.h
cds/intrusive/details/michael_set_base.h
cds/intrusive/details/skip_list_base.h
cds/intrusive/details/split_list_base.h
cds/intrusive/ellen_bintree_rcu.h
cds/intrusive/impl/ellen_bintree.h
cds/intrusive/impl/skip_list.h
cds/intrusive/michael_set.h
cds/intrusive/michael_set_nogc.h
cds/intrusive/michael_set_rcu.h
cds/intrusive/skip_list_nogc.h
cds/intrusive/skip_list_rcu.h
cds/intrusive/split_list.h
cds/intrusive/split_list_nogc.h
cds/intrusive/split_list_rcu.h
cds/intrusive/striped_set.h
cds/intrusive/striped_set/adapter.h
projects/Win/vc12/cds.sln
tests/cppunit/cppunit_mini.h
tests/unit/set2/set_defs.h
tests/unit/set2/set_delodd.h
tests/unit/set2/set_delodd_cuckoo.cpp
tests/unit/set2/set_delodd_ellentree.cpp
tests/unit/set2/set_delodd_michael.cpp
tests/unit/set2/set_delodd_skip.cpp
tests/unit/set2/set_delodd_split.cpp
tests/unit/set2/set_insdel_func.cpp
tests/unit/set2/set_insdel_func.h
tests/unit/set2/set_insdel_func_cuckoo.cpp
tests/unit/set2/set_insdel_func_ellentree.cpp
tests/unit/set2/set_insdel_func_refinable.cpp
tests/unit/set2/set_insdel_func_skip.cpp
tests/unit/set2/set_insdel_func_split.cpp
tests/unit/set2/set_insdel_func_striped.cpp
tests/unit/set2/set_insdel_string.h
tests/unit/set2/set_insdel_string_cuckoo.cpp
tests/unit/set2/set_insdel_string_ellentree.cpp
tests/unit/set2/set_insdel_string_michael.cpp
tests/unit/set2/set_insdel_string_refinable.cpp
tests/unit/set2/set_insdel_string_skip.cpp
tests/unit/set2/set_insdel_string_split.cpp
tests/unit/set2/set_insdel_string_std.cpp
tests/unit/set2/set_insdel_string_striped.cpp
tests/unit/set2/set_insdelfind.cpp
tests/unit/set2/set_insdelfind.h
tests/unit/set2/set_insdelfind_cuckoo.cpp
tests/unit/set2/set_insdelfind_ellentree.cpp
tests/unit/set2/set_insdelfind_michael.cpp
tests/unit/set2/set_insdelfind_refinable.cpp
tests/unit/set2/set_insdelfind_skip.cpp
tests/unit/set2/set_insdelfind_split.cpp
tests/unit/set2/set_insdelfind_std.cpp
tests/unit/set2/set_insdelfind_striped.cpp
tests/unit/set2/set_type.h [new file with mode: 0644]
tests/unit/set2/set_type_cuckoo.h [new file with mode: 0644]
tests/unit/set2/set_type_ellen_bintree.h [new file with mode: 0644]
tests/unit/set2/set_type_lazy_list.h [new file with mode: 0644]
tests/unit/set2/set_type_michael.h [new file with mode: 0644]
tests/unit/set2/set_type_michael_list.h [new file with mode: 0644]
tests/unit/set2/set_type_skip_list.h [new file with mode: 0644]
tests/unit/set2/set_type_split_list.h [new file with mode: 0644]
tests/unit/set2/set_type_std.h [new file with mode: 0644]
tests/unit/set2/set_type_striped.h [new file with mode: 0644]
tests/unit/set2/set_types.h [deleted file]
tests/unit/set2/std_hash_set.h [deleted file]
tests/unit/set2/std_set.h [deleted file]

index d98a22bf8757d5ad32b937dd17830a377c127d73..b5204ffdb6f9dc8652739f4e10b965ac2a55b561 100644 (file)
@@ -267,6 +267,10 @@ namespace cds { namespace container {
         /// item counter type
         typedef typename traits::item_counter  item_counter;
 
+        //@cond
+        typedef cds::container::cuckoo::implementation_tag implementation_tag;
+        //@endcond
+
     protected:
         //@cond
         typedef typename base_class::scoped_cell_lock   scoped_cell_lock;
@@ -724,7 +728,6 @@ namespace cds { namespace container {
         {
             return base_class::mutex_policy_statistics();
         }
-
     };
 }}  // namespace cds::container
 
index b2554a58bf248300c66c832f3b7cbc4c209706f9..1142cce7dc9bba7283ddca5fc742309121b36af7 100644 (file)
@@ -345,6 +345,10 @@ namespace cds { namespace container {
         /// item counter type
         typedef typename traits::item_counter  item_counter;
 
+        //@cond
+        typedef cds::container::cuckoo::implementation_tag implementation_tag;
+        //@endcond
+
     protected:
         //@cond
         typedef typename base_class::value_type         node_type;
@@ -824,7 +828,6 @@ namespace cds { namespace container {
         {
             return base_class::mutex_policy_statistics();
         }
-
     };
 
 }} // namespace cds::container
index bf2dcafad1f9f01d66a7af9f0899592b369eba00..34f07a2e7a570ad2963f9214e3e8f05b47dc09c5 100644 (file)
@@ -11,6 +11,7 @@ namespace cds { namespace container {
     /** @ingroup cds_nonintrusive_helper
     */
     namespace cuckoo {
+        using cds::intrusive::cuckoo::implementation_tag;
 
 #ifdef CDS_DOXYGEN_INVOKED
         /// Lock striping concurrent access policy. This is typedef for intrusive::cuckoo::striping template
index a8e847eda75ec4268abe24c5e2a8d32c3bdee081..3be1c584c41635c525c480985671d23c2910d418 100644 (file)
@@ -14,6 +14,8 @@ namespace cds { namespace container {
     /** @ingroup cds_nonintrusive_helper
     */
     namespace ellen_bintree {
+        using cds::intrusive::ellen_bintree::implementation_tag;
+
 
 #ifdef CDS_DOXYGEN_INVOKED
         /// Typedef for \p cds::intrusive::ellen_bintree::update_desc
index 2db6378840a052cdaec9b4ce1222d0a42f2d89eb..86ebcc1e41de6c29a27d3295204eea730e5e20ae 100644 (file)
@@ -11,6 +11,8 @@ namespace cds { namespace container {
     /** @ingroup cds_nonintrusive_helper
     */
     namespace michael_map {
+        using cds::intrusive::michael_set::implementation_tag;
+
         /// \p MichaelHashMap traits
         typedef container::michael_set::traits  traits;
 
index bef183bd0fe870715733523bc7eb077f5b2fe8dd..2ab920126d91924b45cfaf39177c651bafe55cbb 100644 (file)
@@ -11,6 +11,7 @@ namespace cds { namespace container {
     /** @ingroup cds_nonintrusive_helper
     */
     namespace michael_set {
+        using cds::intrusive::michael_set::implementation_tag;
 
         /// MichaelHashSet traits
         typedef cds::intrusive::michael_set::traits  traits;
index d90aa426e62d26260be95c5376171cfe082699ae..609e96b743272c4584019c66a78a08bf9ea66cdc 100644 (file)
@@ -12,6 +12,7 @@ namespace cds { namespace container {
     /** @ingroup cds_nonintrusive_helper
     */
     namespace skip_list {
+        using cds::intrusive::skip_list::implementation_tag;
 
         /// Option specifying random level generator
         template <typename Type>
index 38281da792a67b1ef03df5bde94c0f4e2757c9d3..3e7d62f760cf5123ed7bbf5051b130e8b9764a88 100644 (file)
@@ -14,6 +14,8 @@ namespace cds { namespace container {
     /** @ingroup cds_nonintrusive_helper
     */
     namespace split_list {
+        using cds::intrusive::split_list::implementation_tag;
+
         /// Internal statistics, see \p cds::intrusive::split_list::stat
         template <typename Counter = cds::intrusive::split_list::stat<>::counter_type >
         using stat = cds::intrusive::split_list::stat<Counter>;
index d9c3e918186815c33299b079bc9367ede9e94556..3d43f614401ab0fd490f3fda73dc099d2c2982b5 100644 (file)
@@ -88,13 +88,16 @@ namespace cds { namespace container {
         typedef typename traits::copy_policy                copy_policy;        ///< key copy policy
         typedef typename traits::back_off                   back_off;           ///< Back-off strategy
 
-
         typedef typename traits::allocator                  allocator_type;        ///< Allocator for leaf nodes
         typedef typename base_class::node_allocator         node_allocator;        ///< Internal node allocator
         typedef typename base_class::update_desc_allocator  update_desc_allocator; ///< Update descriptor allocator
 
         static CDS_CONSTEXPR const bool c_bExtractLockExternal = base_class::c_bExtractLockExternal; ///< Group of \p extract_xxx functions do not require external locking
 
+        //@cond
+        typedef cds::container::ellen_bintree::implementation_tag implementation_tag;
+        //@endcond
+
     protected:
         //@cond
         typedef typename base_class::value_type         leaf_node;
index eaa413552bb91ad05b92f1c100e1b5e4d38c25f0..ecf292b2da0b2f7e6b987ba4072e24bf50def86d 100644 (file)
@@ -133,6 +133,10 @@ namespace cds { namespace container {
 
         static CDS_CONSTEXPR const bool c_bExtractLockExternal = base_class::c_bExtractLockExternal; ///< Group of \p extract_xxx functions do not require external locking
 
+        //@cond
+        typedef cds::container::ellen_bintree::implementation_tag implementation_tag;
+        //@endcond
+
     protected:
         //@cond
         typedef typename maker::cxx_leaf_node_allocator cxx_leaf_node_allocator;
index 4dd23590abfd9b6cc047933b882504711d4a9258..1c8a3a0156cad13e3077053f088c36481cfc24b3 100644 (file)
@@ -98,6 +98,10 @@ namespace cds { namespace container {
         typedef typename base_class::node_allocator         node_allocator;   ///< Internal node allocator
         typedef typename base_class::update_desc_allocator  update_desc_allocator; ///< Update descriptor allocator
 
+        //@cond
+        typedef cds::container::ellen_bintree::implementation_tag implementation_tag;
+        //@endcond
+
     protected:
         //@cond
         typedef typename base_class::value_type         leaf_node;
index 363f32b4cc99afb8a8c02e30a51a5f3cb4af6cf6..3eebc06d41156c0aef61886515d64b15a37eaa37 100644 (file)
@@ -135,6 +135,10 @@ namespace cds { namespace container {
         typedef typename base_class::node_allocator         node_allocator;   ///< Internal node allocator
         typedef typename base_class::update_desc_allocator  update_desc_allocator; ///< Update descriptor allocator
 
+        //@cond
+        typedef cds::container::ellen_bintree::implementation_tag implementation_tag;
+        //@endcond
+
     protected:
         //@cond
         typedef typename maker::cxx_leaf_node_allocator cxx_leaf_node_allocator;
index 6bae373b2a383699f67d5927bc37c3063d106f00..29987199b56bae2274965d38ffb1edf3c3a76ee7 100644 (file)
@@ -134,6 +134,10 @@ namespace cds { namespace container {
         typedef typename traits::random_level_generator random_level_generator ; ///< random level generator
         typedef typename traits::stat              stat;           ///< internal statistics type
 
+        //@cond
+        typedef cds::container::skip_list::implementation_tag implementation_tag;
+        //@endcond
+
     protected:
         //@cond
         typedef typename maker::node_type           node_type;
index 66a100cf2d543d91c6bc01f535f514e1715ddbe7..0935780b0ddcffe81ca780c623ffa4f5023f6835 100644 (file)
@@ -124,6 +124,10 @@ namespace cds { namespace container {
         typedef typename traits::random_level_generator random_level_generator; ///< random level generator
         typedef typename traits::stat             stat;           ///< internal statistics type
 
+        //@cond
+        typedef cds::container::skip_list::implementation_tag implementation_tag;
+        //@endcond
+
     protected:
         //@cond
         typedef typename maker::node_type           node_type;
index 899e01573838758eee3b028b975ea5924e99e587..7e3c8e635157260181b877781fd5556d593227c4 100644 (file)
@@ -178,6 +178,10 @@ namespace cds { namespace container {
         typedef cds::details::Allocator< bucket_type, typename traits::allocator >  bucket_table_allocator;
         typedef typename bucket_type::guarded_ptr  guarded_ptr; ///< Guarded pointer
 
+        //@cond
+        typedef cds::container::michael_map::implementation_tag implementation_tag;
+        //@endcond
+
     protected:
         item_counter    m_ItemCounter; ///< Item counter
         hash            m_HashFunctor; ///< Hash functor
index fedfc1cb0f6edc4c5ea122aa52c023cca72fe01a..a85dd62ddf65f2c364b507e23c7331fd2d590cf9 100644 (file)
@@ -46,6 +46,10 @@ namespace cds { namespace container {
         /// Bucket table allocator
         typedef cds::details::Allocator< bucket_type, typename traits::allocator >  bucket_table_allocator;
 
+        //@cond
+        typedef cds::container::michael_map::implementation_tag implementation_tag;
+        //@endcond
+
     protected:
         //@cond
         typedef typename bucket_type::iterator       bucket_iterator;
index c86aaad2a0b453e92299411d08c74e51712135c8..34e53c32d1866163fe383bd2306a8a719aa953bc 100644 (file)
@@ -75,6 +75,10 @@ namespace cds { namespace container {
         /// Group of \p extract_xxx functions require external locking if underlying ordered list requires that
         static CDS_CONSTEXPR const bool c_bExtractLockExternal = bucket_type::c_bExtractLockExternal;
 
+        //@cond
+        typedef cds::container::michael_map::implementation_tag implementation_tag;
+        //@endcond
+
     protected:
         item_counter    m_ItemCounter; ///< Item counter
         hash            m_HashFunctor; ///< Hash functor
index 80c5a694307c4ff869d28cf0562b9b4bc9494e86..ce639de769814c138a987ba531987edf259c03d0 100644 (file)
@@ -195,6 +195,10 @@ namespace cds { namespace container {
 
         typedef typename bucket_type::guarded_ptr  guarded_ptr; ///< Guarded pointer
 
+        //@cond
+        typedef cds::container::michael_set::implementation_tag implementation_tag;
+        //@endcond
+
     protected:
         item_counter    m_ItemCounter; ///< Item counter
         hash            m_HashFunctor; ///< Hash functor
index 28aa3cc17b3d01af78702adfe61925a4cf77a33d..b1cc933243cb583735ebc2843d2d2907ec09773f 100644 (file)
@@ -45,6 +45,10 @@ namespace cds { namespace container {
         /// Bucket table allocator
         typedef cds::details::Allocator< bucket_type, typename traits::allocator >  bucket_table_allocator;
 
+        //@cond
+        typedef cds::container::michael_set::implementation_tag implementation_tag;
+        //@endcond
+
     protected:
         //@cond
         typedef typename bucket_type::iterator        bucket_iterator;
index 86da400d4dc38c05bf7b4ca3018c712b1c269697..3bf12d8c41827bdc34115b1530b8ab89ffb80aed 100644 (file)
@@ -126,6 +126,10 @@ namespace cds { namespace container {
         /// Group of \p extract_xxx functions require external locking if underlying ordered list requires that
         static CDS_CONSTEXPR const bool c_bExtractLockExternal = bucket_type::c_bExtractLockExternal;
 
+        //@cond
+        typedef cds::container::michael_set::implementation_tag implementation_tag;
+        //@endcond
+
     protected:
         item_counter    m_ItemCounter; ///< Item counter
         hash            m_HashFunctor; ///< Hash functor
index ffa37b53ebc983bdd1530120e0c74e23e6f16e45..57e1c5ad734ed1ac53456e3a6a668b1ee12673ca 100644 (file)
@@ -77,6 +77,10 @@ namespace cds { namespace container {
         typedef typename base_class::stat           stat;           ///< internal statistics type
         typedef typename base_class::random_level_generator random_level_generator; ///< random level generator
 
+        //@cond
+        typedef cds::container::skip_list::implementation_tag implementation_tag;
+        //@endcond
+
     protected:
         //@cond
         typedef typename base_class::node_type      node_type;
index 53bcf34447a23ad406bdb73396b3d4939b92b5b4..c5abe34aa234f448381206b3b2faa389d57bf93d 100644 (file)
@@ -124,6 +124,10 @@ namespace cds { namespace container {
         typedef typename traits::random_level_generator random_level_generator; ///< random level generator
         typedef typename traits::stat               stat;   ///< internal statistics type
 
+        //@cond
+        typedef cds::container::skip_list::implementation_tag implementation_tag;
+        //@endcond
+
     protected:
         //@cond
         typedef typename maker::node_type           node_type;
index a052ae1a8a1822b738838403696f26fc3decb5e1..24f8171b31a330443bff61fb0daf3899f97ff5bf 100644 (file)
@@ -157,6 +157,10 @@ namespace cds { namespace container {
         typedef typename options::stat              stat            ;   ///< internal statistics type
         typedef typename base_class::random_level_generator random_level_generator  ;   ///< random level generator
 
+        //@cond
+        typedef cds::container::skip_list::implementation_tag implementation_tag;
+        //@endcond
+
     protected:
         //@cond
         typedef typename maker::node_type           node_type;
index fb50c9d06b65fb5cfa1026b7484bcde55b7d6088..e57a803673fde31a7f46c76b329fc88393b3db6a 100644 (file)
@@ -171,6 +171,10 @@ namespace cds { namespace container {
         typedef typename traits::stat              stat            ;   ///< internal statistics type
         typedef typename traits::rcu_check_deadlock    rcu_check_deadlock ; ///< Deadlock checking policy
 
+        //@cond
+        typedef cds::container::skip_list::implementation_tag implementation_tag;
+        //@endcond
+
     protected:
         //@cond
         typedef typename maker::node_type           node_type;
index 46f3a9364b3aca09527b8eb5af0dd4dd6082d8cd..664cc7ae4fe79d7fd2970c5445781ea5b99b10c2 100644 (file)
@@ -137,6 +137,10 @@ namespace cds { namespace container {
         typedef typename base_class::item_counter   item_counter; ///< Item counter type
         typedef typename base_class::stat           stat;         ///< Internal statistics
 
+        //@cond
+        typedef cds::container::split_list::implementation_tag implementation_tag;
+        //@endcond
+
     protected:
         //@cond
         typedef typename base_class::maker::traits::key_accessor key_accessor;
index 6022573167fd5e12ad74f66e31914f6ac74da62e..dd5624aa4adf1b14505b3605432d74f4233d1828 100644 (file)
@@ -58,6 +58,10 @@ namespace cds { namespace container {
         typedef typename base_class::item_counter   item_counter; ///< Item counter type
         typedef typename base_class::stat           stat;         ///< Internal statistics
 
+        //@cond
+        typedef cds::container::split_list::implementation_tag implementation_tag;
+        //@endcond
+
     protected:
         //@cond
         typedef typename base_class::traits::key_accessor key_accessor;
index bb84fb2c10f6ac498162f9a0df9fc5daa16b9420..ed3c5899c3e01923779bb534d0c29e3c0e959fa7 100644 (file)
@@ -179,6 +179,10 @@ namespace cds { namespace container {
         /// Group of \p extract_xxx functions require external locking if underlying ordered list requires that
         static CDS_CONSTEXPR const bool c_bExtractLockExternal = base_class::c_bExtractLockExternal;
 
+        //@cond
+        typedef cds::container::split_list::implementation_tag implementation_tag;
+        //@endcond
+
     protected:
         //@cond
         typedef typename base_class::maker::traits::key_accessor key_accessor;
index 62028126e3c0162f99f22b128764ef9be4d7ca49..5c0ecaa77f8011b28facb47c3f6a6e7c2829e5c5 100644 (file)
@@ -152,6 +152,10 @@ namespace cds { namespace container {
         typedef typename base_class::item_counter item_counter; ///< Item counter type
         typedef typename base_class::stat         stat; ///< Internal statistics
 
+        //@cond
+        typedef cds::container::split_list::implementation_tag implementation_tag;
+        //@endcond
+
     protected:
         //@cond
         typedef typename maker::cxx_node_allocator    cxx_node_allocator;
index 6da1853595c468fffdd5fb898a662a036afa2289..34c4b56a5cffb7bd9c0fa7eb6c4649c5878cf88e 100644 (file)
@@ -58,6 +58,10 @@ namespace cds { namespace container {
         typedef typename base_class::item_counter   item_counter; ///< Item counter type
         typedef typename base_class::stat           stat; ///< Internal statistics
 
+        //@cond
+        typedef cds::container::split_list::implementation_tag implementation_tag;
+        //@endcond
+
     protected:
         //@cond
         typedef typename maker::cxx_node_allocator    cxx_node_allocator;
index f70a8884a61f116cd89dbec0b45f1a56d8d2da64..f6caeb73e052357101bd7605af7f044eb87acdb1 100644 (file)
@@ -5,6 +5,7 @@
 
 #include <cds/intrusive/split_list_rcu.h>
 #include <cds/container/details/make_split_list_set.h>
+#include <cds/urcu/exempt_ptr.h>
 
 namespace cds { namespace container {
 
@@ -192,6 +193,10 @@ namespace cds { namespace container {
         /// Group of \p extract_xxx functions require external locking if underlying ordered list requires that
         static CDS_CONSTEXPR const bool c_bExtractLockExternal = base_class::c_bExtractLockExternal;
 
+        //@cond
+        typedef cds::container::split_list::implementation_tag implementation_tag;
+        //@endcond
+
     protected:
         //@cond
         typedef typename maker::cxx_node_allocator    cxx_node_allocator;
index e66435af95cc36bdc5627310b62b5ced2533348d..17864e1b3b779354a8179e634244ff7f06a5bf98 100644 (file)
@@ -491,6 +491,9 @@ template <class Container, typename... Options>
         typedef typename base_class::allocator_type     allocator_type  ; ///< allocator type specified in options.
         typedef typename base_class::mutex_policy       mutex_policy    ; ///< Mutex policy
 
+        //@cond
+        typedef cds::container::striped_set::implementation_tag implementation_tag;
+        //@endcond
     protected:
         //@cond
         typedef typename base_class::scoped_cell_lock   scoped_cell_lock;
index c18284587342d314eb64dba8d37f8999970c1fbb..af53836ac2873e51f89b9a1aac5996848fb549ed 100644 (file)
@@ -482,6 +482,10 @@ namespace cds { namespace container {
         typedef typename base_class::allocator_type     allocator_type  ; ///< allocator type specified in options.
         typedef typename base_class::mutex_policy       mutex_policy    ; ///< Mutex policy
 
+        //@cond
+        typedef cds::container::striped_set::implementation_tag implementation_tag;
+        //@endcond
+
     protected:
         //@cond
         typedef typename base_class::scoped_cell_lock   scoped_cell_lock;
index 52367e7d0cd0ed0d353aa1fc7f4e6aac57708bc4..f4f56b8d46111874351b81cb1c470de07d190f76 100644 (file)
@@ -9,6 +9,7 @@
 namespace cds { namespace container {
     /// Striped hash set related definitions
     namespace striped_set {
+        using cds::intrusive::striped_set::implementation_tag;
 
         //@cond
         struct copy_item    ;   // copy_item_policy tag
index 0fc53d7bc4d6366e891368f60c05d7d03fd925cd..be873686ec86b19a869ee448468b006370c282af 100644 (file)
@@ -19,6 +19,9 @@ namespace cds { namespace intrusive {
 
     /// CuckooSet-related definitions
     namespace cuckoo {
+        //@cond
+        struct implementation_tag;
+        //@endcond
 
         /// Option to define probeset type
         /**
@@ -1888,6 +1891,9 @@ namespace cds { namespace intrusive {
         /// node disposer
         typedef typename traits::disposer      disposer;
 
+        //@cond
+        typedef cds::intrusive::cuckoo::implementation_tag implementation_tag;
+        //@endcond
     protected:
         //@cond
         typedef typename node_type::probeset_class  probeset_class;
index d80e5432394e66a78090889af2ca581a405d43cf..54e928b768f13fdc537eb2d5e5ef039cf4469e26 100644 (file)
@@ -13,6 +13,7 @@ namespace cds { namespace intrusive {
 
     /// EllenBinTree related declarations
     namespace ellen_bintree {
+        struct implementation_tag;
 
         //Forwards
         template <class GC> struct base_node;
index aa2a3d450402f74e29e331ef8965cee0676274d1..4818a9ca3c6577106b85b9d0a9619e8db823e4fa 100644 (file)
@@ -16,6 +16,10 @@ namespace cds { namespace intrusive {
     */
     namespace michael_set {
 
+        //@cond
+        struct implementation_tag;
+        //@endcond
+
         /// MichaelHashSet traits
         struct traits {
             /// Hash function
@@ -190,7 +194,7 @@ namespace cds { namespace intrusive {
             };
         }
         //@endcond
-    }
+    } // namespace michael_set
 
     //@cond
     // Forward declarations
index ec4ec45ded16eac7b2bb47d8a18fbb26ba1aaae3..be70fc1bd356dc46c69e3cd4ba456ad1e2ca37e0 100644 (file)
@@ -14,6 +14,9 @@ namespace cds { namespace intrusive {
     /** @ingroup cds_intrusive_helper
     */
     namespace skip_list {
+        //@cond
+        struct implementation_tag;
+        //@endcond
 
         /// The maximum possible height of any skip-list
         static unsigned int const c_nHeightLimit = 32;
index 2a57468e01c518b9df6373cba5e0a5b05a2a4825..cef83734e697fa87d5b4094ec671eb41d288fcc9 100644 (file)
@@ -15,6 +15,10 @@ namespace cds { namespace intrusive {
     /** @ingroup cds_intrusive_helper
     */
     namespace split_list {
+        //@cond
+        struct implementation_tag;
+        //@endcond
+
         /// Split-ordered list node
         /**
             Template parameter:
@@ -871,7 +875,7 @@ namespace cds { namespace intrusive {
         }
         //@endcond
 
-    }   // namespace split_list
+    } // namespace split_list
 
     //@cond
     // Forward declaration
index 45dc686f7502d46427ac73c8c731730e4221ffc4..0515bb995c0bb61e7ba9da40744060c4f6eea2ee 100644 (file)
@@ -438,6 +438,10 @@ namespace cds { namespace intrusive {
         typedef typename traits::disposer disposer;   ///< leaf node disposer
         typedef typename traits::back_off back_off;   ///< back-off strategy
 
+        //@cond
+        typedef cds::intrusive::ellen_bintree::implementation_tag implementation_tag;
+        //@endcond
+
     protected:
         //@cond
         typedef ellen_bintree::base_node< gc >                      tree_node; ///< Base type of tree node
index b250a7de5dfac7586f0b7d05feb3f0301895abd0..a6fcd1a216099fd8e5d4903efe8d5547be436e0b 100644 (file)
@@ -120,6 +120,10 @@ namespace cds { namespace intrusive {
 
         typedef typename gc::template guarded_ptr< value_type > guarded_ptr; ///< Guarded pointer
 
+        //@cond
+        typedef cds::intrusive::ellen_bintree::implementation_tag implementation_tag;
+        //@endcond
+
     protected:
         //@cond
         typedef ellen_bintree::base_node< gc >            tree_node; ///< Base type of tree node
index e57ff42502bbb620a7ff338c3f1469f29921f9b9..9abad6f5dec3dfdd3542a9d64e69b4b4fa93153e 100644 (file)
@@ -345,6 +345,9 @@ namespace cds { namespace intrusive {
         typedef typename traits::back_off      back_off;   ///< Back-off strategy
         typedef typename traits::stat          stat;       ///< internal statistics type
 
+        //@cond
+        typedef cds::intrusive::skip_list::implementation_tag implementation_tag;
+        //@endcond
     public:
         typedef typename gc::template guarded_ptr< value_type > guarded_ptr; ///< Guarded pointer
 
index 48e9c1b7e65950945026f4760f4692e74af94976..3f7944fcef00ac069d5216ac344245db02460676 100644 (file)
@@ -236,6 +236,10 @@ namespace cds { namespace intrusive {
         /// Bucket table allocator
         typedef cds::details::Allocator< bucket_type, typename traits::allocator > bucket_table_allocator;
 
+        //@cond
+        typedef cds::intrusive::michael_set::implementation_tag implementation_tag;
+        //@endcond
+
     protected:
         item_counter    m_ItemCounter;   ///< Item counter
         hash            m_HashFunctor;   ///< Hash functor
index d2cc7fa2202f1d443e42b7448dbc6c18d41a8019..f64ec3f6a623fe8eceefffc317754377f527ac22 100644 (file)
@@ -46,6 +46,10 @@ namespace cds { namespace intrusive {
         /// Bucket table allocator
         typedef cds::details::Allocator< bucket_type, typename traits::allocator > bucket_table_allocator;
 
+        //@cond
+        typedef cds::intrusive::michael_set::implementation_tag implementation_tag;
+        //@endcond
+
     protected:
         item_counter    m_ItemCounter; ///< Item counter
         hash            m_HashFunctor; ///< Hash functor
index 7a200fde94731ac4b27077103de8696759bea49f..757850212f820578aefc62f8adf029f713597020 100644 (file)
@@ -94,6 +94,10 @@ namespace cds { namespace intrusive {
         /// Group of \p extract_xxx functions require external locking if underlying ordered list requires that
         static CDS_CONSTEXPR const bool c_bExtractLockExternal = bucket_type::c_bExtractLockExternal;
 
+        //@cond
+        typedef cds::intrusive::michael_set::implementation_tag implementation_tag;
+        //@endcond
+
     protected:
         item_counter    m_ItemCounter;   ///< Item counter
         hash            m_HashFunctor;   ///< Hash functor
index c72de416eeb2be74280abe47e7cde079004c974e..6a8f4c3f702b9a21a7f4d8bb004e64c117c1ae1e 100644 (file)
@@ -363,6 +363,7 @@ namespace cds { namespace intrusive {
 
         //@cond
         static unsigned int const c_nMinHeight = 3;
+        typedef cds::intrusive::skip_list::implementation_tag implementation_tag;
         //@endcond
 
     protected:
index 6153b559e29c8468eef86914520cc4f3d9e78cee..9655545ab3b67d2491cccbb601013414af5998ff 100644 (file)
@@ -532,6 +532,7 @@ namespace cds { namespace intrusive {
 
         //@cond
         static unsigned int const c_nMinHeight = 5;
+        typedef cds::intrusive::skip_list::implementation_tag implementation_tag;
         //@endcond
 
     protected:
index 782b59b8db17db6b59d0b0d35119c057557c6a4f..933c99438beac677d4fd3fe30f5300f9f1fc9781 100644 (file)
@@ -195,6 +195,10 @@ namespace cds { namespace intrusive {
         typedef GC     gc;     ///< Garbage collector
         typedef Traits traits; ///< Set traits
 
+        //@cond
+        typedef cds::intrusive::split_list::implementation_tag implementation_tag;
+        //@endcond
+
     protected:
         //@cond
         typedef split_list::details::rebind_list_traits<OrderedList, traits> wrapped_ordered_list;
index 195f63dc2550b32c5ecc5596b42a753bdd19c26b..04994be5efbd0de16c4a31b0f7cbf1b81d2785cd 100644 (file)
@@ -37,6 +37,10 @@ namespace cds { namespace intrusive {
         /// Hash functor for \p value_type and all its derivatives that you use
         typedef typename cds::opt::v::hash_selector< typename traits::hash >::type   hash;
 
+        //@cond
+        typedef cds::intrusive::split_list::implementation_tag implementation_tag;
+        //@endcond
+
     protected:
         //@cond
         typedef split_list::details::rebind_list_traits<OrderedList, traits> wrapped_ordered_list;
index 6ca39c321dc51e1bffc9538b1535f8d7c9238341..70f9ff3f1cbfca57fbf1667796d3ad41c2c36b4f 100644 (file)
@@ -68,6 +68,10 @@ namespace cds { namespace intrusive {
         /// Hash functor for \ref value_type and all its derivatives that you use
         typedef typename cds::opt::v::hash_selector< typename traits::hash >::type   hash;
 
+        //@cond
+        typedef cds::intrusive::split_list::implementation_tag implementation_tag;
+        //@endcond
+
     protected:
         //@cond
         typedef split_list::details::rebind_list_traits<OrderedList, traits> wrapped_ordered_list;
index eba6dbf025d0a001e5a5153ba0a83eb86e8a354f..62c0799dee92fb17554d017359d35adb995015ce 100644 (file)
@@ -296,6 +296,10 @@ namespace cds { namespace intrusive {
 
         typedef cds::details::Allocator< bucket_type, allocator_type > bucket_allocator;  ///< bucket allocator type based on allocator_type
 
+        //@cond
+        typedef cds::intrusive::striped_set::implementation_tag implementation_tag;
+        //@endcond
+
     protected:
         bucket_type *   m_Buckets       ;   ///< Bucket table
         size_t          m_nBucketMask   ;   ///< Bucket table size - 1. m_nBucketMask + 1 should be power of two.
index 6c0436722a2333259462bcdb60332c2dc147a352..a34ab4f4c818d5fca24e664be0cbaf56662c2951 100644 (file)
@@ -12,6 +12,9 @@ namespace cds { namespace intrusive {
 
     /// StripedSet related definitions
     namespace striped_set {
+        //@cond
+        struct implementation_tag;
+        //@endcond
 
         /// Default adapter for intrusive striped/refinable hash set
         /**
index d731825b8189ba86d075f4c95be7d502aa5a1774..a6a447daff0d37f541685bd81f06ac02631c33d0 100644 (file)
@@ -14,6 +14,7 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "unit-test", "unit-test", "{
                ..\..\..\tests\unit\print_skip_list_stat.h = ..\..\..\tests\unit\print_skip_list_stat.h\r
                ..\..\..\tests\unit\print_split_list_stat.h = ..\..\..\tests\unit\print_split_list_stat.h\r
                ..\..\..\tests\unit\print_sync_monitor_stat.h = ..\..\..\tests\unit\print_sync_monitor_stat.h\r
+               ..\..\..\tests\unit\set2\set_type_cuckoo.h = ..\..\..\tests\unit\set2\set_type_cuckoo.h\r
        EndProjectSection\r
 EndProject\r
 Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "unit-prerequisites", "unit-prerequisites.vcxproj", "{61179F2F-07E1-490D-B64D-D85A90B6EF81}"\r
@@ -79,9 +80,16 @@ EndProject
 Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "set", "set", "{A64449B7-90FB-4E2B-A686-9EFC0E298644}"\r
        ProjectSection(SolutionItems) = preProject\r
                ..\..\..\tests\unit\set2\set_defs.h = ..\..\..\tests\unit\set2\set_defs.h\r
-               ..\..\..\tests\unit\set2\set_types.h = ..\..\..\tests\unit\set2\set_types.h\r
-               ..\..\..\tests\unit\set2\std_hash_set.h = ..\..\..\tests\unit\set2\std_hash_set.h\r
-               ..\..\..\tests\unit\set2\std_set.h = ..\..\..\tests\unit\set2\std_set.h\r
+               ..\..\..\tests\unit\set2\set_type.h = ..\..\..\tests\unit\set2\set_type.h\r
+               ..\..\..\tests\unit\set2\set_type_cuckoo.h = ..\..\..\tests\unit\set2\set_type_cuckoo.h\r
+               ..\..\..\tests\unit\set2\set_type_ellen_bintree.h = ..\..\..\tests\unit\set2\set_type_ellen_bintree.h\r
+               ..\..\..\tests\unit\set2\set_type_lazy_list.h = ..\..\..\tests\unit\set2\set_type_lazy_list.h\r
+               ..\..\..\tests\unit\set2\set_type_michael.h = ..\..\..\tests\unit\set2\set_type_michael.h\r
+               ..\..\..\tests\unit\set2\set_type_michael_list.h = ..\..\..\tests\unit\set2\set_type_michael_list.h\r
+               ..\..\..\tests\unit\set2\set_type_skip_list.h = ..\..\..\tests\unit\set2\set_type_skip_list.h\r
+               ..\..\..\tests\unit\set2\set_type_split_list.h = ..\..\..\tests\unit\set2\set_type_split_list.h\r
+               ..\..\..\tests\unit\set2\set_type_std.h = ..\..\..\tests\unit\set2\set_type_std.h\r
+               ..\..\..\tests\unit\set2\set_type_striped.h = ..\..\..\tests\unit\set2\set_type_striped.h\r
        EndProjectSection\r
 EndProject\r
 Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "unit-map-delodd", "unit-map-delodd.vcxproj", "{3C598F96-FB84-4D42-9B43-F697F53B0221}"\r
index 714b088391945273206652715506b15713468af5..e0a8507b81acd61d32a0b17ff4df9623cafafcc1 100644 (file)
@@ -277,6 +277,8 @@ namespace CppUnitMini
 #define CPPUNIT_TEST(X) CPPUNIT_TEST_BASE(X, false)
 #define CPPUNIT_EXPLICIT_TEST(X) CPPUNIT_TEST_BASE(X, true)
 
+#define CDSUNIT_DECLARE_TEST(X) void X();
+
 #define CPPUNIT_IGNORE \
   ignoring = true
 
index e57384efd7d91ce5f3556e04f33112a363f7806f..030eaa9e6b48cd894950b850f2a0c38ff02e4c75 100644 (file)
@@ -4,22 +4,37 @@
 #define CDSUNIT_SET_DEFS_H
 
 #define CDSUNIT_DECLARE_StdSet \
-    TEST_SET(StdSet_Spin) \
-    TEST_SET(StdHashSet_Spin)
+    CDSUNIT_DECLARE_TEST(StdSet_Spin) \
+    CDSUNIT_DECLARE_TEST(StdHashSet_Spin)
+
+#define CDSUNIT_DEFINE_StdSet(IMPL, C) \
+    TEST_SET(IMPL, C, StdSet_Spin) \
+    TEST_SET(IMPL, C, StdHashSet_Spin)
+
 #define CDSUNIT_TEST_StdSet \
     CPPUNIT_TEST(StdSet_Spin) \
     CPPUNIT_TEST(StdHashSet_Spin)
 
 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
 #   define CDSUNIT_DECLARE_MichaelSet_RCU_signal  \
-    TEST_SET_EXTRACT(MichaelSet_RCU_SHB_cmp_stdAlloc) \
-    TEST_SET_EXTRACT(MichaelSet_RCU_SHB_less_michaelAlloc) \
-    TEST_SET_EXTRACT(MichaelSet_RCU_SHT_cmp_stdAlloc) \
-    TEST_SET_EXTRACT(MichaelSet_RCU_SHT_less_michaelAlloc) \
-    TEST_SET_EXTRACT(MichaelSet_Lazy_RCU_SHB_cmp_stdAlloc) \
-    TEST_SET_EXTRACT(MichaelSet_Lazy_RCU_SHB_less_michaelAlloc) \
-    TEST_SET_EXTRACT(MichaelSet_Lazy_RCU_SHT_cmp_stdAlloc) \
-    TEST_SET_EXTRACT(MichaelSet_Lazy_RCU_SHT_less_michaelAlloc)
+    CDSUNIT_DECLARE_TEST(MichaelSet_RCU_SHB_cmp_stdAlloc) \
+    CDSUNIT_DECLARE_TEST(MichaelSet_RCU_SHB_less_michaelAlloc) \
+    CDSUNIT_DECLARE_TEST(MichaelSet_RCU_SHT_cmp_stdAlloc) \
+    CDSUNIT_DECLARE_TEST(MichaelSet_RCU_SHT_less_michaelAlloc) \
+    CDSUNIT_DECLARE_TEST(MichaelSet_Lazy_RCU_SHB_cmp_stdAlloc) \
+    CDSUNIT_DECLARE_TEST(MichaelSet_Lazy_RCU_SHB_less_michaelAlloc) \
+    CDSUNIT_DECLARE_TEST(MichaelSet_Lazy_RCU_SHT_cmp_stdAlloc) \
+    CDSUNIT_DECLARE_TEST(MichaelSet_Lazy_RCU_SHT_less_michaelAlloc)
+
+#   define CDSUNIT_DEFINE_MichaelSet_RCU_signal(IMPL, C )  \
+    TEST_SET_EXTRACT(IMPL, C, MichaelSet_RCU_SHB_cmp_stdAlloc) \
+    TEST_SET_EXTRACT(IMPL, C, MichaelSet_RCU_SHB_less_michaelAlloc) \
+    TEST_SET_EXTRACT(IMPL, C, MichaelSet_RCU_SHT_cmp_stdAlloc) \
+    TEST_SET_EXTRACT(IMPL, C, MichaelSet_RCU_SHT_less_michaelAlloc) \
+    TEST_SET_EXTRACT(IMPL, C, MichaelSet_Lazy_RCU_SHB_cmp_stdAlloc) \
+    TEST_SET_EXTRACT(IMPL, C, MichaelSet_Lazy_RCU_SHB_less_michaelAlloc) \
+    TEST_SET_EXTRACT(IMPL, C, MichaelSet_Lazy_RCU_SHT_cmp_stdAlloc) \
+    TEST_SET_EXTRACT(IMPL, C, MichaelSet_Lazy_RCU_SHT_less_michaelAlloc)
 
 #   define CDSUNIT_TEST_MichaelSet_RCU_signal  \
     CPPUNIT_TEST(MichaelSet_RCU_SHB_cmp_stdAlloc) \
     CPPUNIT_TEST(MichaelSet_Lazy_RCU_SHT_less_michaelAlloc)
 #else
 #   define CDSUNIT_DECLARE_MichaelSet_RCU_signal
+#   define CDSUNIT_DEFINE_MichaelSet_RCU_signal(IMPL, C )
 #   define CDSUNIT_TEST_MichaelSet_RCU_signal
 #endif
 
 
 #define CDSUNIT_DECLARE_MichaelSet  \
-    TEST_SET_EXTRACT(MichaelSet_HP_cmp_stdAlloc) \
-    TEST_SET_EXTRACT(MichaelSet_HP_less_michaelAlloc) \
-    TEST_SET_EXTRACT(MichaelSet_DHP_cmp_stdAlloc) \
-    TEST_SET_EXTRACT(MichaelSet_DHP_less_michaelAlloc) \
-    TEST_SET_EXTRACT(MichaelSet_RCU_GPI_cmp_stdAlloc) \
-    TEST_SET_EXTRACT(MichaelSet_RCU_GPI_less_michaelAlloc) \
-    TEST_SET_EXTRACT(MichaelSet_RCU_GPB_cmp_stdAlloc) \
-    TEST_SET_EXTRACT(MichaelSet_RCU_GPB_less_michaelAlloc) \
-    TEST_SET_EXTRACT(MichaelSet_RCU_GPT_cmp_stdAlloc) \
-    TEST_SET_EXTRACT(MichaelSet_RCU_GPT_less_michaelAlloc) \
-    TEST_SET_EXTRACT(MichaelSet_Lazy_HP_cmp_stdAlloc) \
-    TEST_SET_EXTRACT(MichaelSet_Lazy_HP_less_michaelAlloc) \
-    TEST_SET_EXTRACT(MichaelSet_Lazy_DHP_cmp_stdAlloc) \
-    TEST_SET_EXTRACT(MichaelSet_Lazy_DHP_less_michaelAlloc) \
-    TEST_SET_EXTRACT(MichaelSet_Lazy_RCU_GPI_cmp_stdAlloc) \
-    TEST_SET_EXTRACT(MichaelSet_Lazy_RCU_GPI_less_michaelAlloc) \
-    TEST_SET_EXTRACT(MichaelSet_Lazy_RCU_GPB_cmp_stdAlloc) \
-    TEST_SET_EXTRACT(MichaelSet_Lazy_RCU_GPB_less_michaelAlloc) \
-    TEST_SET_EXTRACT(MichaelSet_Lazy_RCU_GPT_cmp_stdAlloc) \
-    TEST_SET_EXTRACT(MichaelSet_Lazy_RCU_GPT_less_michaelAlloc) \
+    CDSUNIT_DECLARE_TEST(MichaelSet_HP_cmp_stdAlloc) \
+    CDSUNIT_DECLARE_TEST(MichaelSet_HP_less_michaelAlloc) \
+    CDSUNIT_DECLARE_TEST(MichaelSet_DHP_cmp_stdAlloc) \
+    CDSUNIT_DECLARE_TEST(MichaelSet_DHP_less_michaelAlloc) \
+    CDSUNIT_DECLARE_TEST(MichaelSet_RCU_GPI_cmp_stdAlloc) \
+    CDSUNIT_DECLARE_TEST(MichaelSet_RCU_GPI_less_michaelAlloc) \
+    CDSUNIT_DECLARE_TEST(MichaelSet_RCU_GPB_cmp_stdAlloc) \
+    CDSUNIT_DECLARE_TEST(MichaelSet_RCU_GPB_less_michaelAlloc) \
+    CDSUNIT_DECLARE_TEST(MichaelSet_RCU_GPT_cmp_stdAlloc) \
+    CDSUNIT_DECLARE_TEST(MichaelSet_RCU_GPT_less_michaelAlloc) \
+    CDSUNIT_DECLARE_TEST(MichaelSet_Lazy_HP_cmp_stdAlloc) \
+    CDSUNIT_DECLARE_TEST(MichaelSet_Lazy_HP_less_michaelAlloc) \
+    CDSUNIT_DECLARE_TEST(MichaelSet_Lazy_DHP_cmp_stdAlloc) \
+    CDSUNIT_DECLARE_TEST(MichaelSet_Lazy_DHP_less_michaelAlloc) \
+    CDSUNIT_DECLARE_TEST(MichaelSet_Lazy_RCU_GPI_cmp_stdAlloc) \
+    CDSUNIT_DECLARE_TEST(MichaelSet_Lazy_RCU_GPI_less_michaelAlloc) \
+    CDSUNIT_DECLARE_TEST(MichaelSet_Lazy_RCU_GPB_cmp_stdAlloc) \
+    CDSUNIT_DECLARE_TEST(MichaelSet_Lazy_RCU_GPB_less_michaelAlloc) \
+    CDSUNIT_DECLARE_TEST(MichaelSet_Lazy_RCU_GPT_cmp_stdAlloc) \
+    CDSUNIT_DECLARE_TEST(MichaelSet_Lazy_RCU_GPT_less_michaelAlloc) \
     CDSUNIT_DECLARE_MichaelSet_RCU_signal
 
+#define CDSUNIT_DEFINE_MichaelSet( IMPL, C )  \
+    TEST_SET_EXTRACT(IMPL, C, MichaelSet_HP_cmp_stdAlloc) \
+    TEST_SET_EXTRACT(IMPL, C, MichaelSet_HP_less_michaelAlloc) \
+    TEST_SET_EXTRACT(IMPL, C, MichaelSet_DHP_cmp_stdAlloc) \
+    TEST_SET_EXTRACT(IMPL, C, MichaelSet_DHP_less_michaelAlloc) \
+    TEST_SET_EXTRACT(IMPL, C, MichaelSet_RCU_GPI_cmp_stdAlloc) \
+    TEST_SET_EXTRACT(IMPL, C, MichaelSet_RCU_GPI_less_michaelAlloc) \
+    TEST_SET_EXTRACT(IMPL, C, MichaelSet_RCU_GPB_cmp_stdAlloc) \
+    TEST_SET_EXTRACT(IMPL, C, MichaelSet_RCU_GPB_less_michaelAlloc) \
+    TEST_SET_EXTRACT(IMPL, C, MichaelSet_RCU_GPT_cmp_stdAlloc) \
+    TEST_SET_EXTRACT(IMPL, C, MichaelSet_RCU_GPT_less_michaelAlloc) \
+    TEST_SET_EXTRACT(IMPL, C, MichaelSet_Lazy_HP_cmp_stdAlloc) \
+    TEST_SET_EXTRACT(IMPL, C, MichaelSet_Lazy_HP_less_michaelAlloc) \
+    TEST_SET_EXTRACT(IMPL, C, MichaelSet_Lazy_DHP_cmp_stdAlloc) \
+    TEST_SET_EXTRACT(IMPL, C, MichaelSet_Lazy_DHP_less_michaelAlloc) \
+    TEST_SET_EXTRACT(IMPL, C, MichaelSet_Lazy_RCU_GPI_cmp_stdAlloc) \
+    TEST_SET_EXTRACT(IMPL, C, MichaelSet_Lazy_RCU_GPI_less_michaelAlloc) \
+    TEST_SET_EXTRACT(IMPL, C, MichaelSet_Lazy_RCU_GPB_cmp_stdAlloc) \
+    TEST_SET_EXTRACT(IMPL, C, MichaelSet_Lazy_RCU_GPB_less_michaelAlloc) \
+    TEST_SET_EXTRACT(IMPL, C, MichaelSet_Lazy_RCU_GPT_cmp_stdAlloc) \
+    TEST_SET_EXTRACT(IMPL, C, MichaelSet_Lazy_RCU_GPT_less_michaelAlloc) \
+    CDSUNIT_DEFINE_MichaelSet_RCU_signal(IMPL, C)
+
 #define CDSUNIT_TEST_MichaelSet  \
     CPPUNIT_TEST(MichaelSet_HP_cmp_stdAlloc) \
     CPPUNIT_TEST(MichaelSet_HP_less_michaelAlloc) \
 
 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
 #   define CDSUNIT_DECLARE_SplitList_RCU_signal  \
-    TEST_SET_EXTRACT(SplitList_Michael_RCU_SHB_dyn_cmp)\
-    TEST_SET_EXTRACT(SplitList_Michael_RCU_SHB_dyn_cmp_stat)\
-    TEST_SET_EXTRACT(SplitList_Michael_RCU_SHB_st_cmp)\
-    TEST_SET_EXTRACT(SplitList_Michael_RCU_SHB_dyn_less)\
-    TEST_SET_EXTRACT(SplitList_Michael_RCU_SHB_st_less)\
-    TEST_SET_EXTRACT(SplitList_Michael_RCU_SHB_st_less_stat)\
-    TEST_SET_EXTRACT(SplitList_Michael_RCU_SHT_dyn_cmp)\
-    TEST_SET_EXTRACT(SplitList_Michael_RCU_SHT_dyn_cmp_stat)\
-    TEST_SET_EXTRACT(SplitList_Michael_RCU_SHT_st_cmp)\
-    TEST_SET_EXTRACT(SplitList_Michael_RCU_SHT_dyn_less)\
-    TEST_SET_EXTRACT(SplitList_Michael_RCU_SHT_st_less)\
-    TEST_SET_EXTRACT(SplitList_Michael_RCU_SHT_st_less_stat)\
-    TEST_SET_EXTRACT(SplitList_Lazy_RCU_SHB_dyn_cmp)\
-    TEST_SET_EXTRACT(SplitList_Lazy_RCU_SHB_dyn_cmp_stat)\
-    TEST_SET_EXTRACT(SplitList_Lazy_RCU_SHB_st_cmp)\
-    TEST_SET_EXTRACT(SplitList_Lazy_RCU_SHB_dyn_less)\
-    TEST_SET_EXTRACT(SplitList_Lazy_RCU_SHB_st_less)\
-    TEST_SET_EXTRACT(SplitList_Lazy_RCU_SHB_st_less_stat)\
-    TEST_SET_EXTRACT(SplitList_Lazy_RCU_SHT_dyn_cmp)\
-    TEST_SET_EXTRACT(SplitList_Lazy_RCU_SHT_dyn_cmp_stat)\
-    TEST_SET_EXTRACT(SplitList_Lazy_RCU_SHT_st_cmp)\
-    TEST_SET_EXTRACT(SplitList_Lazy_RCU_SHT_dyn_less)\
-    TEST_SET_EXTRACT(SplitList_Lazy_RCU_SHT_st_less)\
-    TEST_SET_EXTRACT(SplitList_Lazy_RCU_SHT_st_less_stat)
+    CDSUNIT_DECLARE_TEST(SplitList_Michael_RCU_SHB_dyn_cmp)\
+    CDSUNIT_DECLARE_TEST(SplitList_Michael_RCU_SHB_dyn_cmp_stat)\
+    CDSUNIT_DECLARE_TEST(SplitList_Michael_RCU_SHB_st_cmp)\
+    CDSUNIT_DECLARE_TEST(SplitList_Michael_RCU_SHB_dyn_less)\
+    CDSUNIT_DECLARE_TEST(SplitList_Michael_RCU_SHB_st_less)\
+    CDSUNIT_DECLARE_TEST(SplitList_Michael_RCU_SHB_st_less_stat)\
+    CDSUNIT_DECLARE_TEST(SplitList_Michael_RCU_SHT_dyn_cmp)\
+    CDSUNIT_DECLARE_TEST(SplitList_Michael_RCU_SHT_dyn_cmp_stat)\
+    CDSUNIT_DECLARE_TEST(SplitList_Michael_RCU_SHT_st_cmp)\
+    CDSUNIT_DECLARE_TEST(SplitList_Michael_RCU_SHT_dyn_less)\
+    CDSUNIT_DECLARE_TEST(SplitList_Michael_RCU_SHT_st_less)\
+    CDSUNIT_DECLARE_TEST(SplitList_Michael_RCU_SHT_st_less_stat)\
+    CDSUNIT_DECLARE_TEST(SplitList_Lazy_RCU_SHB_dyn_cmp)\
+    CDSUNIT_DECLARE_TEST(SplitList_Lazy_RCU_SHB_dyn_cmp_stat)\
+    CDSUNIT_DECLARE_TEST(SplitList_Lazy_RCU_SHB_st_cmp)\
+    CDSUNIT_DECLARE_TEST(SplitList_Lazy_RCU_SHB_dyn_less)\
+    CDSUNIT_DECLARE_TEST(SplitList_Lazy_RCU_SHB_st_less)\
+    CDSUNIT_DECLARE_TEST(SplitList_Lazy_RCU_SHB_st_less_stat)\
+    CDSUNIT_DECLARE_TEST(SplitList_Lazy_RCU_SHT_dyn_cmp)\
+    CDSUNIT_DECLARE_TEST(SplitList_Lazy_RCU_SHT_dyn_cmp_stat)\
+    CDSUNIT_DECLARE_TEST(SplitList_Lazy_RCU_SHT_st_cmp)\
+    CDSUNIT_DECLARE_TEST(SplitList_Lazy_RCU_SHT_dyn_less)\
+    CDSUNIT_DECLARE_TEST(SplitList_Lazy_RCU_SHT_st_less)\
+    CDSUNIT_DECLARE_TEST(SplitList_Lazy_RCU_SHT_st_less_stat)
+
+#   define CDSUNIT_DEFINE_SplitList_RCU_signal( IMPL, C )  \
+    TEST_SET_EXTRACT( IMPL, C, SplitList_Michael_RCU_SHB_dyn_cmp)\
+    TEST_SET_EXTRACT( IMPL, C, SplitList_Michael_RCU_SHB_dyn_cmp_stat)\
+    TEST_SET_EXTRACT( IMPL, C, SplitList_Michael_RCU_SHB_st_cmp)\
+    TEST_SET_EXTRACT( IMPL, C, SplitList_Michael_RCU_SHB_dyn_less)\
+    TEST_SET_EXTRACT( IMPL, C, SplitList_Michael_RCU_SHB_st_less)\
+    TEST_SET_EXTRACT( IMPL, C, SplitList_Michael_RCU_SHB_st_less_stat)\
+    TEST_SET_EXTRACT( IMPL, C, SplitList_Michael_RCU_SHT_dyn_cmp)\
+    TEST_SET_EXTRACT( IMPL, C, SplitList_Michael_RCU_SHT_dyn_cmp_stat)\
+    TEST_SET_EXTRACT( IMPL, C, SplitList_Michael_RCU_SHT_st_cmp)\
+    TEST_SET_EXTRACT( IMPL, C, SplitList_Michael_RCU_SHT_dyn_less)\
+    TEST_SET_EXTRACT( IMPL, C, SplitList_Michael_RCU_SHT_st_less)\
+    TEST_SET_EXTRACT( IMPL, C, SplitList_Michael_RCU_SHT_st_less_stat)\
+    TEST_SET_EXTRACT( IMPL, C, SplitList_Lazy_RCU_SHB_dyn_cmp)\
+    TEST_SET_EXTRACT( IMPL, C, SplitList_Lazy_RCU_SHB_dyn_cmp_stat)\
+    TEST_SET_EXTRACT( IMPL, C, SplitList_Lazy_RCU_SHB_st_cmp)\
+    TEST_SET_EXTRACT( IMPL, C, SplitList_Lazy_RCU_SHB_dyn_less)\
+    TEST_SET_EXTRACT( IMPL, C, SplitList_Lazy_RCU_SHB_st_less)\
+    TEST_SET_EXTRACT( IMPL, C, SplitList_Lazy_RCU_SHB_st_less_stat)\
+    TEST_SET_EXTRACT( IMPL, C, SplitList_Lazy_RCU_SHT_dyn_cmp)\
+    TEST_SET_EXTRACT( IMPL, C, SplitList_Lazy_RCU_SHT_dyn_cmp_stat)\
+    TEST_SET_EXTRACT( IMPL, C, SplitList_Lazy_RCU_SHT_st_cmp)\
+    TEST_SET_EXTRACT( IMPL, C, SplitList_Lazy_RCU_SHT_dyn_less)\
+    TEST_SET_EXTRACT( IMPL, C, SplitList_Lazy_RCU_SHT_st_less)\
+    TEST_SET_EXTRACT( IMPL, C, SplitList_Lazy_RCU_SHT_st_less_stat)
 
 #   define CDSUNIT_TEST_SplitList_RCU_signal  \
     CPPUNIT_TEST(SplitList_Michael_RCU_SHB_dyn_cmp)\
 
 #else
 #   define CDSUNIT_DECLARE_SplitList_RCU_signal
+#   define CDSUNIT_DEFINE_SplitList_RCU_signal( IMPL, C )
 #   define CDSUNIT_TEST_SplitList_RCU_signal
 #endif
 
 #define CDSUNIT_DECLARE_SplitList  \
-    TEST_SET_EXTRACT(SplitList_Michael_HP_dyn_cmp)\
-    TEST_SET_EXTRACT(SplitList_Michael_HP_dyn_cmp_stat)\
-    TEST_SET_EXTRACT(SplitList_Michael_HP_st_cmp)\
-    TEST_SET_EXTRACT(SplitList_Michael_HP_dyn_less)\
-    TEST_SET_EXTRACT(SplitList_Michael_HP_st_less)\
-    TEST_SET_EXTRACT(SplitList_Michael_HP_st_less_stat)\
-    TEST_SET_EXTRACT(SplitList_Michael_DHP_dyn_cmp)\
-    TEST_SET_EXTRACT(SplitList_Michael_DHP_dyn_cmp_stat)\
-    TEST_SET_EXTRACT(SplitList_Michael_DHP_st_cmp)\
-    TEST_SET_EXTRACT(SplitList_Michael_DHP_dyn_less)\
-    TEST_SET_EXTRACT(SplitList_Michael_DHP_st_less)\
-    TEST_SET_EXTRACT(SplitList_Michael_DHP_st_less_stat)\
-    TEST_SET_EXTRACT(SplitList_Michael_RCU_GPI_dyn_cmp)\
-    TEST_SET_EXTRACT(SplitList_Michael_RCU_GPI_dyn_cmp_stat)\
-    TEST_SET_EXTRACT(SplitList_Michael_RCU_GPI_st_cmp)\
-    TEST_SET_EXTRACT(SplitList_Michael_RCU_GPI_dyn_less)\
-    TEST_SET_EXTRACT(SplitList_Michael_RCU_GPI_st_less)\
-    TEST_SET_EXTRACT(SplitList_Michael_RCU_GPI_st_less_stat)\
-    TEST_SET_EXTRACT(SplitList_Michael_RCU_GPB_dyn_cmp)\
-    TEST_SET_EXTRACT(SplitList_Michael_RCU_GPB_dyn_cmp_stat)\
-    TEST_SET_EXTRACT(SplitList_Michael_RCU_GPB_st_cmp)\
-    TEST_SET_EXTRACT(SplitList_Michael_RCU_GPB_dyn_less)\
-    TEST_SET_EXTRACT(SplitList_Michael_RCU_GPB_st_less)\
-    TEST_SET_EXTRACT(SplitList_Michael_RCU_GPB_st_less_stat)\
-    TEST_SET_EXTRACT(SplitList_Michael_RCU_GPT_dyn_cmp)\
-    TEST_SET_EXTRACT(SplitList_Michael_RCU_GPT_dyn_cmp_stat)\
-    TEST_SET_EXTRACT(SplitList_Michael_RCU_GPT_st_cmp)\
-    TEST_SET_EXTRACT(SplitList_Michael_RCU_GPT_dyn_less)\
-    TEST_SET_EXTRACT(SplitList_Michael_RCU_GPT_st_less)\
-    TEST_SET_EXTRACT(SplitList_Michael_RCU_GPT_st_less_stat)\
-    TEST_SET_EXTRACT(SplitList_Lazy_HP_dyn_cmp)\
-    TEST_SET_EXTRACT(SplitList_Lazy_HP_dyn_cmp_stat)\
-    TEST_SET_EXTRACT(SplitList_Lazy_HP_st_cmp)\
-    TEST_SET_EXTRACT(SplitList_Lazy_HP_dyn_less)\
-    TEST_SET_EXTRACT(SplitList_Lazy_HP_st_less)\
-    TEST_SET_EXTRACT(SplitList_Lazy_HP_st_less_stat)\
-    TEST_SET_EXTRACT(SplitList_Lazy_DHP_dyn_cmp)\
-    TEST_SET_EXTRACT(SplitList_Lazy_DHP_dyn_cmp_stat)\
-    TEST_SET_EXTRACT(SplitList_Lazy_DHP_st_cmp)\
-    TEST_SET_EXTRACT(SplitList_Lazy_DHP_dyn_less)\
-    TEST_SET_EXTRACT(SplitList_Lazy_DHP_st_less)\
-    TEST_SET_EXTRACT(SplitList_Lazy_DHP_st_less_stat)\
-    TEST_SET_EXTRACT(SplitList_Lazy_RCU_GPI_dyn_cmp)\
-    TEST_SET_EXTRACT(SplitList_Lazy_RCU_GPI_dyn_cmp_stat)\
-    TEST_SET_EXTRACT(SplitList_Lazy_RCU_GPI_st_cmp)\
-    TEST_SET_EXTRACT(SplitList_Lazy_RCU_GPI_dyn_less)\
-    TEST_SET_EXTRACT(SplitList_Lazy_RCU_GPI_st_less)\
-    TEST_SET_EXTRACT(SplitList_Lazy_RCU_GPI_st_less_stat)\
-    TEST_SET_EXTRACT(SplitList_Lazy_RCU_GPB_dyn_cmp)\
-    TEST_SET_EXTRACT(SplitList_Lazy_RCU_GPB_dyn_cmp_stat)\
-    TEST_SET_EXTRACT(SplitList_Lazy_RCU_GPB_st_cmp)\
-    TEST_SET_EXTRACT(SplitList_Lazy_RCU_GPB_dyn_less)\
-    TEST_SET_EXTRACT(SplitList_Lazy_RCU_GPB_st_less)\
-    TEST_SET_EXTRACT(SplitList_Lazy_RCU_GPB_st_less_stat)\
-    TEST_SET_EXTRACT(SplitList_Lazy_RCU_GPT_dyn_cmp)\
-    TEST_SET_EXTRACT(SplitList_Lazy_RCU_GPT_dyn_cmp_stat)\
-    TEST_SET_EXTRACT(SplitList_Lazy_RCU_GPT_st_cmp)\
-    TEST_SET_EXTRACT(SplitList_Lazy_RCU_GPT_dyn_less)\
-    TEST_SET_EXTRACT(SplitList_Lazy_RCU_GPT_st_less)\
-    TEST_SET_EXTRACT(SplitList_Lazy_RCU_GPT_st_less_stat)\
+    CDSUNIT_DECLARE_TEST(SplitList_Michael_HP_dyn_cmp)\
+    CDSUNIT_DECLARE_TEST(SplitList_Michael_HP_dyn_cmp_stat)\
+    CDSUNIT_DECLARE_TEST(SplitList_Michael_HP_st_cmp)\
+    CDSUNIT_DECLARE_TEST(SplitList_Michael_HP_dyn_less)\
+    CDSUNIT_DECLARE_TEST(SplitList_Michael_HP_st_less)\
+    CDSUNIT_DECLARE_TEST(SplitList_Michael_HP_st_less_stat)\
+    CDSUNIT_DECLARE_TEST(SplitList_Michael_DHP_dyn_cmp)\
+    CDSUNIT_DECLARE_TEST(SplitList_Michael_DHP_dyn_cmp_stat)\
+    CDSUNIT_DECLARE_TEST(SplitList_Michael_DHP_st_cmp)\
+    CDSUNIT_DECLARE_TEST(SplitList_Michael_DHP_dyn_less)\
+    CDSUNIT_DECLARE_TEST(SplitList_Michael_DHP_st_less)\
+    CDSUNIT_DECLARE_TEST(SplitList_Michael_DHP_st_less_stat)\
+    CDSUNIT_DECLARE_TEST(SplitList_Michael_RCU_GPI_dyn_cmp)\
+    CDSUNIT_DECLARE_TEST(SplitList_Michael_RCU_GPI_dyn_cmp_stat)\
+    CDSUNIT_DECLARE_TEST(SplitList_Michael_RCU_GPI_st_cmp)\
+    CDSUNIT_DECLARE_TEST(SplitList_Michael_RCU_GPI_dyn_less)\
+    CDSUNIT_DECLARE_TEST(SplitList_Michael_RCU_GPI_st_less)\
+    CDSUNIT_DECLARE_TEST(SplitList_Michael_RCU_GPI_st_less_stat)\
+    CDSUNIT_DECLARE_TEST(SplitList_Michael_RCU_GPB_dyn_cmp)\
+    CDSUNIT_DECLARE_TEST(SplitList_Michael_RCU_GPB_dyn_cmp_stat)\
+    CDSUNIT_DECLARE_TEST(SplitList_Michael_RCU_GPB_st_cmp)\
+    CDSUNIT_DECLARE_TEST(SplitList_Michael_RCU_GPB_dyn_less)\
+    CDSUNIT_DECLARE_TEST(SplitList_Michael_RCU_GPB_st_less)\
+    CDSUNIT_DECLARE_TEST(SplitList_Michael_RCU_GPB_st_less_stat)\
+    CDSUNIT_DECLARE_TEST(SplitList_Michael_RCU_GPT_dyn_cmp)\
+    CDSUNIT_DECLARE_TEST(SplitList_Michael_RCU_GPT_dyn_cmp_stat)\
+    CDSUNIT_DECLARE_TEST(SplitList_Michael_RCU_GPT_st_cmp)\
+    CDSUNIT_DECLARE_TEST(SplitList_Michael_RCU_GPT_dyn_less)\
+    CDSUNIT_DECLARE_TEST(SplitList_Michael_RCU_GPT_st_less)\
+    CDSUNIT_DECLARE_TEST(SplitList_Michael_RCU_GPT_st_less_stat)\
+    CDSUNIT_DECLARE_TEST(SplitList_Lazy_HP_dyn_cmp)\
+    CDSUNIT_DECLARE_TEST(SplitList_Lazy_HP_dyn_cmp_stat)\
+    CDSUNIT_DECLARE_TEST(SplitList_Lazy_HP_st_cmp)\
+    CDSUNIT_DECLARE_TEST(SplitList_Lazy_HP_dyn_less)\
+    CDSUNIT_DECLARE_TEST(SplitList_Lazy_HP_st_less)\
+    CDSUNIT_DECLARE_TEST(SplitList_Lazy_HP_st_less_stat)\
+    CDSUNIT_DECLARE_TEST(SplitList_Lazy_DHP_dyn_cmp)\
+    CDSUNIT_DECLARE_TEST(SplitList_Lazy_DHP_dyn_cmp_stat)\
+    CDSUNIT_DECLARE_TEST(SplitList_Lazy_DHP_st_cmp)\
+    CDSUNIT_DECLARE_TEST(SplitList_Lazy_DHP_dyn_less)\
+    CDSUNIT_DECLARE_TEST(SplitList_Lazy_DHP_st_less)\
+    CDSUNIT_DECLARE_TEST(SplitList_Lazy_DHP_st_less_stat)\
+    CDSUNIT_DECLARE_TEST(SplitList_Lazy_RCU_GPI_dyn_cmp)\
+    CDSUNIT_DECLARE_TEST(SplitList_Lazy_RCU_GPI_dyn_cmp_stat)\
+    CDSUNIT_DECLARE_TEST(SplitList_Lazy_RCU_GPI_st_cmp)\
+    CDSUNIT_DECLARE_TEST(SplitList_Lazy_RCU_GPI_dyn_less)\
+    CDSUNIT_DECLARE_TEST(SplitList_Lazy_RCU_GPI_st_less)\
+    CDSUNIT_DECLARE_TEST(SplitList_Lazy_RCU_GPI_st_less_stat)\
+    CDSUNIT_DECLARE_TEST(SplitList_Lazy_RCU_GPB_dyn_cmp)\
+    CDSUNIT_DECLARE_TEST(SplitList_Lazy_RCU_GPB_dyn_cmp_stat)\
+    CDSUNIT_DECLARE_TEST(SplitList_Lazy_RCU_GPB_st_cmp)\
+    CDSUNIT_DECLARE_TEST(SplitList_Lazy_RCU_GPB_dyn_less)\
+    CDSUNIT_DECLARE_TEST(SplitList_Lazy_RCU_GPB_st_less)\
+    CDSUNIT_DECLARE_TEST(SplitList_Lazy_RCU_GPB_st_less_stat)\
+    CDSUNIT_DECLARE_TEST(SplitList_Lazy_RCU_GPT_dyn_cmp)\
+    CDSUNIT_DECLARE_TEST(SplitList_Lazy_RCU_GPT_dyn_cmp_stat)\
+    CDSUNIT_DECLARE_TEST(SplitList_Lazy_RCU_GPT_st_cmp)\
+    CDSUNIT_DECLARE_TEST(SplitList_Lazy_RCU_GPT_dyn_less)\
+    CDSUNIT_DECLARE_TEST(SplitList_Lazy_RCU_GPT_st_less)\
+    CDSUNIT_DECLARE_TEST(SplitList_Lazy_RCU_GPT_st_less_stat)\
     CDSUNIT_DECLARE_SplitList_RCU_signal
 
+#define CDSUNIT_DEFINE_SplitList( IMPL, C ) \
+    TEST_SET_EXTRACT( IMPL, C, SplitList_Michael_HP_dyn_cmp)\
+    TEST_SET_EXTRACT( IMPL, C, SplitList_Michael_HP_dyn_cmp_stat)\
+    TEST_SET_EXTRACT( IMPL, C, SplitList_Michael_HP_st_cmp)\
+    TEST_SET_EXTRACT( IMPL, C, SplitList_Michael_HP_dyn_less)\
+    TEST_SET_EXTRACT( IMPL, C, SplitList_Michael_HP_st_less)\
+    TEST_SET_EXTRACT( IMPL, C, SplitList_Michael_HP_st_less_stat)\
+    TEST_SET_EXTRACT( IMPL, C, SplitList_Michael_DHP_dyn_cmp)\
+    TEST_SET_EXTRACT( IMPL, C, SplitList_Michael_DHP_dyn_cmp_stat)\
+    TEST_SET_EXTRACT( IMPL, C, SplitList_Michael_DHP_st_cmp)\
+    TEST_SET_EXTRACT( IMPL, C, SplitList_Michael_DHP_dyn_less)\
+    TEST_SET_EXTRACT( IMPL, C, SplitList_Michael_DHP_st_less)\
+    TEST_SET_EXTRACT( IMPL, C, SplitList_Michael_DHP_st_less_stat)\
+    TEST_SET_EXTRACT( IMPL, C, SplitList_Michael_RCU_GPI_dyn_cmp)\
+    TEST_SET_EXTRACT( IMPL, C, SplitList_Michael_RCU_GPI_dyn_cmp_stat)\
+    TEST_SET_EXTRACT( IMPL, C, SplitList_Michael_RCU_GPI_st_cmp)\
+    TEST_SET_EXTRACT( IMPL, C, SplitList_Michael_RCU_GPI_dyn_less)\
+    TEST_SET_EXTRACT( IMPL, C, SplitList_Michael_RCU_GPI_st_less)\
+    TEST_SET_EXTRACT( IMPL, C, SplitList_Michael_RCU_GPI_st_less_stat)\
+    TEST_SET_EXTRACT( IMPL, C, SplitList_Michael_RCU_GPB_dyn_cmp)\
+    TEST_SET_EXTRACT( IMPL, C, SplitList_Michael_RCU_GPB_dyn_cmp_stat)\
+    TEST_SET_EXTRACT( IMPL, C, SplitList_Michael_RCU_GPB_st_cmp)\
+    TEST_SET_EXTRACT( IMPL, C, SplitList_Michael_RCU_GPB_dyn_less)\
+    TEST_SET_EXTRACT( IMPL, C, SplitList_Michael_RCU_GPB_st_less)\
+    TEST_SET_EXTRACT( IMPL, C, SplitList_Michael_RCU_GPB_st_less_stat)\
+    TEST_SET_EXTRACT( IMPL, C, SplitList_Michael_RCU_GPT_dyn_cmp)\
+    TEST_SET_EXTRACT( IMPL, C, SplitList_Michael_RCU_GPT_dyn_cmp_stat)\
+    TEST_SET_EXTRACT( IMPL, C, SplitList_Michael_RCU_GPT_st_cmp)\
+    TEST_SET_EXTRACT( IMPL, C, SplitList_Michael_RCU_GPT_dyn_less)\
+    TEST_SET_EXTRACT( IMPL, C, SplitList_Michael_RCU_GPT_st_less)\
+    TEST_SET_EXTRACT( IMPL, C, SplitList_Michael_RCU_GPT_st_less_stat)\
+    TEST_SET_EXTRACT( IMPL, C, SplitList_Lazy_HP_dyn_cmp)\
+    TEST_SET_EXTRACT( IMPL, C, SplitList_Lazy_HP_dyn_cmp_stat)\
+    TEST_SET_EXTRACT( IMPL, C, SplitList_Lazy_HP_st_cmp)\
+    TEST_SET_EXTRACT( IMPL, C, SplitList_Lazy_HP_dyn_less)\
+    TEST_SET_EXTRACT( IMPL, C, SplitList_Lazy_HP_st_less)\
+    TEST_SET_EXTRACT( IMPL, C, SplitList_Lazy_HP_st_less_stat)\
+    TEST_SET_EXTRACT( IMPL, C, SplitList_Lazy_DHP_dyn_cmp)\
+    TEST_SET_EXTRACT( IMPL, C, SplitList_Lazy_DHP_dyn_cmp_stat)\
+    TEST_SET_EXTRACT( IMPL, C, SplitList_Lazy_DHP_st_cmp)\
+    TEST_SET_EXTRACT( IMPL, C, SplitList_Lazy_DHP_dyn_less)\
+    TEST_SET_EXTRACT( IMPL, C, SplitList_Lazy_DHP_st_less)\
+    TEST_SET_EXTRACT( IMPL, C, SplitList_Lazy_DHP_st_less_stat)\
+    TEST_SET_EXTRACT( IMPL, C, SplitList_Lazy_RCU_GPI_dyn_cmp)\
+    TEST_SET_EXTRACT( IMPL, C, SplitList_Lazy_RCU_GPI_dyn_cmp_stat)\
+    TEST_SET_EXTRACT( IMPL, C, SplitList_Lazy_RCU_GPI_st_cmp)\
+    TEST_SET_EXTRACT( IMPL, C, SplitList_Lazy_RCU_GPI_dyn_less)\
+    TEST_SET_EXTRACT( IMPL, C, SplitList_Lazy_RCU_GPI_st_less)\
+    TEST_SET_EXTRACT( IMPL, C, SplitList_Lazy_RCU_GPI_st_less_stat)\
+    TEST_SET_EXTRACT( IMPL, C, SplitList_Lazy_RCU_GPB_dyn_cmp)\
+    TEST_SET_EXTRACT( IMPL, C, SplitList_Lazy_RCU_GPB_dyn_cmp_stat)\
+    TEST_SET_EXTRACT( IMPL, C, SplitList_Lazy_RCU_GPB_st_cmp)\
+    TEST_SET_EXTRACT( IMPL, C, SplitList_Lazy_RCU_GPB_dyn_less)\
+    TEST_SET_EXTRACT( IMPL, C, SplitList_Lazy_RCU_GPB_st_less)\
+    TEST_SET_EXTRACT( IMPL, C, SplitList_Lazy_RCU_GPB_st_less_stat)\
+    TEST_SET_EXTRACT( IMPL, C, SplitList_Lazy_RCU_GPT_dyn_cmp)\
+    TEST_SET_EXTRACT( IMPL, C, SplitList_Lazy_RCU_GPT_dyn_cmp_stat)\
+    TEST_SET_EXTRACT( IMPL, C, SplitList_Lazy_RCU_GPT_st_cmp)\
+    TEST_SET_EXTRACT( IMPL, C, SplitList_Lazy_RCU_GPT_dyn_less)\
+    TEST_SET_EXTRACT( IMPL, C, SplitList_Lazy_RCU_GPT_st_less)\
+    TEST_SET_EXTRACT( IMPL, C, SplitList_Lazy_RCU_GPT_st_less_stat)\
+    CDSUNIT_DEFINE_SplitList_RCU_signal( IMPL, C )
+
 #define CDSUNIT_TEST_SplitList  \
     CPPUNIT_TEST(SplitList_Michael_HP_dyn_cmp)\
     CPPUNIT_TEST(SplitList_Michael_HP_dyn_cmp_stat)\
 
 
 #define CDSUNIT_DECLARE_CuckooSet \
-    TEST_SET(CuckooStripedSet_list_unord)\
-    TEST_SET(CuckooStripedSet_list_unord_stat)\
-    TEST_SET(CuckooStripedSet_list_ord)\
-    TEST_SET(CuckooStripedSet_list_ord_stat)\
-    TEST_SET(CuckooStripedSet_vector_unord)\
-    TEST_SET(CuckooStripedSet_vector_ord)\
-    TEST_SET(CuckooStripedSet_vector_unord_stat)\
-    TEST_SET(CuckooStripedSet_vector_ord_stat)\
-    TEST_SET(CuckooRefinableSet_list_unord)\
-    TEST_SET(CuckooRefinableSet_list_ord)\
-    TEST_SET(CuckooRefinableSet_list_unord_stat)\
-    TEST_SET(CuckooRefinableSet_list_ord_stat)\
-    TEST_SET(CuckooRefinableSet_vector_unord)\
-    TEST_SET(CuckooRefinableSet_vector_unord_stat)\
-    TEST_SET(CuckooRefinableSet_vector_ord) \
-    TEST_SET(CuckooRefinableSet_vector_ord_stat) \
-    TEST_SET(CuckooStripedSet_list_unord_storehash)\
-    TEST_SET(CuckooStripedSet_list_ord_storehash)\
-    TEST_SET(CuckooStripedSet_vector_unord_storehash)\
-    TEST_SET(CuckooStripedSet_vector_ord_storehash)\
-    TEST_SET(CuckooRefinableSet_list_unord_storehash)\
-    TEST_SET(CuckooRefinableSet_list_ord_storehash)\
-    TEST_SET(CuckooRefinableSet_vector_unord_storehash)\
-    TEST_SET(CuckooRefinableSet_vector_ord_storehash)
+    CDSUNIT_DECLARE_TEST(CuckooStripedSet_list_unord)\
+    CDSUNIT_DECLARE_TEST(CuckooStripedSet_list_unord_stat)\
+    CDSUNIT_DECLARE_TEST(CuckooStripedSet_list_ord)\
+    CDSUNIT_DECLARE_TEST(CuckooStripedSet_list_ord_stat)\
+    CDSUNIT_DECLARE_TEST(CuckooStripedSet_vector_unord)\
+    CDSUNIT_DECLARE_TEST(CuckooStripedSet_vector_ord)\
+    CDSUNIT_DECLARE_TEST(CuckooStripedSet_vector_unord_stat)\
+    CDSUNIT_DECLARE_TEST(CuckooStripedSet_vector_ord_stat)\
+    CDSUNIT_DECLARE_TEST(CuckooRefinableSet_list_unord)\
+    CDSUNIT_DECLARE_TEST(CuckooRefinableSet_list_ord)\
+    CDSUNIT_DECLARE_TEST(CuckooRefinableSet_list_unord_stat)\
+    CDSUNIT_DECLARE_TEST(CuckooRefinableSet_list_ord_stat)\
+    CDSUNIT_DECLARE_TEST(CuckooRefinableSet_vector_unord)\
+    CDSUNIT_DECLARE_TEST(CuckooRefinableSet_vector_unord_stat)\
+    CDSUNIT_DECLARE_TEST(CuckooRefinableSet_vector_ord) \
+    CDSUNIT_DECLARE_TEST(CuckooRefinableSet_vector_ord_stat) \
+    CDSUNIT_DECLARE_TEST(CuckooStripedSet_list_unord_storehash)\
+    CDSUNIT_DECLARE_TEST(CuckooStripedSet_list_ord_storehash)\
+    CDSUNIT_DECLARE_TEST(CuckooStripedSet_vector_unord_storehash)\
+    CDSUNIT_DECLARE_TEST(CuckooStripedSet_vector_ord_storehash)\
+    CDSUNIT_DECLARE_TEST(CuckooRefinableSet_list_unord_storehash)\
+    CDSUNIT_DECLARE_TEST(CuckooRefinableSet_list_ord_storehash)\
+    CDSUNIT_DECLARE_TEST(CuckooRefinableSet_vector_unord_storehash)\
+    CDSUNIT_DECLARE_TEST(CuckooRefinableSet_vector_ord_storehash)
+
+#define CDSUNIT_DEFINE_CuckooSet(IMPL, C) \
+    TEST_SET(IMPL, C, CuckooStripedSet_list_unord)\
+    TEST_SET(IMPL, C, CuckooStripedSet_list_unord_stat)\
+    TEST_SET(IMPL, C, CuckooStripedSet_list_ord)\
+    TEST_SET(IMPL, C, CuckooStripedSet_list_ord_stat)\
+    TEST_SET(IMPL, C, CuckooStripedSet_vector_unord)\
+    TEST_SET(IMPL, C, CuckooStripedSet_vector_ord)\
+    TEST_SET(IMPL, C, CuckooStripedSet_vector_unord_stat)\
+    TEST_SET(IMPL, C, CuckooStripedSet_vector_ord_stat)\
+    TEST_SET(IMPL, C, CuckooRefinableSet_list_unord)\
+    TEST_SET(IMPL, C, CuckooRefinableSet_list_ord)\
+    TEST_SET(IMPL, C, CuckooRefinableSet_list_unord_stat)\
+    TEST_SET(IMPL, C, CuckooRefinableSet_list_ord_stat)\
+    TEST_SET(IMPL, C, CuckooRefinableSet_vector_unord)\
+    TEST_SET(IMPL, C, CuckooRefinableSet_vector_unord_stat)\
+    TEST_SET(IMPL, C, CuckooRefinableSet_vector_ord) \
+    TEST_SET(IMPL, C, CuckooRefinableSet_vector_ord_stat) \
+    TEST_SET(IMPL, C, CuckooStripedSet_list_unord_storehash)\
+    TEST_SET(IMPL, C, CuckooStripedSet_list_ord_storehash)\
+    TEST_SET(IMPL, C, CuckooStripedSet_vector_unord_storehash)\
+    TEST_SET(IMPL, C, CuckooStripedSet_vector_ord_storehash)\
+    TEST_SET(IMPL, C, CuckooRefinableSet_list_unord_storehash)\
+    TEST_SET(IMPL, C, CuckooRefinableSet_list_ord_storehash)\
+    TEST_SET(IMPL, C, CuckooRefinableSet_vector_unord_storehash)\
+    TEST_SET(IMPL, C, CuckooRefinableSet_vector_ord_storehash)
 
 
 #define CDSUNIT_TEST_CuckooSet \
 
 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
 #   define CDSUNIT_DECLARE_SkipListSet_RCU_signal \
-    TEST_SET_NOLF_EXTRACT(SkipListSet_rcu_shb_less_pascal)\
-    TEST_SET_NOLF_EXTRACT(SkipListSet_rcu_shb_cmp_pascal_stat)\
-    TEST_SET_NOLF_EXTRACT(SkipListSet_rcu_shb_less_xorshift)\
-    TEST_SET_NOLF_EXTRACT(SkipListSet_rcu_shb_cmp_xorshift_stat)\
-    TEST_SET_NOLF_EXTRACT(SkipListSet_rcu_sht_less_pascal)\
-    TEST_SET_NOLF_EXTRACT(SkipListSet_rcu_sht_cmp_pascal_stat)\
-    TEST_SET_NOLF_EXTRACT(SkipListSet_rcu_sht_less_xorshift)\
-    TEST_SET_NOLF_EXTRACT(SkipListSet_rcu_sht_cmp_xorshift_stat)
+    CDSUNIT_DECLARE_TEST(SkipListSet_rcu_shb_less_pascal)\
+    CDSUNIT_DECLARE_TEST(SkipListSet_rcu_shb_cmp_pascal_stat)\
+    CDSUNIT_DECLARE_TEST(SkipListSet_rcu_shb_less_xorshift)\
+    CDSUNIT_DECLARE_TEST(SkipListSet_rcu_shb_cmp_xorshift_stat)\
+    CDSUNIT_DECLARE_TEST(SkipListSet_rcu_sht_less_pascal)\
+    CDSUNIT_DECLARE_TEST(SkipListSet_rcu_sht_cmp_pascal_stat)\
+    CDSUNIT_DECLARE_TEST(SkipListSet_rcu_sht_less_xorshift)\
+    CDSUNIT_DECLARE_TEST(SkipListSet_rcu_sht_cmp_xorshift_stat)
+
+#   define CDSUNIT_DEFINE_SkipListSet_RCU_signal( IMPL, C ) \
+    TEST_SET_NOLF_EXTRACT(IMPL, C, SkipListSet_rcu_shb_less_pascal)\
+    TEST_SET_NOLF_EXTRACT(IMPL, C, SkipListSet_rcu_shb_cmp_pascal_stat)\
+    TEST_SET_NOLF_EXTRACT(IMPL, C, SkipListSet_rcu_shb_less_xorshift)\
+    TEST_SET_NOLF_EXTRACT(IMPL, C, SkipListSet_rcu_shb_cmp_xorshift_stat)\
+    TEST_SET_NOLF_EXTRACT(IMPL, C, SkipListSet_rcu_sht_less_pascal)\
+    TEST_SET_NOLF_EXTRACT(IMPL, C, SkipListSet_rcu_sht_cmp_pascal_stat)\
+    TEST_SET_NOLF_EXTRACT(IMPL, C, SkipListSet_rcu_sht_less_xorshift)\
+    TEST_SET_NOLF_EXTRACT(IMPL, C, SkipListSet_rcu_sht_cmp_xorshift_stat)
 
 #   define CDSUNIT_TEST_SkipListSet_RCU_signal \
     CPPUNIT_TEST(SkipListSet_rcu_shb_less_pascal)\
 
 #else
 #   define CDSUNIT_DECLARE_SkipListSet_RCU_signal
+#   define CDSUNIT_DEFINE_SkipListSet_RCU_signal( IMPL, C )
 #   define CDSUNIT_TEST_SkipListSet_RCU_signal
 #endif
 
 #define CDSUNIT_DECLARE_SkipListSet \
-    TEST_SET_NOLF_EXTRACT(SkipListSet_hp_less_pascal)\
-    TEST_SET_NOLF_EXTRACT(SkipListSet_hp_cmp_pascal_stat)\
-    TEST_SET_NOLF_EXTRACT(SkipListSet_hp_less_xorshift)\
-    TEST_SET_NOLF_EXTRACT(SkipListSet_hp_cmp_xorshift_stat)\
-    TEST_SET_NOLF_EXTRACT(SkipListSet_dhp_less_pascal)\
-    TEST_SET_NOLF_EXTRACT(SkipListSet_dhp_cmp_pascal_stat)\
-    TEST_SET_NOLF_EXTRACT(SkipListSet_dhp_less_xorshift)\
-    TEST_SET_NOLF_EXTRACT(SkipListSet_dhp_cmp_xorshift_stat)\
-    TEST_SET_NOLF_EXTRACT(SkipListSet_rcu_gpi_less_pascal)\
-    TEST_SET_NOLF_EXTRACT(SkipListSet_rcu_gpi_cmp_pascal_stat)\
-    TEST_SET_NOLF_EXTRACT(SkipListSet_rcu_gpi_less_xorshift)\
-    TEST_SET_NOLF_EXTRACT(SkipListSet_rcu_gpi_cmp_xorshift_stat)\
-    TEST_SET_NOLF_EXTRACT(SkipListSet_rcu_gpb_less_pascal)\
-    TEST_SET_NOLF_EXTRACT(SkipListSet_rcu_gpb_cmp_pascal_stat)\
-    TEST_SET_NOLF_EXTRACT(SkipListSet_rcu_gpb_less_xorshift)\
-    TEST_SET_NOLF_EXTRACT(SkipListSet_rcu_gpb_cmp_xorshift_stat)\
-    TEST_SET_NOLF_EXTRACT(SkipListSet_rcu_gpt_less_pascal)\
-    TEST_SET_NOLF_EXTRACT(SkipListSet_rcu_gpt_cmp_pascal_stat)\
-    TEST_SET_NOLF_EXTRACT(SkipListSet_rcu_gpt_less_xorshift)\
-    TEST_SET_NOLF_EXTRACT(SkipListSet_rcu_gpt_cmp_xorshift_stat)\
+    CDSUNIT_DECLARE_TEST(SkipListSet_hp_less_pascal)\
+    CDSUNIT_DECLARE_TEST(SkipListSet_hp_cmp_pascal_stat)\
+    CDSUNIT_DECLARE_TEST(SkipListSet_hp_less_xorshift)\
+    CDSUNIT_DECLARE_TEST(SkipListSet_hp_cmp_xorshift_stat)\
+    CDSUNIT_DECLARE_TEST(SkipListSet_dhp_less_pascal)\
+    CDSUNIT_DECLARE_TEST(SkipListSet_dhp_cmp_pascal_stat)\
+    CDSUNIT_DECLARE_TEST(SkipListSet_dhp_less_xorshift)\
+    CDSUNIT_DECLARE_TEST(SkipListSet_dhp_cmp_xorshift_stat)\
+    CDSUNIT_DECLARE_TEST(SkipListSet_rcu_gpi_less_pascal)\
+    CDSUNIT_DECLARE_TEST(SkipListSet_rcu_gpi_cmp_pascal_stat)\
+    CDSUNIT_DECLARE_TEST(SkipListSet_rcu_gpi_less_xorshift)\
+    CDSUNIT_DECLARE_TEST(SkipListSet_rcu_gpi_cmp_xorshift_stat)\
+    CDSUNIT_DECLARE_TEST(SkipListSet_rcu_gpb_less_pascal)\
+    CDSUNIT_DECLARE_TEST(SkipListSet_rcu_gpb_cmp_pascal_stat)\
+    CDSUNIT_DECLARE_TEST(SkipListSet_rcu_gpb_less_xorshift)\
+    CDSUNIT_DECLARE_TEST(SkipListSet_rcu_gpb_cmp_xorshift_stat)\
+    CDSUNIT_DECLARE_TEST(SkipListSet_rcu_gpt_less_pascal)\
+    CDSUNIT_DECLARE_TEST(SkipListSet_rcu_gpt_cmp_pascal_stat)\
+    CDSUNIT_DECLARE_TEST(SkipListSet_rcu_gpt_less_xorshift)\
+    CDSUNIT_DECLARE_TEST(SkipListSet_rcu_gpt_cmp_xorshift_stat)\
     CDSUNIT_DECLARE_SkipListSet_RCU_signal
 
+#define CDSUNIT_DEFINE_SkipListSet(IMPL, C) \
+    TEST_SET_NOLF_EXTRACT(IMPL, C, SkipListSet_hp_less_pascal)\
+    TEST_SET_NOLF_EXTRACT(IMPL, C, SkipListSet_hp_cmp_pascal_stat)\
+    TEST_SET_NOLF_EXTRACT(IMPL, C, SkipListSet_hp_less_xorshift)\
+    TEST_SET_NOLF_EXTRACT(IMPL, C, SkipListSet_hp_cmp_xorshift_stat)\
+    TEST_SET_NOLF_EXTRACT(IMPL, C, SkipListSet_dhp_less_pascal)\
+    TEST_SET_NOLF_EXTRACT(IMPL, C, SkipListSet_dhp_cmp_pascal_stat)\
+    TEST_SET_NOLF_EXTRACT(IMPL, C, SkipListSet_dhp_less_xorshift)\
+    TEST_SET_NOLF_EXTRACT(IMPL, C, SkipListSet_dhp_cmp_xorshift_stat)\
+    TEST_SET_NOLF_EXTRACT(IMPL, C, SkipListSet_rcu_gpi_less_pascal)\
+    TEST_SET_NOLF_EXTRACT(IMPL, C, SkipListSet_rcu_gpi_cmp_pascal_stat)\
+    TEST_SET_NOLF_EXTRACT(IMPL, C, SkipListSet_rcu_gpi_less_xorshift)\
+    TEST_SET_NOLF_EXTRACT(IMPL, C, SkipListSet_rcu_gpi_cmp_xorshift_stat)\
+    TEST_SET_NOLF_EXTRACT(IMPL, C, SkipListSet_rcu_gpb_less_pascal)\
+    TEST_SET_NOLF_EXTRACT(IMPL, C, SkipListSet_rcu_gpb_cmp_pascal_stat)\
+    TEST_SET_NOLF_EXTRACT(IMPL, C, SkipListSet_rcu_gpb_less_xorshift)\
+    TEST_SET_NOLF_EXTRACT(IMPL, C, SkipListSet_rcu_gpb_cmp_xorshift_stat)\
+    TEST_SET_NOLF_EXTRACT(IMPL, C, SkipListSet_rcu_gpt_less_pascal)\
+    TEST_SET_NOLF_EXTRACT(IMPL, C, SkipListSet_rcu_gpt_cmp_pascal_stat)\
+    TEST_SET_NOLF_EXTRACT(IMPL, C, SkipListSet_rcu_gpt_less_xorshift)\
+    TEST_SET_NOLF_EXTRACT(IMPL, C, SkipListSet_rcu_gpt_cmp_xorshift_stat)\
+    CDSUNIT_DEFINE_SkipListSet_RCU_signal( IMPL, C )
+
 #define CDSUNIT_TEST_SkipListSet \
     CPPUNIT_TEST(SkipListSet_hp_less_pascal)\
     CPPUNIT_TEST(SkipListSet_hp_cmp_pascal_stat)\
 
 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
 #   define CDSUNIT_DECLARE_EllenBinTreeSet_RCU_signal \
-        TEST_SET_NOLF_EXTRACT(EllenBinTreeSet_rcu_shb)\
-        TEST_SET_NOLF_EXTRACT(EllenBinTreeSet_rcu_shb_stat)\
-        TEST_SET_NOLF_EXTRACT(EllenBinTreeSet_rcu_sht)\
-        TEST_SET_NOLF_EXTRACT(EllenBinTreeSet_rcu_sht_stat)
+        CDSUNIT_DECLARE_TEST(EllenBinTreeSet_rcu_shb)\
+        CDSUNIT_DECLARE_TEST(EllenBinTreeSet_rcu_shb_stat)\
+        CDSUNIT_DECLARE_TEST(EllenBinTreeSet_rcu_sht)\
+        CDSUNIT_DECLARE_TEST(EllenBinTreeSet_rcu_sht_stat)
+
+#   define CDSUNIT_DEFINE_EllenBinTreeSet_RCU_signal( IMPL, C ) \
+        TEST_SET_NOLF_EXTRACT(IMPL, C, EllenBinTreeSet_rcu_shb)\
+        TEST_SET_NOLF_EXTRACT(IMPL, C, EllenBinTreeSet_rcu_shb_stat)\
+        TEST_SET_NOLF_EXTRACT(IMPL, C, EllenBinTreeSet_rcu_sht)\
+        TEST_SET_NOLF_EXTRACT(IMPL, C, EllenBinTreeSet_rcu_sht_stat)
 
 #   define CDSUNIT_TEST_EllenBinTreeSet_RCU_signal \
         CPPUNIT_TEST(EllenBinTreeSet_rcu_shb)\
         CPPUNIT_TEST(EllenBinTreeSet_rcu_sht_stat)
 #else
 #   define CDSUNIT_DECLARE_EllenBinTreeSet_RCU_signal
+#   define CDSUNIT_DEFINE_EllenBinTreeSet_RCU_signal( IMPL, C )
 #   define CDSUNIT_TEST_EllenBinTreeSet_RCU_signal
 #endif
 
 #define CDSUNIT_DECLARE_EllenBinTreeSet \
-    TEST_SET_NOLF_EXTRACT(EllenBinTreeSet_hp)\
-    TEST_SET_NOLF_EXTRACT(EllenBinTreeSet_yield_hp)\
-    TEST_SET_NOLF_EXTRACT(EllenBinTreeSet_hp_stat)\
-    TEST_SET_NOLF_EXTRACT(EllenBinTreeSet_dhp)\
-    TEST_SET_NOLF_EXTRACT(EllenBinTreeSet_yield_dhp)\
-    TEST_SET_NOLF_EXTRACT(EllenBinTreeSet_dhp_stat)\
-    TEST_SET_NOLF_EXTRACT(EllenBinTreeSet_rcu_gpi)\
-    TEST_SET_NOLF_EXTRACT(EllenBinTreeSet_rcu_gpi_stat)\
-    TEST_SET_NOLF_EXTRACT(EllenBinTreeSet_rcu_gpb)\
-    TEST_SET_NOLF_EXTRACT(EllenBinTreeSet_yield_rcu_gpb)\
-    TEST_SET_NOLF_EXTRACT(EllenBinTreeSet_rcu_gpb_stat)\
-    TEST_SET_NOLF_EXTRACT(EllenBinTreeSet_rcu_gpt)\
-    TEST_SET_NOLF_EXTRACT(EllenBinTreeSet_rcu_gpt_stat)\
+    CDSUNIT_DECLARE_TEST(EllenBinTreeSet_hp)\
+    CDSUNIT_DECLARE_TEST(EllenBinTreeSet_yield_hp)\
+    CDSUNIT_DECLARE_TEST(EllenBinTreeSet_hp_stat)\
+    CDSUNIT_DECLARE_TEST(EllenBinTreeSet_dhp)\
+    CDSUNIT_DECLARE_TEST(EllenBinTreeSet_yield_dhp)\
+    CDSUNIT_DECLARE_TEST(EllenBinTreeSet_dhp_stat)\
+    CDSUNIT_DECLARE_TEST(EllenBinTreeSet_rcu_gpi)\
+    CDSUNIT_DECLARE_TEST(EllenBinTreeSet_rcu_gpi_stat)\
+    CDSUNIT_DECLARE_TEST(EllenBinTreeSet_rcu_gpb)\
+    CDSUNIT_DECLARE_TEST(EllenBinTreeSet_yield_rcu_gpb)\
+    CDSUNIT_DECLARE_TEST(EllenBinTreeSet_rcu_gpb_stat)\
+    CDSUNIT_DECLARE_TEST(EllenBinTreeSet_rcu_gpt)\
+    CDSUNIT_DECLARE_TEST(EllenBinTreeSet_rcu_gpt_stat)\
     CDSUNIT_DECLARE_EllenBinTreeSet_RCU_signal
 
+#define CDSUNIT_DEFINE_EllenBinTreeSet( IMPL, C ) \
+    TEST_SET_NOLF_EXTRACT(IMPL, C, EllenBinTreeSet_hp)\
+    TEST_SET_NOLF_EXTRACT(IMPL, C, EllenBinTreeSet_yield_hp)\
+    TEST_SET_NOLF_EXTRACT(IMPL, C, EllenBinTreeSet_hp_stat)\
+    TEST_SET_NOLF_EXTRACT(IMPL, C, EllenBinTreeSet_dhp)\
+    TEST_SET_NOLF_EXTRACT(IMPL, C, EllenBinTreeSet_yield_dhp)\
+    TEST_SET_NOLF_EXTRACT(IMPL, C, EllenBinTreeSet_dhp_stat)\
+    TEST_SET_NOLF_EXTRACT(IMPL, C, EllenBinTreeSet_rcu_gpi)\
+    TEST_SET_NOLF_EXTRACT(IMPL, C, EllenBinTreeSet_rcu_gpi_stat)\
+    TEST_SET_NOLF_EXTRACT(IMPL, C, EllenBinTreeSet_rcu_gpb)\
+    TEST_SET_NOLF_EXTRACT(IMPL, C, EllenBinTreeSet_yield_rcu_gpb)\
+    TEST_SET_NOLF_EXTRACT(IMPL, C, EllenBinTreeSet_rcu_gpb_stat)\
+    TEST_SET_NOLF_EXTRACT(IMPL, C, EllenBinTreeSet_rcu_gpt)\
+    TEST_SET_NOLF_EXTRACT(IMPL, C, EllenBinTreeSet_rcu_gpt_stat)\
+    CDSUNIT_DEFINE_EllenBinTreeSet_RCU_signal(IMPL, C)
+
 #define CDSUNIT_TEST_EllenBinTreeSet \
     CPPUNIT_TEST(EllenBinTreeSet_hp)\
     CPPUNIT_TEST(EllenBinTreeSet_yield_hp)\
 
 
 #define CDSUNIT_DECLARE_StripedSet_common \
-    TEST_SET(StripedSet_list) \
-    TEST_SET(StripedSet_vector) \
-    TEST_SET(StripedSet_set) \
-    TEST_SET(StripedSet_hashset) \
-    TEST_SET(StripedSet_boost_unordered_set)
+    CDSUNIT_DECLARE_TEST(StripedSet_list) \
+    CDSUNIT_DECLARE_TEST(StripedSet_vector) \
+    CDSUNIT_DECLARE_TEST(StripedSet_set) \
+    CDSUNIT_DECLARE_TEST(StripedSet_hashset) \
+    CDSUNIT_DECLARE_TEST(StripedSet_boost_unordered_set)
+
+#define CDSUNIT_DEFINE_StripedSet_common( IMPL, C ) \
+    TEST_SET(IMPL, C, StripedSet_list) \
+    TEST_SET(IMPL, C, StripedSet_vector) \
+    TEST_SET(IMPL, C, StripedSet_set) \
+    TEST_SET(IMPL, C, StripedSet_hashset) \
+    TEST_SET(IMPL, C, StripedSet_boost_unordered_set)
+
 #define CDSUNIT_TEST_StripedSet_common \
     CPPUNIT_TEST(StripedSet_list) \
     CPPUNIT_TEST(StripedSet_vector) \
 
 #if BOOST_VERSION >= 104800
 #   define CDSUNIT_DECLARE_StripedSet_boost_container \
-    TEST_SET(StripedSet_boost_list) \
-    TEST_SET(StripedSet_boost_slist) \
-    TEST_SET(StripedSet_boost_vector) \
-    TEST_SET(StripedSet_boost_stable_vector) \
-    TEST_SET(StripedSet_boost_set)
+    CDSUNIT_DECLARE_TEST(StripedSet_boost_list) \
+    CDSUNIT_DECLARE_TEST(StripedSet_boost_slist) \
+    CDSUNIT_DECLARE_TEST(StripedSet_boost_vector) \
+    CDSUNIT_DECLARE_TEST(StripedSet_boost_stable_vector) \
+    CDSUNIT_DECLARE_TEST(StripedSet_boost_set)
+
+#   define CDSUNIT_DEFINE_StripedSet_boost_container( IMPL, C ) \
+    TEST_SET(IMPL, C, StripedSet_boost_list) \
+    TEST_SET(IMPL, C, StripedSet_boost_slist) \
+    TEST_SET(IMPL, C, StripedSet_boost_vector) \
+    TEST_SET(IMPL, C, StripedSet_boost_stable_vector) \
+    TEST_SET(IMPL, C, StripedSet_boost_set)
+
 #   define CDSUNIT_TEST_StripedSet_boost_container \
     CPPUNIT_TEST(StripedSet_boost_list) \
     CPPUNIT_TEST(StripedSet_boost_slist) \
     CPPUNIT_TEST(StripedSet_boost_set)
 #else
 #   define CDSUNIT_DECLARE_StripedSet_boost_container
+#   define CDSUNIT_DEFINE_StripedSet_boost_container( IMPL, C )
 #   define CDSUNIT_TEST_StripedSet_boost_container
 #endif
 
 #if BOOST_VERSION >= 104800 && defined(CDS_UNIT_SET_TYPES_ENABLE_BOOST_FLAT_CONTAINERS)
 #   define CDSUNIT_DECLARE_StripedSet_boost_flat_container \
-    TEST_SET(StripedSet_boost_flat_set)
+    CDSUNIT_DECLARE_TEST(StripedSet_boost_flat_set)
+#   define CDSUNIT_DEFINE_StripedSet_boost_flat_container( IMPL, C ) \
+    TEST_SET(IMPL, C, StripedSet_boost_flat_set)
 #   define CDSUNIT_TEST_StripedSet_boost_flat_container \
     CPPUNIT_TEST(StripedSet_boost_flat_set)
 #else
 #   define CDSUNIT_DECLARE_StripedSet_boost_flat_container
+#   define CDSUNIT_DEFINE_StripedSet_boost_flat_container( IMPL, C )
 #   define CDSUNIT_TEST_StripedSet_boost_flat_container
 #endif
 
     CDSUNIT_DECLARE_StripedSet_common \
     CDSUNIT_DECLARE_StripedSet_boost_container \
     CDSUNIT_DECLARE_StripedSet_boost_flat_container
+#define CDSUNIT_DEFINE_StripedSet( IMPL, C ) \
+    CDSUNIT_DEFINE_StripedSet_common( IMPL, C ) \
+    CDSUNIT_DEFINE_StripedSet_boost_container( IMPL, C ) \
+    CDSUNIT_DEFINE_StripedSet_boost_flat_container( IMPL, C )
 #define CDSUNIT_TEST_StripedSet \
     CDSUNIT_TEST_StripedSet_common \
     CDSUNIT_TEST_StripedSet_boost_container \
 
 
 #define CDSUNIT_DECLARE_RefinableSet_common \
-    TEST_SET(RefinableSet_list) \
-    TEST_SET(RefinableSet_vector) \
-    TEST_SET(RefinableSet_set) \
-    TEST_SET(RefinableSet_hashset) \
-    TEST_SET(RefinableSet_boost_unordered_set)
+    CDSUNIT_DECLARE_TEST(RefinableSet_list) \
+    CDSUNIT_DECLARE_TEST(RefinableSet_vector) \
+    CDSUNIT_DECLARE_TEST(RefinableSet_set) \
+    CDSUNIT_DECLARE_TEST(RefinableSet_hashset) \
+    CDSUNIT_DECLARE_TEST(RefinableSet_boost_unordered_set)
+#define CDSUNIT_DEFINE_RefinableSet_common(IMPL, C) \
+    TEST_SET(IMPL, C, RefinableSet_list) \
+    TEST_SET(IMPL, C, RefinableSet_vector) \
+    TEST_SET(IMPL, C, RefinableSet_set) \
+    TEST_SET(IMPL, C, RefinableSet_hashset) \
+    TEST_SET(IMPL, C, RefinableSet_boost_unordered_set)
 #define CDSUNIT_TEST_RefinableSet_common \
     CPPUNIT_TEST(RefinableSet_list) \
     CPPUNIT_TEST(RefinableSet_vector) \
 
 #if BOOST_VERSION >= 104800
 #   define CDSUNIT_DECLARE_RefinableSet_boost_container \
-    TEST_SET(RefinableSet_boost_list) \
-    TEST_SET(RefinableSet_boost_slist) \
-    TEST_SET(RefinableSet_boost_vector) \
-    TEST_SET(RefinableSet_boost_stable_vector) \
-    TEST_SET(RefinableSet_boost_set)
+    CDSUNIT_DECLARE_TEST(RefinableSet_boost_list) \
+    CDSUNIT_DECLARE_TEST(RefinableSet_boost_slist) \
+    CDSUNIT_DECLARE_TEST(RefinableSet_boost_vector) \
+    CDSUNIT_DECLARE_TEST(RefinableSet_boost_stable_vector) \
+    CDSUNIT_DECLARE_TEST(RefinableSet_boost_set)
+#   define CDSUNIT_DEFINE_RefinableSet_boost_container( IMPL, C ) \
+    TEST_SET(IMPL, C, RefinableSet_boost_list) \
+    TEST_SET(IMPL, C, RefinableSet_boost_slist) \
+    TEST_SET(IMPL, C, RefinableSet_boost_vector) \
+    TEST_SET(IMPL, C, RefinableSet_boost_stable_vector) \
+    TEST_SET(IMPL, C, RefinableSet_boost_set)
 #   define CDSUNIT_TEST_RefinableSet_boost_container \
     CPPUNIT_TEST(RefinableSet_boost_list) \
     CPPUNIT_TEST(RefinableSet_boost_slist) \
     CPPUNIT_TEST(RefinableSet_boost_set)
 #else
 #   define CDSUNIT_DECLARE_RefinableSet_boost_container
+#   define CDSUNIT_DEFINE_RefinableSet_boost_container( IMPL, C ) \
 #   define CDSUNIT_TEST_RefinableSet_boost_container
 #endif
 
 #if BOOST_VERSION >= 104800 && defined(CDS_UNIT_SET_TYPES_ENABLE_BOOST_FLAT_CONTAINERS)
 #   define CDSUNIT_DECLARE_RefinableSet_boost_flat_container \
-    TEST_SET(RefinableSet_boost_flat_set)
+    CDSUNIT_DECLARE_TEST(RefinableSet_boost_flat_set)
+#   define CDSUNIT_DEFINE_RefinableSet_boost_flat_container( IMPL, C ) \
+    TEST_SET(IMPL, C, RefinableSet_boost_flat_set)
 #   define CDSUNIT_TEST_RefinableSet_boost_flat_container \
     CPPUNIT_TEST(RefinableSet_boost_flat_set)
 #else
 #   define CDSUNIT_DECLARE_RefinableSet_boost_flat_container
+#   define CDSUNIT_DEFINE_RefinableSet_boost_flat_container( IMPL, C )
 #   define CDSUNIT_TEST_RefinableSet_boost_flat_container
 #endif
 
     CDSUNIT_DECLARE_RefinableSet_common \
     CDSUNIT_DECLARE_RefinableSet_boost_container \
     CDSUNIT_DECLARE_RefinableSet_boost_flat_container
+#define CDSUNIT_DEFINE_RefinableSet( IMPL, C ) \
+    CDSUNIT_DEFINE_RefinableSet_common( IMPL, C ) \
+    CDSUNIT_DEFINE_RefinableSet_boost_container( IMPL, C ) \
+    CDSUNIT_DEFINE_RefinableSet_boost_flat_container( IMPL, C )
 #define CDSUNIT_TEST_RefinableSet \
     CDSUNIT_TEST_RefinableSet_common \
     CDSUNIT_TEST_RefinableSet_boost_container \
index f06102c9e09a0bbcfd347ac2417b69e4826d79d2..b6291a14068806365b94d796cc8371b65ab1722e 100644 (file)
@@ -1,15 +1,15 @@
 //$$CDS-header$$
 
 #include "cppunit/thread.h"
-#include "set2/set_types.h"
+#include "set2/set_type.h"
 #include <algorithm> // random_shuffle
 
 namespace set2 {
 
-#    define TEST_SET(X)         void X() { test<SetTypes<key_type, value_type>::X >()    ; }
-#    define TEST_SET_EXTRACT(X) void X() { test_extract<SetTypes<key_type, value_type>::X >()    ; }
-#    define TEST_SET_NOLF(X)    void X() { test_nolf<SetTypes<key_type, value_type>::X >()    ; }
-#    define TEST_SET_NOLF_EXTRACT(X)    void X() { test_nolf_extract<SetTypes<key_type, value_type>::X >()    ; }
+#    define TEST_SET(IMPL, C, X)         void C::X() { test<set_type<IMPL, key_type, value_type>::X >(); }
+#    define TEST_SET_EXTRACT(IMPL, C, X) void C::X() { test_extract<set_type<IMPL, key_type, value_type>::X >(); }
+#    define TEST_SET_NOLF(IMPL, C, X)    void C::X() { test_nolf<set_type<IMPL, key_type, value_type>::X >(); }
+#    define TEST_SET_NOLF_EXTRACT(IMPL, C, X) void C::X() { test_nolf_extract<set_type<IMPL, key_type, value_type>::X >(); }
 
     namespace {
         struct key_thread
@@ -26,7 +26,7 @@ namespace set2 {
             {}
         };
 
-        typedef SetTypes<key_thread, size_t>::key_val     key_value_pair;
+        typedef set_type_base<key_thread, size_t>::key_val     key_value_pair;
     }
 
     template <>
index 80ca8d5c4e7369cfee43999070b1275973b9d699..2e543c2071ba75f4805dadb7d7361b2a30d45ffa 100644 (file)
@@ -1,8 +1,11 @@
 //$$CDS-header$$
 
 #include "set2/set_delodd.h"
+#include "set2/set_type_cuckoo.h"
 
 namespace set2 {
+    CDSUNIT_DEFINE_CuckooSet( cc::cuckoo::implementation_tag, Set_DelOdd )
+
     CPPUNIT_TEST_SUITE_PART( Set_DelOdd, run_CuckooSet )
         CDSUNIT_TEST_CuckooSet
     CPPUNIT_TEST_SUITE_END_PART()
index 6bd29b493d9a2cfa431b3ac78bfa95292ff5d986..e4f856273c64f93fc3ecdfcdca234462f67cbe96 100644 (file)
@@ -1,8 +1,11 @@
 //$$CDS-header$$
 
 #include "set2/set_delodd.h"
+#include "set2/set_type_ellen_bintree.h"
 
 namespace set2 {
+    CDSUNIT_DEFINE_EllenBinTreeSet( cc::ellen_bintree::implementation_tag, Set_DelOdd )
+
     CPPUNIT_TEST_SUITE_PART( Set_DelOdd, run_EllenBinTreeSet )
         CDSUNIT_TEST_EllenBinTreeSet
     CPPUNIT_TEST_SUITE_END_PART()
index a98847217fe5ac3b0d178dbcf9588f62cfe2ed3b..ac7c470c87f36b8f70dcfd18b1f604d4ae0c4bac 100644 (file)
@@ -1,8 +1,11 @@
 //$$CDS-header$$
 
 #include "set2/set_delodd.h"
+#include "set2/set_type_michael.h"
 
 namespace set2 {
+    CDSUNIT_DEFINE_MichaelSet(cc::michael_set::implementation_tag, Set_DelOdd)
+
     CPPUNIT_TEST_SUITE_PART( Set_DelOdd, run_MichaelSet )
         CDSUNIT_TEST_MichaelSet
     CPPUNIT_TEST_SUITE_END_PART()
index 2a07299961564bdc6d95a2283363cf01a85d32ab..58a00472fc37a27ff37c4d54683e62afaf12b276 100644 (file)
@@ -1,8 +1,11 @@
 //$$CDS-header$$
 
 #include "set2/set_delodd.h"
+#include "set2/set_type_skip_list.h"
 
 namespace set2 {
+    CDSUNIT_DEFINE_SkipListSet(cc::skip_list::implementation_tag, Set_DelOdd)
+
     CPPUNIT_TEST_SUITE_PART( Set_DelOdd, run_SkipListSet )
         CDSUNIT_TEST_SkipListSet
     CPPUNIT_TEST_SUITE_END_PART()
index 85e8ba0894f278d5adb045e869306816a9acd223..993fdcdf1c367f930c7c09d3c81e06976b47dbac 100644 (file)
@@ -1,8 +1,11 @@
 //$$CDS-header$$
 
 #include "set2/set_delodd.h"
+#include "set2/set_type_split_list.h"
 
 namespace set2 {
+    CDSUNIT_DEFINE_SplitList(cc::split_list::implementation_tag, Set_DelOdd)
+
     CPPUNIT_TEST_SUITE_PART( Set_DelOdd, run_SplitList )
         CDSUNIT_TEST_SplitList
     CPPUNIT_TEST_SUITE_END_PART()
index cb72e34c7a46e8b8e6e302b1309766d56989e856..4ec5714ce82d846adc799a901570e8bfa6fb98e0 100644 (file)
@@ -1,6 +1,7 @@
 //$$CDS-header$$
 
 #include "set2/set_insdel_func.h"
+#include "set2/set_type_michael.h"
 
 namespace set2 {
 
@@ -14,6 +15,7 @@ namespace set2 {
     size_t  Set_InsDel_func::c_nMaxLoadFactor = 8    ;  // maximum load factor
     bool    Set_InsDel_func::c_bPrintGCState = true;
 
+    CDSUNIT_DEFINE_MichaelSet( cc::michael_set::implementation_tag, Set_InsDel_func )
 
     CPPUNIT_TEST_SUITE_PART( Set_InsDel_func, run_MichaelSet )
         CDSUNIT_TEST_MichaelSet
index 4d38066a40e472506b1094538755342881d0e679..88b2ff82a285d7d745ee162654be0449927dd0ea 100644 (file)
@@ -4,17 +4,16 @@
 #include <vector>
 #include <mutex>    //unique_lock
 
-#include "set2/set_types.h"
+#include "set2/set_type.h"
 #include "cppunit/thread.h"
-
 #include <cds/sync/spinlock.h>
 
 namespace set2 {
 
-#   define TEST_SET(X)          void X() { test<SetTypes<key_type, value_type>::X >()    ; }
-#   define TEST_SET_EXTRACT(X)  TEST_SET(X)
-#   define TEST_SET_NOLF(X)     void X() { test_nolf<SetTypes<key_type, value_type>::X >()    ; }
-#   define TEST_SET_NOLF_EXTRACT(X) TEST_SET_NOLF(X)
+#   define TEST_SET(IMPL, C, X)          void C::X() { test<set_type<IMPL, key_type, value_type>::X >(); }
+#   define TEST_SET_EXTRACT(IMPL, C, X)  TEST_SET(IMPL, C, X)
+#   define TEST_SET_NOLF(IMPL, C, X)     void C::X() { test_nolf<set_type<IMPL, key_type, value_type>::X >(); }
+#   define TEST_SET_NOLF_EXTRACT(IMPL, C, X) TEST_SET_NOLF(IMPL, C, X)
 
     class Set_InsDel_func: public CppUnitMini::TestCase
     {
index 5db7020440e5be28198316a09cce19ae157c1cf3..ce87451bc39496b6f287523c9389bc8f34dbd202 100644 (file)
@@ -1,8 +1,11 @@
 //$$CDS-header$$
 
 #include "set2/set_insdel_func.h"
+#include "set2/set_type_cuckoo.h"
 
 namespace set2 {
+    CDSUNIT_DEFINE_CuckooSet( cc::cuckoo::implementation_tag, Set_InsDel_func )
+
     CPPUNIT_TEST_SUITE_PART( Set_InsDel_func, run_CuckooSet )
         CDSUNIT_TEST_CuckooSet
     CPPUNIT_TEST_SUITE_END_PART()
index d711857055c7df9ccd28c1209d359905776898ec..58028ca6008d6ae340f91a47ed4ed0a7d0282ed5 100644 (file)
@@ -1,8 +1,11 @@
 //$$CDS-header$$
 
 #include "set2/set_insdel_func.h"
+#include "set2/set_type_ellen_bintree.h"
 
 namespace set2 {
+    CDSUNIT_DEFINE_EllenBinTreeSet( cc::ellen_bintree::implementation_tag, Set_InsDel_func )
+
     CPPUNIT_TEST_SUITE_PART( Set_InsDel_func, run_EllenBinTreeSet )
         CDSUNIT_TEST_EllenBinTreeSet
     CPPUNIT_TEST_SUITE_END_PART()
index ac6ef504c9810c52271a4b03960fc195cb9183e9..c990bfd87d5f59ce5bc4b58eef96a493096f6eb6 100644 (file)
@@ -1,8 +1,11 @@
 //$$CDS-header$$
 
 #include "set2/set_insdel_func.h"
+#include "set2/set_type_striped.h"
 
 namespace set2 {
+    CDSUNIT_DEFINE_RefinableSet( cc::striped_set::implementation_tag, Set_InsDel_func )
+
     CPPUNIT_TEST_SUITE_PART( Set_InsDel_func, run_RefinableSet )
         CDSUNIT_TEST_RefinableSet
     CPPUNIT_TEST_SUITE_END_PART()
index 3a2765a4f1309d3d7f2a0f84bb2be73fee19d56c..cc77d2a75eb9510f7ee7c2da48807bb127184d16 100644 (file)
@@ -1,10 +1,12 @@
 //$$CDS-header$$
 
 #include "set2/set_insdel_func.h"
+#include "set2/set_type_skip_list.h"
 
 namespace set2 {
+    CDSUNIT_DEFINE_SkipListSet(cc::skip_list::implementation_tag, Set_InsDel_func)
+
     CPPUNIT_TEST_SUITE_PART( Set_InsDel_func, run_SkipListSet )
         CDSUNIT_TEST_SkipListSet
     CPPUNIT_TEST_SUITE_END_PART()
-
 } // namespace set2
index fc77c6e2b138b906e164154c64b34d71567b8b6d..c80a878a19c18399fd24d7a3ce01e4ec5e4c05c9 100644 (file)
@@ -1,8 +1,11 @@
 //$$CDS-header$$
 
 #include "set2/set_insdel_func.h"
+#include "set2/set_type_split_list.h"
 
 namespace set2 {
+    CDSUNIT_DEFINE_SplitList(cc::split_list::implementation_tag, Set_InsDel_func)
+
     CPPUNIT_TEST_SUITE_PART( Set_InsDel_func, run_SplitList )
         CDSUNIT_TEST_SplitList
     CPPUNIT_TEST_SUITE_END_PART()
index f1951abef92b01fe67674c0fe6c09f1da37c2fd7..492492f2c3c3fee3718d91cad90c935e1a160b62 100644 (file)
@@ -1,8 +1,10 @@
 //$$CDS-header$$
 
 #include "set2/set_insdel_func.h"
+#include "set2/set_type_striped.h"
 
 namespace set2 {
+    CDSUNIT_DEFINE_StripedSet( cc::striped_set::implementation_tag, Set_InsDel_func )
 
     CPPUNIT_TEST_SUITE_PART( Set_InsDel_func, run_StripedSet )
         CDSUNIT_TEST_StripedSet
index 359368fa40e93b3bffc16cf9ca60251f6b72497c..fb3a01a0c23581097d1e96ff49bea1250c083af6 100644 (file)
@@ -1,16 +1,16 @@
 //$$CDS-header$$
 
-#include "set2/set_types.h"
+#include "set2/set_type.h"
 #include "cppunit/thread.h"
 
 #include <vector>
 
 namespace set2 {
 
-#   define TEST_SET(X)          void X() { test<SetTypes<key_type, value_type>::X >(); }
-#   define TEST_SET_EXTRACT(X)  void X() { test_extract<SetTypes<key_type, value_type>::X >(); }
-#   define TEST_SET_NOLF(X)     void X() { test_nolf<SetTypes<key_type, value_type>::X >(); }
-#   define TEST_SET_NOLF_EXTRACT(X) void X() { test_nolf_extract<SetTypes<key_type, value_type>::X >(); }
+#   define TEST_SET(IMPL, C, X)          void C::X() { test<set_type<IMPL, key_type, value_type>::X >(); }
+#   define TEST_SET_EXTRACT(IMPL, C, X)  void C::X() { test_extract<set_type<IMPL, key_type, value_type>::X >(); }
+#   define TEST_SET_NOLF(IMPL, C, X)     void C::X() { test_nolf<set_type<IMPL, key_type, value_type>::X >(); }
+#   define TEST_SET_NOLF_EXTRACT(IMPL, C, X) void C::X() { test_nolf_extract<set_type<IMPL, key_type, value_type>::X >(); }
 
     class Set_InsDel_string: public CppUnitMini::TestCase
     {
index 0f5e506d810f602db2408cb564872143b5b75326..ee7219c24d5314216c1549e86bd4366dc5051756 100644 (file)
@@ -1,8 +1,11 @@
 //$$CDS-header$$
 
 #include "set2/set_insdel_string.h"
+#include "set2/set_type_cuckoo.h"
 
 namespace set2 {
+    CDSUNIT_DEFINE_CuckooSet( cc::cuckoo::implementation_tag, Set_InsDel_string )
+
     CPPUNIT_TEST_SUITE_PART( Set_InsDel_string, run_CuckooSet )
         CDSUNIT_TEST_CuckooSet
     CPPUNIT_TEST_SUITE_END_PART()
index cb6bec8be7f7ba59420805ec9c4c2898410fa2ea..e05d42b2038f66ae65194eef730e718c27d6be98 100644 (file)
@@ -1,8 +1,11 @@
 //$$CDS-header$$
 
 #include "set2/set_insdel_string.h"
+#include "set2/set_type_ellen_bintree.h"
 
 namespace set2 {
+    CDSUNIT_DEFINE_EllenBinTreeSet( cc::ellen_bintree::implementation_tag, Set_InsDel_string )
+
     CPPUNIT_TEST_SUITE_PART( Set_InsDel_string, run_EllenBinTreeSet )
         CDSUNIT_TEST_EllenBinTreeSet
     CPPUNIT_TEST_SUITE_END_PART()
index b7be88fc8cd135a068c5cd7cf416b4596b29dcc9..7c45b807cbde7cc1e2ee09067df40c44fb970ff7 100644 (file)
@@ -1,8 +1,11 @@
 //$$CDS-header$$
 
 #include "set2/set_insdel_string.h"
+#include "set2/set_type_michael.h"
 
 namespace set2 {
+    CDSUNIT_DEFINE_MichaelSet( cc::michael_set::implementation_tag, Set_InsDel_string )
+
     CPPUNIT_TEST_SUITE_PART( Set_InsDel_string, run_MichaelSet )
         CDSUNIT_TEST_MichaelSet
     CPPUNIT_TEST_SUITE_END_PART()
index fb14006ef6ab0eeeae09dc2ba678ea5ba9994e1a..33c2a0d01141ef87cf56d2b0fc69ef0e2c80580e 100644 (file)
@@ -1,8 +1,11 @@
 //$$CDS-header$$
 
 #include "set2/set_insdel_string.h"
+#include "set2/set_type_striped.h"
 
 namespace set2 {
+    CDSUNIT_DEFINE_RefinableSet( cc::striped_set::implementation_tag, Set_InsDel_string )
+
     CPPUNIT_TEST_SUITE_PART( Set_InsDel_string, run_RefinableSet )
         CDSUNIT_TEST_RefinableSet
     CPPUNIT_TEST_SUITE_END_PART()
index 4c98a6adc760b61f6eaa4b41f89cc6a8ea0716b7..562cba269df85f76c98a5433922d0658821b681d 100644 (file)
@@ -1,8 +1,11 @@
 //$$CDS-header$$
 
 #include "set2/set_insdel_string.h"
+#include "set2/set_type_skip_list.h"
 
 namespace set2 {
+    CDSUNIT_DEFINE_SkipListSet(cc::skip_list::implementation_tag, Set_InsDel_string)
+
     CPPUNIT_TEST_SUITE_PART( Set_InsDel_string, run_SkipListSet )
         CDSUNIT_TEST_SkipListSet
     CPPUNIT_TEST_SUITE_END_PART()
index 821d0bdb130347756c8262848ac9af341801536f..d851e9b2a41bcdce81bdeb59bbf7c59c072263d4 100644 (file)
@@ -1,8 +1,11 @@
 //$$CDS-header$$
 
 #include "set2/set_insdel_string.h"
+#include "set2/set_type_split_list.h"
 
 namespace set2 {
+    CDSUNIT_DEFINE_SplitList(cc::split_list::implementation_tag, Set_InsDel_string)
+
     CPPUNIT_TEST_SUITE_PART( Set_InsDel_string, run_SplitList )
         CDSUNIT_TEST_SplitList
     CPPUNIT_TEST_SUITE_END_PART()
index 8a8f3cceca2b19535de69f8cc6193b7be2700588..b383122c51753e49e4b5177299286c7439bc4c16 100644 (file)
@@ -1,8 +1,11 @@
 //$$CDS-header$$
 
 #include "set2/set_insdel_string.h"
+#include "set2/set_type_std.h"
 
 namespace set2 {
+    CDSUNIT_DEFINE_StdSet(std_implementation_tag, Set_InsDel_string)
+
     CPPUNIT_TEST_SUITE_PART( Set_InsDel_string, run_StdSet )
         CDSUNIT_TEST_StdSet
     CPPUNIT_TEST_SUITE_END_PART()
index c823c56069ab1022cb21f1e1af87b1ae9929fa48..e478bdf34b35192617d75fa50863792ce18231ba 100644 (file)
@@ -1,8 +1,11 @@
 //$$CDS-header$$
 
 #include "set2/set_insdel_string.h"
+#include "set2/set_type_striped.h"
 
 namespace set2 {
+    CDSUNIT_DEFINE_StripedSet( cc::striped_set::implementation_tag, Set_InsDel_string )
+
     CPPUNIT_TEST_SUITE_PART( Set_InsDel_string, run_StripedSet )
         CDSUNIT_TEST_StripedSet
     CPPUNIT_TEST_SUITE_END_PART()
index 82c61d74de53c5291ca283bbd9e7e867baa3a582..be326ac38fff6a1580262515f218dc9899cd4979 100644 (file)
@@ -55,17 +55,4 @@ namespace set2 {
 
         endTestCase();
     }
-
-    /*
-        CPPUNIT_TEST_SUITE_( Set_InsDelFind, "Map_InsDelFind" )
-            CDSUNIT_TEST_MichaelSet
-            CDSUNIT_TEST_SplitList
-            CDSUNIT_TEST_SkipListSet
-            CDSUNIT_TEST_EllenBinTreeSet
-            CDSUNIT_TEST_StripedSet
-            CDSUNIT_TEST_RefinableSet
-            CDSUNIT_TEST_CuckooSet
-            CDSUNIT_TEST_StdSet
-        CPPUNIT_TEST_SUITE_END()
-        */
 } // namespace set2
index 2a128cbdb319f24f78dba638f1abf1a657b046f8..fbf828872bde31cc180495835f98581987878e78 100644 (file)
@@ -1,15 +1,15 @@
 //$$CDS-header$$
 
-#include "set2/set_types.h"
+#include "set2/set_type.h"
 #include "cppunit/thread.h"
 #include <algorithm> // random_shuffle
 
 namespace set2 {
 
-#   define TEST_SET(X)          void X() { test<SetTypes<key_type, value_type>::X >()    ; }
-#   define TEST_SET_EXTRACT(X)  TEST_SET(X)
-#   define TEST_SET_NOLF(X)    void X() { test_nolf<SetTypes<key_type, value_type>::X >()    ; }
-#   define TEST_SET_NOLF_EXTRACT(X) TEST_SET_NOLF(X)
+#   define TEST_SET(IMPL, C, X)          void C::X() { test<set_type<IMPL, key_type, value_type>::X >()    ; }
+#   define TEST_SET_EXTRACT(IMPL, C, X)  TEST_SET(IMPL, C, X)
+#   define TEST_SET_NOLF(IMPL, C, X)     void C::X() { test_nolf<set_type<IMPL, key_type, value_type>::X >()    ; }
+#   define TEST_SET_NOLF_EXTRACT(IMPL, C, X) TEST_SET_NOLF(IMPL, C, X)
 
     class Set_InsDelFind: public CppUnitMini::TestCase
     {
index f5986abdb7b606097c6e64e11eb77240ddd0a76b..fee46ea3fb677043cfdebba7ab838b06864b1cbf 100644 (file)
@@ -1,8 +1,11 @@
 //$$CDS-header$$
 
 #include "set2/set_insdelfind.h"
+#include "set2/set_type_cuckoo.h"
 
 namespace set2 {
+    CDSUNIT_DEFINE_CuckooSet( cc::cuckoo::implementation_tag, Set_InsDelFind )
+
     CPPUNIT_TEST_SUITE_PART( Set_InsDelFind, run_CuckooSet )
         CDSUNIT_TEST_CuckooSet
     CPPUNIT_TEST_SUITE_END_PART()
index db2a7e37fee3b9ef6e6a36903ee29c9ce3860084..5501237065fedbc992a8eddc7605f66372987855 100644 (file)
@@ -1,8 +1,11 @@
 //$$CDS-header$$
 
 #include "set2/set_insdelfind.h"
+#include "set2/set_type_ellen_bintree.h"
 
 namespace set2 {
+    CDSUNIT_DEFINE_EllenBinTreeSet( cc::ellen_bintree::implementation_tag, Set_InsDelFind )
+
     CPPUNIT_TEST_SUITE_PART( Set_InsDelFind, run_EllenBinTreeSet )
         CDSUNIT_TEST_EllenBinTreeSet
     CPPUNIT_TEST_SUITE_END_PART()
index 631111ff290050343fb4433d5827b3525c45099d..dc4ca5649e9dacf16a3e5015f92c14278ab26d93 100644 (file)
@@ -1,8 +1,12 @@
 //$$CDS-header$$
 
 #include "set2/set_insdelfind.h"
+#include "set2/set_type_michael.h"
+
 
 namespace set2 {
+    CDSUNIT_DEFINE_MichaelSet( cc::michael_set::implementation_tag, Set_InsDelFind )
+
     CPPUNIT_TEST_SUITE_PART( Set_InsDelFind, run_MichaelSet )
         CDSUNIT_TEST_MichaelSet
     CPPUNIT_TEST_SUITE_END_PART()
index 942113e539bfd8e23261619038b6913d016876cc..ac969d477561e2d5c2a9a6dc7e5d2f10bbde1bde 100644 (file)
@@ -1,8 +1,11 @@
 //$$CDS-header$$
 
 #include "set2/set_insdelfind.h"
+#include "set2/set_type_striped.h"
 
 namespace set2 {
+    CDSUNIT_DEFINE_RefinableSet( cc::striped_set::implementation_tag, Set_InsDelFind )
+
     CPPUNIT_TEST_SUITE_PART( Set_InsDelFind, run_RefinableSet )
         CDSUNIT_TEST_RefinableSet
     CPPUNIT_TEST_SUITE_END_PART()
index 8e498651d3cc6b333541830039eacf3b7b186407..102c51d3b8ef60d91bd421abd5697daf5dd53875 100644 (file)
@@ -1,8 +1,11 @@
 //$$CDS-header$$
 
 #include "set2/set_insdelfind.h"
+#include "set2/set_type_skip_list.h"
 
 namespace set2 {
+    CDSUNIT_DEFINE_SkipListSet(cc::skip_list::implementation_tag, Set_InsDelFind)
+
     CPPUNIT_TEST_SUITE_PART( Set_InsDelFind, run_SkipListSet )
         CDSUNIT_TEST_SkipListSet
     CPPUNIT_TEST_SUITE_END_PART()
index c16b852351516fad3201f19201a077cbf252ecc9..4c393df3e4016741ed8ba225a7e232c30894a030 100644 (file)
@@ -1,8 +1,11 @@
 //$$CDS-header$$
 
 #include "set2/set_insdelfind.h"
+#include "set2/set_type_split_list.h"
 
 namespace set2 {
+    CDSUNIT_DEFINE_SplitList(cc::split_list::implementation_tag, Set_InsDelFind)
+
     CPPUNIT_TEST_SUITE_PART( Set_InsDelFind, run_SplitList )
         CDSUNIT_TEST_SplitList
     CPPUNIT_TEST_SUITE_END_PART()
index 7543b88ad7906ee521b54a25a0656f7652c46b9c..d5e999d91397122440bdbe88616a7dd91c980bda 100644 (file)
@@ -1,8 +1,11 @@
 //$$CDS-header$$
 
 #include "set2/set_insdelfind.h"
+#include "set2/set_type_std.h"
 
 namespace set2 {
+    CDSUNIT_DEFINE_StdSet(std_implementation_tag, Set_InsDelFind)
+
     CPPUNIT_TEST_SUITE_PART( Set_InsDelFind, run_StdSet )
         CDSUNIT_TEST_StdSet
     CPPUNIT_TEST_SUITE_END_PART()
index f98d69f9753dd95143dd83a58172109e9c82e1fb..15bb78883ecca9c645f120ae518a05a080533055 100644 (file)
@@ -1,8 +1,11 @@
 //$$CDS-header$$
 
 #include "set2/set_insdelfind.h"
+#include "set2/set_type_striped.h"
 
 namespace set2 {
+    CDSUNIT_DEFINE_StripedSet( cc::striped_set::implementation_tag, Set_InsDelFind )
+
     CPPUNIT_TEST_SUITE_PART( Set_InsDelFind, run_StripedSet )
         CDSUNIT_TEST_StripedSet
     CPPUNIT_TEST_SUITE_END_PART()
diff --git a/tests/unit/set2/set_type.h b/tests/unit/set2/set_type.h
new file mode 100644 (file)
index 0000000..b36e8b7
--- /dev/null
@@ -0,0 +1,215 @@
+//$$CDS-header$$
+
+#ifndef CDSUNIT_SET_TYPE_H
+#define CDSUNIT_SET_TYPE_H
+
+#include <cds/urcu/general_instant.h>
+#include <cds/urcu/general_buffered.h>
+#include <cds/urcu/general_threaded.h>
+#include <cds/urcu/signal_buffered.h>
+#include <cds/urcu/signal_threaded.h>
+
+#include <cds/opt/hash.h>
+#include <cds/sync/spinlock.h>
+#include <boost/functional/hash/hash.hpp>
+
+#include "cppunit/cppunit_mini.h"
+#include "lock/nolock.h"
+#include "michael_alloc.h"
+
+namespace set2 {
+    namespace cc = cds::container;
+    namespace co = cds::opt;
+
+    typedef cds::urcu::gc< cds::urcu::general_instant<> >   rcu_gpi;
+    typedef cds::urcu::gc< cds::urcu::general_buffered<> >  rcu_gpb;
+    typedef cds::urcu::gc< cds::urcu::general_threaded<> >  rcu_gpt;
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+    typedef cds::urcu::gc< cds::urcu::signal_buffered<> >  rcu_shb;
+    typedef cds::urcu::gc< cds::urcu::signal_threaded<> >  rcu_sht;
+#endif
+
+    template <typename Key>
+    struct cmp {
+        int operator ()(Key const& k1, Key const& k2) const
+        {
+            if ( std::less<Key>( k1, k2 ) )
+                return -1;
+            return std::less<Key>( k2, k1 ) ? 1 : 0;
+        }
+    };
+
+#define CDSUNIT_INT_COMPARE(t)  template <> struct cmp<t> { int operator()( t k1, t k2 ){ return (int)(k1 - k2); } }
+    CDSUNIT_INT_COMPARE(char);
+    CDSUNIT_INT_COMPARE(unsigned char);
+    CDSUNIT_INT_COMPARE(int);
+    CDSUNIT_INT_COMPARE(unsigned int);
+    CDSUNIT_INT_COMPARE(long);
+    CDSUNIT_INT_COMPARE(unsigned long);
+    CDSUNIT_INT_COMPARE(long long);
+    CDSUNIT_INT_COMPARE(unsigned long long);
+#undef CDSUNIT_INT_COMPARE
+
+    template <>
+    struct cmp<std::string>
+    {
+        int operator()(std::string const& s1, std::string const& s2)
+        {
+            return s1.compare( s2 );
+        }
+        int operator()(std::string const& s1, char const * s2)
+        {
+            return s1.compare( s2 );
+        }
+        int operator()(char const * s1, std::string const& s2)
+        {
+            return -s2.compare( s1 );
+        }
+    };
+
+    // forward
+    template <typename ImplSelector, typename Key, typename Value>
+    struct set_type;
+
+    template <typename Key, typename Value>
+    struct set_type_base
+    {
+        typedef Key     key_type;
+        typedef Value   value_type;
+
+        struct key_val {
+            key_type    key;
+            value_type  val;
+
+            /*explicit*/ key_val( key_type const& k ): key(k), val() {}
+            key_val( key_type const& k, value_type const& v ): key(k), val(v) {}
+
+            template <typename K>
+            /*explicit*/ key_val( K const& k ): key(k) {}
+
+            template <typename K, typename T>
+            key_val( K const& k, T const& v ): key(k), val(v) {}
+        };
+
+        typedef co::v::hash<key_type>   key_hash;
+        typedef std::less<key_type>     key_less;
+        typedef cmp<key_type>           key_compare;
+
+        struct less {
+            bool operator()( key_val const& k1, key_val const& k2 ) const
+            {
+                return key_less()( k1.key, k2.key );
+            }
+            bool operator()( key_type const& k1, key_val const& k2 ) const
+            {
+                return key_less()( k1, k2.key );
+            }
+            bool operator()( key_val const& k1, key_type const& k2 ) const
+            {
+                return key_less()( k1.key, k2 );
+            }
+        };
+
+        struct compare {
+            int operator()( key_val const& k1, key_val const& k2 ) const
+            {
+                return key_compare()( k1.key, k2.key );
+            }
+            int operator()( key_type const& k1, key_val const& k2 ) const
+            {
+                return key_compare()( k1, k2.key );
+            }
+            int operator()( key_val const& k1, key_type const& k2 ) const
+            {
+                return key_compare()( k1.key, k2 );
+            }
+        };
+
+        struct equal_to {
+            bool operator()( key_val const& k1, key_val const& k2 ) const
+            {
+                return key_compare()( k1.key, k2.key ) == 0;
+            }
+            bool operator()( key_type const& k1, key_val const& k2 ) const
+            {
+                return key_compare()( k1, k2.key ) == 0;
+            }
+            bool operator()( key_val const& k1, key_type const& k2 ) const
+            {
+                return key_compare()( k1.key, k2 ) == 0;
+            }
+        };
+
+
+        struct hash: public key_hash
+        {
+            size_t operator()( key_val const& v ) const
+            {
+                return key_hash::operator()( v.key );
+            }
+            size_t operator()( key_type const& key ) const
+            {
+                return key_hash::operator()( key );
+            }
+            template <typename Q>
+            size_t operator()( Q const& k ) const
+            {
+                return key_hash::operator()( k );
+            }
+        };
+
+        struct hash2: public hash
+        {
+            size_t operator()( key_val const& k ) const
+            {
+                size_t seed = ~hash::operator ()( k );
+                boost::hash_combine( seed, k.key );
+                return seed;
+            }
+            size_t operator()( key_type const& k ) const
+            {
+                size_t seed = ~hash::operator ()( k );
+                boost::hash_combine( seed, k );
+                return seed;
+            }
+            template <typename Q>
+            size_t operator()( Q const& k ) const
+            {
+                return key_hash::operator()( k );
+            }
+        };
+    };
+
+
+    // *************************************************
+    // print_stat
+    // *************************************************
+
+    template <typename Set>
+    static inline void print_stat( Set const& /*s*/ )
+    {}
+
+
+    //*******************************************************
+    // additional_check
+    //*******************************************************
+
+    template <typename Set>
+    static inline void additional_check( Set& /*set*/ )
+    {}
+
+    template <typename Set>
+    static inline void additional_cleanup( Set& /*set*/ )
+    {}
+
+    //*******************************************************
+    // check_before_clear
+    //*******************************************************
+
+    template <typename Set>
+    static inline void check_before_clear( Set& /*s*/ )
+    {}
+
+}   // namespace set2
+
+#endif // ifndef CDSUNIT_SET_TYPE_H
diff --git a/tests/unit/set2/set_type_cuckoo.h b/tests/unit/set2/set_type_cuckoo.h
new file mode 100644 (file)
index 0000000..bd868bd
--- /dev/null
@@ -0,0 +1,170 @@
+//$$CDS-header$$
+
+#ifndef CDSUNIT_SET_TYPE_CUCKOO_H
+#define CDSUNIT_SET_TYPE_CUCKOO_H
+
+#include "set2/set_type.h"
+
+#include <cds/container/cuckoo_set.h>
+#include "print_cuckoo_stat.h"
+
+namespace set2 {
+
+    template <typename V, typename Traits>
+    class CuckooSet : public cc::CuckooSet< V, Traits >
+    {
+    public:
+        typedef cc::CuckooSet< V, Traits > cuckoo_base_class;
+
+    public:
+        CuckooSet( size_t nCapacity, size_t nLoadFactor )
+            : cuckoo_base_class( nCapacity / (nLoadFactor * 16), (unsigned int)4 )
+        {}
+
+        template <typename Q, typename Pred>
+        bool erase_with( Q const& key, Pred /*pred*/ )
+        {
+            return cuckoo_base_class::erase_with( key, typename std::conditional< cuckoo_base_class::c_isSorted, Pred, typename Pred::equal_to>::type() );
+        }
+    };
+
+
+    template <typename Key, typename Val>
+    struct set_type< cds::intrusive::cuckoo::implementation_tag, Key, Val >: public set_type_base< Key, Val >
+    {
+        typedef set_type_base< Key, Val > base_class;
+        using base_class::key_val;
+        using base_class::compare;
+        using base_class::less;
+        using base_class::hash;
+        using base_class::hash2;
+
+        // ***************************************************************************
+        // CuckooSet
+
+        template <typename Traits>
+        struct traits_CuckooStripedSet : public Traits
+        {
+            typedef cc::cuckoo::striping<> mutex_policy;
+        };
+        template <typename Traits>
+        struct traits_CuckooRefinableSet : public Traits
+        {
+            typedef cc::cuckoo::refinable<> mutex_policy;
+        };
+
+        struct traits_CuckooSet_list_unord :
+            public cc::cuckoo::make_traits <
+                cc::cuckoo::probeset_type< cc::cuckoo::list >
+                , co::equal_to< equal_to >
+                , co::hash< std::tuple< hash, hash2 > >
+            > ::type
+        {};
+        typedef CuckooSet< key_val, traits_CuckooStripedSet<traits_CuckooSet_list_unord>> CuckooStripedSet_list_unord;
+        typedef CuckooSet< key_val, traits_CuckooRefinableSet<traits_CuckooSet_list_unord>> CuckooRefinableSet_list_unord;
+
+        struct traits_CuckooSet_list_unord_stat : public traits_CuckooSet_list_unord
+        {
+            typedef cc::cuckoo::stat stat;
+        };
+        typedef CuckooSet< key_val, traits_CuckooStripedSet<traits_CuckooSet_list_unord_stat>> CuckooStripedSet_list_unord_stat;
+        typedef CuckooSet< key_val, traits_CuckooRefinableSet<traits_CuckooSet_list_unord_stat>> CuckooRefinableSet_list_unord_stat;
+
+        struct traits_CuckooSet_list_unord_storehash : public traits_CuckooSet_list_unord
+        {
+            static CDS_CONSTEXPR const bool store_hash = true;
+        };
+        typedef CuckooSet< key_val, traits_CuckooStripedSet<traits_CuckooSet_list_unord_storehash>> CuckooStripedSet_list_unord_storehash;
+        typedef CuckooSet< key_val, traits_CuckooRefinableSet<traits_CuckooSet_list_unord_storehash>> CuckooRefinableSet_list_unord_storehash;
+
+        struct traits_CuckooSet_list_ord :
+            public cc::cuckoo::make_traits <
+                cc::cuckoo::probeset_type< cc::cuckoo::list >
+                , co::compare< compare >
+                , co::hash< std::tuple< hash, hash2 > >
+            > ::type
+        {};
+        typedef CuckooSet< key_val, traits_CuckooStripedSet<traits_CuckooSet_list_ord>> CuckooStripedSet_list_ord;
+        typedef CuckooSet< key_val, traits_CuckooRefinableSet<traits_CuckooSet_list_ord>> CuckooRefinableSet_list_ord;
+
+        struct traits_CuckooSet_list_ord_stat : public traits_CuckooSet_list_ord
+        {
+            typedef cc::cuckoo::stat stat;
+        };
+        typedef CuckooSet< key_val, traits_CuckooStripedSet<traits_CuckooSet_list_ord_stat>> CuckooStripedSet_list_ord_stat;
+        typedef CuckooSet< key_val, traits_CuckooRefinableSet<traits_CuckooSet_list_ord_stat>> CuckooRefinableSet_list_ord_stat;
+
+        struct traits_CuckooSet_list_ord_storehash : public traits_CuckooSet_list_ord
+        {
+            static CDS_CONSTEXPR const bool store_hash = true;
+        };
+        typedef CuckooSet< key_val, traits_CuckooStripedSet<traits_CuckooSet_list_ord_storehash>> CuckooStripedSet_list_ord_storehash;
+        typedef CuckooSet< key_val, traits_CuckooRefinableSet<traits_CuckooSet_list_ord_storehash>> CuckooRefinableSet_list_ord_storehash;
+
+
+        struct traits_CuckooSet_vector_unord :
+            public cc::cuckoo::make_traits <
+                cc::cuckoo::probeset_type< cc::cuckoo::vector<4> >
+                , co::equal_to< equal_to >
+                , co::hash< std::tuple< hash, hash2 > >
+            > ::type
+        {};
+        typedef CuckooSet< key_val, traits_CuckooStripedSet<traits_CuckooSet_vector_unord>> CuckooStripedSet_vector_unord;
+        typedef CuckooSet< key_val, traits_CuckooRefinableSet<traits_CuckooSet_vector_unord>> CuckooRefinableSet_vector_unord;
+
+        struct traits_CuckooSet_vector_unord_stat : public traits_CuckooSet_vector_unord
+        {
+            typedef cc::cuckoo::stat stat;
+        };
+        typedef CuckooSet< key_val, traits_CuckooStripedSet<traits_CuckooSet_vector_unord_stat>> CuckooStripedSet_vector_unord_stat;
+        typedef CuckooSet< key_val, traits_CuckooRefinableSet<traits_CuckooSet_vector_unord_stat>> CuckooRefinableSet_vector_unord_stat;
+
+        struct traits_CuckooSet_vector_unord_storehash : public traits_CuckooSet_vector_unord
+        {
+            static CDS_CONSTEXPR const bool store_hash = true;
+        };
+        typedef CuckooSet< key_val, traits_CuckooStripedSet<traits_CuckooSet_vector_unord_storehash>> CuckooStripedSet_vector_unord_storehash;
+        typedef CuckooSet< key_val, traits_CuckooRefinableSet<traits_CuckooSet_vector_unord_storehash>> CuckooRefinableSet_vector_unord_storehash;
+
+        struct traits_CuckooSet_vector_ord :
+            public cc::cuckoo::make_traits <
+                cc::cuckoo::probeset_type< cc::cuckoo::vector<4> >
+                , co::compare< compare >
+                , co::hash< std::tuple< hash, hash2 > >
+            > ::type
+        {};
+        typedef CuckooSet< key_val, traits_CuckooStripedSet<traits_CuckooSet_vector_ord>> CuckooStripedSet_vector_ord;
+        typedef CuckooSet< key_val, traits_CuckooRefinableSet<traits_CuckooSet_vector_ord>> CuckooRefinableSet_vector_ord;
+
+        struct traits_CuckooSet_vector_ord_stat : public traits_CuckooSet_vector_ord
+        {
+            typedef cc::cuckoo::stat stat;
+        };
+        typedef CuckooSet< key_val, traits_CuckooStripedSet<traits_CuckooSet_vector_ord_stat>> CuckooStripedSet_vector_ord_stat;
+        typedef CuckooSet< key_val, traits_CuckooRefinableSet<traits_CuckooSet_vector_ord_stat>> CuckooRefinableSet_vector_ord_stat;
+
+        struct traits_CuckooSet_vector_ord_storehash : public traits_CuckooSet_vector_ord
+        {
+            static CDS_CONSTEXPR const bool store_hash = true;
+        };
+        typedef CuckooSet< key_val, traits_CuckooStripedSet<traits_CuckooSet_vector_ord_storehash>> CuckooStripedSet_vector_ord_storehash;
+        typedef CuckooSet< key_val, traits_CuckooRefinableSet<traits_CuckooSet_vector_ord_storehash>> CuckooRefinableSet_vector_ord_storehash;
+
+    };
+
+    template <typename T, typename Traits >
+    static inline void print_stat( cc::CuckooSet< T, Traits > const& s )
+    {
+        CPPUNIT_MSG( s.statistics() << s.mutex_policy_statistics() );
+    }
+
+    template <typename V, typename Traits>
+    static inline void print_stat( CuckooSet< V, Traits > const& s )
+    {
+        typedef CuckooSet< V, Traits > set_type;
+        print_stat( static_cast<typename set_type::cuckoo_base_class const&>(s) );
+    }
+
+} // namespace set2
+
+#endif // #ifndef CDSUNIT_SET_TYPE_CUCKOO_H
diff --git a/tests/unit/set2/set_type_ellen_bintree.h b/tests/unit/set2/set_type_ellen_bintree.h
new file mode 100644 (file)
index 0000000..2a5b173
--- /dev/null
@@ -0,0 +1,275 @@
+//$$CDS-header$$
+
+#ifndef CDSUNIT_SET_TYPE_ELLEN_BINTREE_H
+#define CDSUNIT_SET_TYPE_ELLEN_BINTREE_H
+
+#include "set2/set_type.h"
+
+#include <cds/container/ellen_bintree_set_rcu.h>
+#include <cds/container/ellen_bintree_set_hp.h>
+#include <cds/container/ellen_bintree_set_dhp.h>
+
+#include "print_ellenbintree_stat.h"
+
+namespace set2 {
+
+    template <typename Key, typename Val>
+    struct set_type< cc::ellen_bintree::implementation_tag, Key, Val >: public set_type_base< Key, Val >
+    {
+        typedef set_type_base< Key, Val > base_class;
+        using base_class::key_val;
+        using base_class::compare;
+        using base_class::less;
+        using base_class::hash;
+
+        struct ellen_bintree_props {
+            struct key_extractor {
+                void operator()( key_type& dest, key_val const& src ) const
+                {
+                    dest = src.key;
+                }
+            };
+
+            struct less {
+                bool operator()( key_val const& v1, key_val const& v2 ) const
+                {
+                    return key_less()( v1.key, v2.key );
+                }
+                bool operator()( key_type const& k, key_val const& v ) const
+                {
+                    return key_less()( k, v.key );
+                }
+                bool operator()( key_val const& v, key_type const& k ) const
+                {
+                    return key_less()( v.key, k );
+                }
+                bool operator()( key_type const& k1, key_type const& k2 ) const
+                {
+                    return key_less()( k1, k2 );
+                }
+            };
+
+            struct hp_gc {
+                typedef cc::ellen_bintree::node<cds::gc::HP, key_val>               leaf_node;
+                typedef cc::ellen_bintree::internal_node< key_type, leaf_node >     internal_node;
+                typedef cc::ellen_bintree::update_desc< leaf_node, internal_node >  update_desc;
+            };
+
+            struct dhp_gc {
+                typedef cc::ellen_bintree::node<cds::gc::DHP, key_val>              leaf_node;
+                typedef cc::ellen_bintree::internal_node< key_type, leaf_node >     internal_node;
+                typedef cc::ellen_bintree::update_desc< leaf_node, internal_node >  update_desc;
+            };
+
+            struct gpi {
+                typedef cc::ellen_bintree::node<rcu_gpi, key_val>                   leaf_node;
+                typedef cc::ellen_bintree::internal_node< key_type, leaf_node >     internal_node;
+                typedef cc::ellen_bintree::update_desc< leaf_node, internal_node >  update_desc;
+            };
+            struct gpb {
+                typedef cc::ellen_bintree::node<rcu_gpb, key_val>                   leaf_node;
+                typedef cc::ellen_bintree::internal_node< key_type, leaf_node >     internal_node;
+                typedef cc::ellen_bintree::update_desc< leaf_node, internal_node >  update_desc;
+            };
+            struct gpt {
+                typedef cc::ellen_bintree::node<rcu_gpt, key_val>                   leaf_node;
+                typedef cc::ellen_bintree::internal_node< key_type, leaf_node >     internal_node;
+                typedef cc::ellen_bintree::update_desc< leaf_node, internal_node >  update_desc;
+            };
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+            struct shb {
+                typedef cc::ellen_bintree::node<rcu_shb, key_val>                   leaf_node;
+                typedef cc::ellen_bintree::internal_node< key_type, leaf_node >     internal_node;
+                typedef cc::ellen_bintree::update_desc< leaf_node, internal_node >  update_desc;
+            };
+            struct sht {
+                typedef cc::ellen_bintree::node<rcu_sht, key_val>                   leaf_node;
+                typedef cc::ellen_bintree::internal_node< key_type, leaf_node >     internal_node;
+                typedef cc::ellen_bintree::update_desc< leaf_node, internal_node >  update_desc;
+            };
+#endif
+        };
+
+        struct traits_EllenBinTreeSet: public cc::ellen_bintree::make_set_traits<
+            cc::ellen_bintree::key_extractor< typename ellen_bintree_props::key_extractor >
+            ,co::less< typename ellen_bintree_props::less >
+            ,co::node_allocator< ellen_bintree_pool::internal_node_allocator< int > >
+        >::type
+        {};
+
+        struct traits_EllenBinTreeSet_hp : public traits_EllenBinTreeSet
+        {
+            typedef cds::memory::pool_allocator< typename ellen_bintree_props::hp_gc::update_desc, ellen_bintree_pool::update_desc_pool_accessor > update_desc_allocator;
+        };
+        typedef cc::EllenBinTreeSet< cds::gc::HP, key_type, key_val, traits_EllenBinTreeSet_hp > EllenBinTreeSet_hp;
+
+        struct traits_EllenBinTreeSet_dhp : public traits_EllenBinTreeSet
+        {
+            typedef cds::memory::pool_allocator< typename ellen_bintree_props::dhp_gc::update_desc, ellen_bintree_pool::update_desc_pool_accessor > update_desc_allocator;
+        };
+        typedef cc::EllenBinTreeSet< cds::gc::DHP, key_type, key_val, traits_EllenBinTreeSet_dhp > EllenBinTreeSet_dhp;
+
+        struct traits_EllenBinTreeSet_gpi : public traits_EllenBinTreeSet
+        {
+            typedef cds::memory::pool_allocator< typename ellen_bintree_props::gpi::update_desc, ellen_bintree_pool::update_desc_pool_accessor > update_desc_allocator;
+        };
+        typedef cc::EllenBinTreeSet< rcu_gpi, key_type, key_val, traits_EllenBinTreeSet_gpi > EllenBinTreeSet_rcu_gpi;
+
+        struct traits_EllenBinTreeSet_gpb : public traits_EllenBinTreeSet
+        {
+            typedef cds::memory::pool_allocator< typename ellen_bintree_props::gpb::update_desc, ellen_bintree_pool::update_desc_pool_accessor > update_desc_allocator;
+        };
+        typedef cc::EllenBinTreeSet< rcu_gpb, key_type, key_val, traits_EllenBinTreeSet_gpb > EllenBinTreeSet_rcu_gpb;
+
+        struct traits_EllenBinTreeSet_gpt : public traits_EllenBinTreeSet
+        {
+            typedef cds::memory::pool_allocator< typename ellen_bintree_props::gpt::update_desc, ellen_bintree_pool::update_desc_pool_accessor > update_desc_allocator;
+        };
+        typedef cc::EllenBinTreeSet< rcu_gpt, key_type, key_val, traits_EllenBinTreeSet_gpt > EllenBinTreeSet_rcu_gpt;
+
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        struct traits_EllenBinTreeSet_shb : public traits_EllenBinTreeSet
+        {
+            typedef cds::memory::pool_allocator< typename ellen_bintree_props::shb::update_desc, ellen_bintree_pool::update_desc_pool_accessor > update_desc_allocator;
+        };
+        typedef cc::EllenBinTreeSet< rcu_shb, key_type, key_val, traits_EllenBinTreeSet_shb > EllenBinTreeSet_rcu_shb;
+
+        struct traits_EllenBinTreeSet_sht : public traits_EllenBinTreeSet
+        {
+            typedef cds::memory::pool_allocator< typename ellen_bintree_props::sht::update_desc, ellen_bintree_pool::update_desc_pool_accessor > update_desc_allocator;
+        };
+        typedef cc::EllenBinTreeSet< rcu_sht, key_type, key_val, traits_EllenBinTreeSet_sht > EllenBinTreeSet_rcu_sht;
+#endif
+
+        //
+        struct traits_EllenBinTreeSet_yield : public traits_EllenBinTreeSet
+        {
+            typedef cds::backoff::yield back_off;
+        };
+
+        struct traits_EllenBinTreeSet_yield_hp : public traits_EllenBinTreeSet_yield
+        {
+            typedef cds::memory::pool_allocator< typename ellen_bintree_props::hp_gc::update_desc, ellen_bintree_pool::update_desc_pool_accessor > update_desc_allocator;
+        };
+        typedef cc::EllenBinTreeSet< cds::gc::HP, key_type, key_val, traits_EllenBinTreeSet_yield_hp > EllenBinTreeSet_yield_hp;
+
+        struct traits_EllenBinTreeSet_yield_dhp : public traits_EllenBinTreeSet_yield
+        {
+            typedef cds::memory::pool_allocator< typename ellen_bintree_props::dhp_gc::update_desc, ellen_bintree_pool::update_desc_pool_accessor > update_desc_allocator;
+        };
+        typedef cc::EllenBinTreeSet< cds::gc::DHP, key_type, key_val, traits_EllenBinTreeSet_yield_dhp > EllenBinTreeSet_yield_dhp;
+
+
+        struct traits_EllenBinTreeSet_yield_gpb : public traits_EllenBinTreeSet_yield
+        {
+            typedef cds::memory::pool_allocator< typename ellen_bintree_props::gpb::update_desc, ellen_bintree_pool::update_desc_pool_accessor > update_desc_allocator;
+        };
+        typedef cc::EllenBinTreeSet< rcu_gpb, key_type, key_val, traits_EllenBinTreeSet_yield_gpb > EllenBinTreeSet_yield_rcu_gpb;
+
+
+        struct traits_EllenBinTreeSet_stat: public cc::ellen_bintree::make_set_traits<
+            cc::ellen_bintree::key_extractor< typename ellen_bintree_props::key_extractor >
+            ,co::less< typename ellen_bintree_props::less >
+            ,co::node_allocator< ellen_bintree_pool::internal_node_allocator< int > >
+            ,co::stat< cc::ellen_bintree::stat<> >
+        >::type
+        {};
+
+        struct traits_EllenBinTreeSet_stat_hp : public traits_EllenBinTreeSet_stat
+        {
+            typedef cds::memory::pool_allocator< typename ellen_bintree_props::hp_gc::update_desc, ellen_bintree_pool::update_desc_pool_accessor > update_desc_allocator;
+        };
+        typedef cc::EllenBinTreeSet< cds::gc::HP, key_type, key_val, traits_EllenBinTreeSet_stat_hp > EllenBinTreeSet_hp_stat;
+
+        struct traits_EllenBinTreeSet_stat_dhp : public traits_EllenBinTreeSet_stat
+        {
+            typedef cds::memory::pool_allocator< typename ellen_bintree_props::dhp_gc::update_desc, ellen_bintree_pool::update_desc_pool_accessor > update_desc_allocator;
+        };
+        typedef cc::EllenBinTreeSet< cds::gc::DHP, key_type, key_val, traits_EllenBinTreeSet_stat_dhp > EllenBinTreeSet_dhp_stat;
+
+        struct traits_EllenBinTreeSet_stat_gpi : public traits_EllenBinTreeSet_stat
+        {
+            typedef cds::memory::pool_allocator< typename ellen_bintree_props::gpi::update_desc, ellen_bintree_pool::update_desc_pool_accessor > update_desc_allocator;
+        };
+        typedef cc::EllenBinTreeSet< rcu_gpi, key_type, key_val, traits_EllenBinTreeSet_stat_gpi > EllenBinTreeSet_rcu_gpi_stat;
+
+        struct traits_EllenBinTreeSet_stat_gpb : public traits_EllenBinTreeSet_stat
+        {
+            typedef cds::memory::pool_allocator< typename ellen_bintree_props::gpb::update_desc, ellen_bintree_pool::update_desc_pool_accessor > update_desc_allocator;
+        };
+        typedef cc::EllenBinTreeSet< rcu_gpb, key_type, key_val, traits_EllenBinTreeSet_stat_gpb > EllenBinTreeSet_rcu_gpb_stat;
+
+        struct traits_EllenBinTreeSet_stat_gpt : public traits_EllenBinTreeSet_stat
+        {
+            typedef cds::memory::pool_allocator< typename ellen_bintree_props::gpt::update_desc, ellen_bintree_pool::update_desc_pool_accessor > update_desc_allocator;
+        };
+        typedef cc::EllenBinTreeSet< rcu_gpt, key_type, key_val, traits_EllenBinTreeSet_stat_gpt > EllenBinTreeSet_rcu_gpt_stat;
+
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        struct traits_EllenBinTreeSet_stat_shb : public traits_EllenBinTreeSet_stat
+        {
+            typedef cds::memory::pool_allocator< typename ellen_bintree_props::shb::update_desc, ellen_bintree_pool::update_desc_pool_accessor > update_desc_allocator;
+        };
+        typedef cc::EllenBinTreeSet< rcu_shb, key_type, key_val, traits_EllenBinTreeSet_stat_shb > EllenBinTreeSet_rcu_shb_stat;
+
+        struct traits_EllenBinTreeSet_stat_sht : public traits_EllenBinTreeSet_stat
+        {
+            typedef cds::memory::pool_allocator< typename ellen_bintree_props::sht::update_desc, ellen_bintree_pool::update_desc_pool_accessor > update_desc_allocator;
+        };
+        typedef cc::EllenBinTreeSet< rcu_sht, key_type, key_val, traits_EllenBinTreeSet_stat_sht > EllenBinTreeSet_rcu_sht_stat;
+#endif
+
+    };
+
+    template <typename GC, typename Key, typename T, typename Traits>
+    static inline void print_stat( cc::EllenBinTreeSet<GC, Key, T, Traits> const& s )
+    {
+        CPPUNIT_MSG( s.statistics() );
+    }
+
+    namespace ellen_bintree_check {
+        static inline void check_stat( cds::intrusive::ellen_bintree::empty_stat const& /*s*/ )
+        {
+            // Not true for threaded RCU
+            /*
+            CPPUNIT_CHECK_CURRENT_EX( ellen_bintree_pool::internal_node_counter::m_nAlloc.get() == ellen_bintree_pool::internal_node_counter::m_nFree.get(),
+                "m_nAlloc=" << ellen_bintree_pool::internal_node_counter::m_nAlloc.get()
+                << ", m_nFree=" << ellen_bintree_pool::internal_node_counter::m_nFree.get()
+                );
+            */
+        }
+
+        static inline void check_stat( cds::intrusive::ellen_bintree::stat<> const& stat )
+        {
+            CPPUNIT_CHECK_CURRENT( stat.m_nInternalNodeCreated == stat.m_nInternalNodeDeleted );
+            CPPUNIT_CHECK_CURRENT( stat.m_nUpdateDescCreated == stat.m_nUpdateDescDeleted );
+            //CPPUNIT_CHECK_CURRENT( ellen_bintree_pool::internal_node_counter::m_nAlloc.get() == ellen_bintree_pool::internal_node_counter::m_nFree.get() );
+            CPPUNIT_CHECK_CURRENT( ellen_bintree_pool::internal_node_counter::m_nAlloc.get() == stat.m_nInternalNodeCreated );
+            // true if RCU is not threaded
+            //CPPUNIT_CHECK_CURRENT( stat.m_nInternalNodeDeleted == ellen_bintree_pool::internal_node_counter::m_nFree.get() );
+        }
+    }   // namespace ellen_bintree_check
+
+    template <typename GC, typename Key, typename T, typename Traits>
+    static inline void additional_check( cc::EllenBinTreeSet<GC, Key, T, Traits>& s )
+    {
+        GC::force_dispose();
+        ellen_bintree_check::check_stat( s.statistics() );
+    }
+
+    template <typename GC, typename Key, typename T, typename Traits>
+    static inline void additional_cleanup( cc::EllenBinTreeSet<GC, Key, T, Traits>& /*s*/ )
+    {
+        ellen_bintree_pool::internal_node_counter::reset();
+    }
+
+    template <typename GC, typename Key, typename T, typename Traits>
+    static inline void check_before_clear( cds::container::EllenBinTreeSet<GC, Key, T, Traits>& s )
+    {
+        CPPUNIT_CHECK_CURRENT( s.check_consistency() );
+    }
+
+
+} // namespace set2
+
+#endif // #ifndef CDSUNIT_SET_TYPE_ELLEN_BINTREE_H
diff --git a/tests/unit/set2/set_type_lazy_list.h b/tests/unit/set2/set_type_lazy_list.h
new file mode 100644 (file)
index 0000000..ca1c887
--- /dev/null
@@ -0,0 +1,116 @@
+//$$CDS-header$$
+
+#ifndef CDSUNIT_SET_TYPE_LAZY_LIST_H
+#define CDSUNIT_SET_TYPE_LAZY_LIST_H
+
+#include "set2/set_type.h"
+
+#include <cds/container/lazy_list_hp.h>
+#include <cds/container/lazy_list_dhp.h>
+#include <cds/container/lazy_list_rcu.h>
+
+namespace set2 {
+
+    template <typename Key, typename Val>
+    struct lazy_list_type
+    {
+        typedef typename set_type_base< Key, Val >::key_val key_val;
+        typedef typename set_type_base< Key, Val >::compare compare;
+        typedef typename set_type_base< Key, Val >::less    less;
+
+                struct traits_LazyList_cmp_stdAlloc :
+            public cc::lazy_list::make_traits<
+                co::compare< compare >
+            >::type
+        {};
+        typedef cc::LazyList< cds::gc::HP,  key_val, traits_LazyList_cmp_stdAlloc > LazyList_HP_cmp_stdAlloc;
+        typedef cc::LazyList< cds::gc::DHP, key_val, traits_LazyList_cmp_stdAlloc > LazyList_DHP_cmp_stdAlloc;
+        typedef cc::LazyList< rcu_gpi, key_val, traits_LazyList_cmp_stdAlloc > LazyList_RCU_GPI_cmp_stdAlloc;
+        typedef cc::LazyList< rcu_gpb, key_val, traits_LazyList_cmp_stdAlloc > LazyList_RCU_GPB_cmp_stdAlloc;
+        typedef cc::LazyList< rcu_gpt, key_val, traits_LazyList_cmp_stdAlloc > LazyList_RCU_GPT_cmp_stdAlloc;
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        typedef cc::LazyList< rcu_shb, key_val, traits_LazyList_cmp_stdAlloc > LazyList_RCU_SHB_cmp_stdAlloc;
+        typedef cc::LazyList< rcu_sht, key_val, traits_LazyList_cmp_stdAlloc > LazyList_RCU_SHT_cmp_stdAlloc;
+#endif
+        struct traits_LazyList_cmp_stdAlloc_seqcst :
+            public cc::lazy_list::make_traits<
+                co::compare< compare >
+                ,co::memory_model< co::v::sequential_consistent >
+            >::type
+        {};
+        typedef cc::LazyList< cds::gc::HP, key_val,  traits_LazyList_cmp_stdAlloc_seqcst > LazyList_HP_cmp_stdAlloc_seqcst;
+        typedef cc::LazyList< cds::gc::DHP, key_val, traits_LazyList_cmp_stdAlloc_seqcst > LazyList_DHP_cmp_stdAlloc_seqcst;
+        typedef cc::LazyList< rcu_gpi, key_val, traits_LazyList_cmp_stdAlloc_seqcst > LazyList_RCU_GPI_cmp_stdAlloc_seqcst;
+        typedef cc::LazyList< rcu_gpb, key_val, traits_LazyList_cmp_stdAlloc_seqcst > LazyList_RCU_GPB_cmp_stdAlloc_seqcst;
+        typedef cc::LazyList< rcu_gpt, key_val, traits_LazyList_cmp_stdAlloc_seqcst > LazyList_RCU_GPT_cmp_stdAlloc_seqcst;
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        typedef cc::LazyList< rcu_shb, key_val, traits_LazyList_cmp_stdAlloc_seqcst > LazyList_RCU_SHB_cmp_stdAlloc_seqcst;
+        typedef cc::LazyList< rcu_sht, key_val, traits_LazyList_cmp_stdAlloc_seqcst > LazyList_RCU_SHT_cmp_stdAlloc_seqcst;
+#endif
+        struct traits_LazyList_cmp_michaelAlloc :
+            public cc::lazy_list::make_traits<
+                co::compare< compare >,
+                co::allocator< memory::MichaelAllocator<int> >
+            >::type
+        {};
+        typedef cc::LazyList< cds::gc::HP,  key_val, traits_LazyList_cmp_michaelAlloc > LazyList_HP_cmp_michaelAlloc;
+        typedef cc::LazyList< cds::gc::DHP, key_val, traits_LazyList_cmp_michaelAlloc > LazyList_DHP_cmp_michaelAlloc;
+        typedef cc::LazyList< rcu_gpi, key_val, traits_LazyList_cmp_michaelAlloc > LazyList_RCU_GPI_cmp_michaelAlloc;
+        typedef cc::LazyList< rcu_gpb, key_val, traits_LazyList_cmp_michaelAlloc > LazyList_RCU_GPB_cmp_michaelAlloc;
+        typedef cc::LazyList< rcu_gpt, key_val, traits_LazyList_cmp_michaelAlloc > LazyList_RCU_GPT_cmp_michaelAlloc;
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        typedef cc::LazyList< rcu_shb, key_val, traits_LazyList_cmp_michaelAlloc > LazyList_RCU_SHB_cmp_michaelAlloc;
+        typedef cc::LazyList< rcu_sht, key_val, traits_LazyList_cmp_michaelAlloc > LazyList_RCU_SHT_cmp_michaelAlloc;
+#endif
+
+        struct traits_LazyList_less_stdAlloc:
+            public cc::lazy_list::make_traits<
+                co::less< less >
+            >::type
+        {};
+        typedef cc::LazyList< cds::gc::HP,  key_val, traits_LazyList_less_stdAlloc > LazyList_HP_less_stdAlloc;
+        typedef cc::LazyList< cds::gc::DHP, key_val, traits_LazyList_less_stdAlloc > LazyList_DHP_less_stdAlloc;
+        typedef cc::LazyList< rcu_gpi, key_val, traits_LazyList_less_stdAlloc > LazyList_RCU_GPI_less_stdAlloc;
+        typedef cc::LazyList< rcu_gpb, key_val, traits_LazyList_less_stdAlloc > LazyList_RCU_GPB_less_stdAlloc;
+        typedef cc::LazyList< rcu_gpt, key_val, traits_LazyList_less_stdAlloc > LazyList_RCU_GPT_less_stdAlloc;
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        typedef cc::LazyList< rcu_shb, key_val, traits_LazyList_less_stdAlloc > LazyList_RCU_SHB_less_stdAlloc;
+        typedef cc::LazyList< rcu_sht, key_val, traits_LazyList_less_stdAlloc > LazyList_RCU_SHT_less_stdAlloc;
+#endif
+
+        struct traits_LazyList_less_stdAlloc_seqcst :
+            public cc::lazy_list::make_traits<
+                co::less< less >
+                ,co::memory_model< co::v::sequential_consistent >
+            >::type
+        {};
+        typedef cc::LazyList< cds::gc::HP, key_val,  traits_LazyList_less_stdAlloc_seqcst > LazyList_HP_less_stdAlloc_seqcst;
+        typedef cc::LazyList< cds::gc::DHP, key_val, traits_LazyList_less_stdAlloc_seqcst > LazyList_DHP_less_stdAlloc_seqcst;
+        typedef cc::LazyList< rcu_gpi, key_val, traits_LazyList_less_stdAlloc_seqcst > LazyList_RCU_GPI_less_stdAlloc_seqcst;
+        typedef cc::LazyList< rcu_gpb, key_val, traits_LazyList_less_stdAlloc_seqcst > LazyList_RCU_GPB_less_stdAlloc_seqcst;
+        typedef cc::LazyList< rcu_gpt, key_val, traits_LazyList_less_stdAlloc_seqcst > LazyList_RCU_GPT_less_stdAlloc_seqcst;
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        typedef cc::LazyList< rcu_shb, key_val, traits_LazyList_less_stdAlloc_seqcst > LazyList_RCU_SHB_less_stdAlloc_seqcst;
+        typedef cc::LazyList< rcu_sht, key_val, traits_LazyList_less_stdAlloc_seqcst > LazyList_RCU_SHT_less_stdAlloc_seqcst;
+#endif
+
+        struct traits_LazyList_less_michaelAlloc :
+            public cc::lazy_list::make_traits<
+                co::less< less >,
+                co::allocator< memory::MichaelAllocator<int> >
+            >::type
+        {};
+        typedef cc::LazyList< cds::gc::HP,  key_val, traits_LazyList_less_michaelAlloc > LazyList_HP_less_michaelAlloc;
+        typedef cc::LazyList< cds::gc::DHP, key_val, traits_LazyList_less_michaelAlloc > LazyList_DHP_less_michaelAlloc;
+        typedef cc::LazyList< rcu_gpi, key_val, traits_LazyList_less_michaelAlloc > LazyList_RCU_GPI_less_michaelAlloc;
+        typedef cc::LazyList< rcu_gpb, key_val, traits_LazyList_less_michaelAlloc > LazyList_RCU_GPB_less_michaelAlloc;
+        typedef cc::LazyList< rcu_gpt, key_val, traits_LazyList_less_michaelAlloc > LazyList_RCU_GPT_less_michaelAlloc;
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        typedef cc::LazyList< rcu_shb, key_val, traits_LazyList_less_michaelAlloc > LazyList_RCU_SHB_less_michaelAlloc;
+        typedef cc::LazyList< rcu_sht, key_val, traits_LazyList_less_michaelAlloc > LazyList_RCU_SHT_less_michaelAlloc;
+#endif
+    };
+
+} // namespace set2
+
+#endif // #ifndef CDSUNIT_SET_TYPE_LAZY_LIST_H
diff --git a/tests/unit/set2/set_type_michael.h b/tests/unit/set2/set_type_michael.h
new file mode 100644 (file)
index 0000000..4d66236
--- /dev/null
@@ -0,0 +1,150 @@
+//$$CDS-header$$
+
+#ifndef CDSUNIT_SET_TYPE_MICHAEL_H
+#define CDSUNIT_SET_TYPE_MICHAEL_H
+
+#include "set2/set_type_michael_list.h"
+#include "set2/set_type_lazy_list.h"
+
+#include <cds/container/michael_set.h>
+#include <cds/container/michael_set_rcu.h>
+
+#include "michael_alloc.h"
+
+namespace set2 {
+
+    template <typename Key, typename Val>
+    struct set_type< cc::michael_set::implementation_tag, Key, Val >: public set_type_base< Key, Val >
+    {
+        typedef set_type_base< Key, Val > base_class;
+        using base_class::key_val;
+        using base_class::compare;
+        using base_class::less;
+        using base_class::hash;
+
+        // ***************************************************************************
+        // MichaelHashSet based on MichaelList
+
+        typedef michael_list_type< Key, Val > ml;
+
+        struct traits_MichaelSet_stdAlloc :
+            public cc::michael_set::make_traits<
+                co::hash< hash >
+            >::type
+        {};
+        typedef cc::MichaelHashSet< cds::gc::HP,  typename ml::MichaelList_HP_cmp_stdAlloc,  traits_MichaelSet_stdAlloc > MichaelSet_HP_cmp_stdAlloc;
+        typedef cc::MichaelHashSet< cds::gc::DHP, typename ml::MichaelList_DHP_cmp_stdAlloc, traits_MichaelSet_stdAlloc > MichaelSet_DHP_cmp_stdAlloc;
+        typedef cc::MichaelHashSet< rcu_gpi, typename ml::MichaelList_RCU_GPI_cmp_stdAlloc, traits_MichaelSet_stdAlloc > MichaelSet_RCU_GPI_cmp_stdAlloc;
+        typedef cc::MichaelHashSet< rcu_gpb, typename ml::MichaelList_RCU_GPB_cmp_stdAlloc, traits_MichaelSet_stdAlloc > MichaelSet_RCU_GPB_cmp_stdAlloc;
+        typedef cc::MichaelHashSet< rcu_gpt, typename ml::MichaelList_RCU_GPT_cmp_stdAlloc, traits_MichaelSet_stdAlloc > MichaelSet_RCU_GPT_cmp_stdAlloc;
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        typedef cc::MichaelHashSet< rcu_shb, typename ml::MichaelList_RCU_SHB_cmp_stdAlloc, traits_MichaelSet_stdAlloc > MichaelSet_RCU_SHB_cmp_stdAlloc;
+        typedef cc::MichaelHashSet< rcu_sht, typename ml::MichaelList_RCU_SHT_cmp_stdAlloc, traits_MichaelSet_stdAlloc > MichaelSet_RCU_SHT_cmp_stdAlloc;
+#endif
+
+        typedef cc::MichaelHashSet< cds::gc::HP, typename ml::MichaelList_HP_less_stdAlloc, traits_MichaelSet_stdAlloc > MichaelSet_HP_less_stdAlloc;
+        typedef cc::MichaelHashSet< cds::gc::DHP, typename ml::MichaelList_DHP_less_stdAlloc, traits_MichaelSet_stdAlloc > MichaelSet_DHP_less_stdAlloc;
+        typedef cc::MichaelHashSet< rcu_gpi, typename ml::MichaelList_RCU_GPI_less_stdAlloc, traits_MichaelSet_stdAlloc > MichaelSet_RCU_GPI_less_stdAlloc;
+        typedef cc::MichaelHashSet< rcu_gpb, typename ml::MichaelList_RCU_GPB_less_stdAlloc, traits_MichaelSet_stdAlloc > MichaelSet_RCU_GPB_less_stdAlloc;
+        typedef cc::MichaelHashSet< rcu_gpt, typename ml::MichaelList_RCU_GPT_less_stdAlloc, traits_MichaelSet_stdAlloc > MichaelSet_RCU_GPT_less_stdAlloc;
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        typedef cc::MichaelHashSet< rcu_shb, typename ml::MichaelList_RCU_SHB_less_stdAlloc, traits_MichaelSet_stdAlloc > MichaelSet_RCU_SHB_less_stdAlloc;
+        typedef cc::MichaelHashSet< rcu_sht, typename ml::MichaelList_RCU_SHT_less_stdAlloc, traits_MichaelSet_stdAlloc > MichaelSet_RCU_SHT_less_stdAlloc;
+#endif
+
+        typedef cc::MichaelHashSet< cds::gc::HP, typename ml::MichaelList_HP_less_stdAlloc_seqcst, traits_MichaelSet_stdAlloc > MichaelSet_HP_less_stdAlloc_seqcst;
+        typedef cc::MichaelHashSet< cds::gc::DHP, typename ml::MichaelList_DHP_less_stdAlloc_seqcst, traits_MichaelSet_stdAlloc > MichaelSet_DHP_less_stdAlloc_seqcst;
+        typedef cc::MichaelHashSet< rcu_gpi, typename ml::MichaelList_RCU_GPI_less_stdAlloc_seqcst, traits_MichaelSet_stdAlloc > MichaelSet_RCU_GPI_less_stdAlloc_seqcst;
+        typedef cc::MichaelHashSet< rcu_gpb, typename ml::MichaelList_RCU_GPB_less_stdAlloc_seqcst, traits_MichaelSet_stdAlloc > MichaelSet_RCU_GPB_less_stdAlloc_seqcst;
+        typedef cc::MichaelHashSet< rcu_gpt, typename ml::MichaelList_RCU_GPT_less_stdAlloc_seqcst, traits_MichaelSet_stdAlloc > MichaelSet_RCU_GPT_less_stdAlloc_seqcst;
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        typedef cc::MichaelHashSet< rcu_shb, typename ml::MichaelList_RCU_SHB_less_stdAlloc_seqcst, traits_MichaelSet_stdAlloc > MichaelSet_RCU_SHB_less_stdAlloc_seqcst;
+        typedef cc::MichaelHashSet< rcu_sht, typename ml::MichaelList_RCU_SHT_less_stdAlloc_seqcst, traits_MichaelSet_stdAlloc > MichaelSet_RCU_SHT_less_stdAlloc_seqcst;
+#endif
+
+        struct traits_MichaelSet_michaelAlloc :
+            public cc::michael_set::make_traits<
+                co::hash< hash >,
+                co::allocator< memory::MichaelAllocator<int> >
+            >::type
+        {};
+        typedef cc::MichaelHashSet< cds::gc::HP,  typename ml::MichaelList_HP_cmp_michaelAlloc,  traits_MichaelSet_michaelAlloc > MichaelSet_HP_cmp_michaelAlloc;
+        typedef cc::MichaelHashSet< cds::gc::DHP, typename ml::MichaelList_DHP_cmp_michaelAlloc, traits_MichaelSet_michaelAlloc > MichaelSet_DHP_cmp_michaelAlloc;
+        typedef cc::MichaelHashSet< rcu_gpi, typename ml::MichaelList_RCU_GPI_cmp_michaelAlloc, traits_MichaelSet_michaelAlloc > MichaelSet_RCU_GPI_cmp_michaelAlloc;
+        typedef cc::MichaelHashSet< rcu_gpb, typename ml::MichaelList_RCU_GPB_cmp_michaelAlloc, traits_MichaelSet_michaelAlloc > MichaelSet_RCU_GPB_cmp_michaelAlloc;
+        typedef cc::MichaelHashSet< rcu_gpt, typename ml::MichaelList_RCU_GPT_cmp_michaelAlloc, traits_MichaelSet_michaelAlloc > MichaelSet_RCU_GPT_cmp_michaelAlloc;
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        typedef cc::MichaelHashSet< rcu_shb, typename ml::MichaelList_RCU_SHB_cmp_michaelAlloc, traits_MichaelSet_michaelAlloc > MichaelSet_RCU_SHB_cmp_michaelAlloc;
+        typedef cc::MichaelHashSet< rcu_sht, typename ml::MichaelList_RCU_SHT_cmp_michaelAlloc, traits_MichaelSet_michaelAlloc > MichaelSet_RCU_SHT_cmp_michaelAlloc;
+#endif
+
+        typedef cc::MichaelHashSet< cds::gc::HP, typename ml::MichaelList_HP_less_michaelAlloc, traits_MichaelSet_michaelAlloc > MichaelSet_HP_less_michaelAlloc;
+        typedef cc::MichaelHashSet< cds::gc::DHP, typename ml::MichaelList_DHP_less_michaelAlloc, traits_MichaelSet_michaelAlloc > MichaelSet_DHP_less_michaelAlloc;
+        typedef cc::MichaelHashSet< rcu_gpi, typename ml::MichaelList_RCU_GPI_less_michaelAlloc, traits_MichaelSet_michaelAlloc > MichaelSet_RCU_GPI_less_michaelAlloc;
+        typedef cc::MichaelHashSet< rcu_gpb, typename ml::MichaelList_RCU_GPB_less_michaelAlloc, traits_MichaelSet_michaelAlloc > MichaelSet_RCU_GPB_less_michaelAlloc;
+        typedef cc::MichaelHashSet< rcu_gpt, typename ml::MichaelList_RCU_GPT_less_michaelAlloc, traits_MichaelSet_michaelAlloc > MichaelSet_RCU_GPT_less_michaelAlloc;
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        typedef cc::MichaelHashSet< rcu_shb, typename ml::MichaelList_RCU_SHB_less_michaelAlloc, traits_MichaelSet_michaelAlloc > MichaelSet_RCU_SHB_less_michaelAlloc;
+        typedef cc::MichaelHashSet< rcu_sht, typename ml::MichaelList_RCU_SHT_less_michaelAlloc, traits_MichaelSet_michaelAlloc > MichaelSet_RCU_SHT_less_michaelAlloc;
+#endif
+
+
+        // ***************************************************************************
+        // MichaelHashSet based on LazyList
+
+        typedef lazy_list_type< Key, Val > ll;
+
+        typedef cc::MichaelHashSet< cds::gc::HP, typename ll::LazyList_HP_cmp_stdAlloc, traits_MichaelSet_stdAlloc > MichaelSet_Lazy_HP_cmp_stdAlloc;
+        typedef cc::MichaelHashSet< cds::gc::DHP, typename ll::LazyList_DHP_cmp_stdAlloc, traits_MichaelSet_stdAlloc > MichaelSet_Lazy_DHP_cmp_stdAlloc;
+        typedef cc::MichaelHashSet< rcu_gpi, typename ll::LazyList_RCU_GPI_cmp_stdAlloc, traits_MichaelSet_stdAlloc > MichaelSet_Lazy_RCU_GPI_cmp_stdAlloc;
+        typedef cc::MichaelHashSet< rcu_gpb, typename ll::LazyList_RCU_GPB_cmp_stdAlloc, traits_MichaelSet_stdAlloc > MichaelSet_Lazy_RCU_GPB_cmp_stdAlloc;
+        typedef cc::MichaelHashSet< rcu_gpt, typename ll::LazyList_RCU_GPT_cmp_stdAlloc, traits_MichaelSet_stdAlloc > MichaelSet_Lazy_RCU_GPT_cmp_stdAlloc;
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        typedef cc::MichaelHashSet< rcu_shb, typename ll::LazyList_RCU_SHB_cmp_stdAlloc, traits_MichaelSet_stdAlloc > MichaelSet_Lazy_RCU_SHB_cmp_stdAlloc;
+        typedef cc::MichaelHashSet< rcu_sht, typename ll::LazyList_RCU_SHT_cmp_stdAlloc, traits_MichaelSet_stdAlloc > MichaelSet_Lazy_RCU_SHT_cmp_stdAlloc;
+#endif
+
+        typedef cc::MichaelHashSet< cds::gc::HP, typename ll::LazyList_HP_less_stdAlloc, traits_MichaelSet_stdAlloc > MichaelSet_Lazy_HP_less_stdAlloc;
+        typedef cc::MichaelHashSet< cds::gc::DHP, typename ll::LazyList_DHP_less_stdAlloc, traits_MichaelSet_stdAlloc > MichaelSet_Lazy_DHP_less_stdAlloc;
+        typedef cc::MichaelHashSet< rcu_gpi, typename ll::LazyList_RCU_GPI_less_stdAlloc, traits_MichaelSet_stdAlloc > MichaelSet_Lazy_RCU_GPI_less_stdAlloc;
+        typedef cc::MichaelHashSet< rcu_gpb, typename ll::LazyList_RCU_GPB_less_stdAlloc, traits_MichaelSet_stdAlloc > MichaelSet_Lazy_RCU_GPB_less_stdAlloc;
+        typedef cc::MichaelHashSet< rcu_gpt, typename ll::LazyList_RCU_GPT_less_stdAlloc, traits_MichaelSet_stdAlloc > MichaelSet_Lazy_RCU_GPT_less_stdAlloc;
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        typedef cc::MichaelHashSet< rcu_shb, typename ll::LazyList_RCU_SHB_less_stdAlloc, traits_MichaelSet_stdAlloc > MichaelSet_Lazy_RCU_SHB_less_stdAlloc;
+        typedef cc::MichaelHashSet< rcu_sht, typename ll::LazyList_RCU_SHT_less_stdAlloc, traits_MichaelSet_stdAlloc > MichaelSet_Lazy_RCU_SHT_less_stdAlloc;
+#endif
+
+        typedef cc::MichaelHashSet< cds::gc::HP, typename ll::LazyList_HP_less_stdAlloc_seqcst, traits_MichaelSet_stdAlloc > MichaelSet_Lazy_HP_less_stdAlloc_seqcst;
+        typedef cc::MichaelHashSet< cds::gc::DHP, typename ll::LazyList_DHP_less_stdAlloc_seqcst, traits_MichaelSet_stdAlloc > MichaelSet_Lazy_DHP_less_stdAlloc_seqcst;
+        typedef cc::MichaelHashSet< rcu_gpi, typename ll::LazyList_RCU_GPI_less_stdAlloc_seqcst, traits_MichaelSet_stdAlloc > MichaelSet_Lazy_RCU_GPI_less_stdAlloc_seqcst;
+        typedef cc::MichaelHashSet< rcu_gpb, typename ll::LazyList_RCU_GPB_less_stdAlloc_seqcst, traits_MichaelSet_stdAlloc > MichaelSet_Lazy_RCU_GPB_less_stdAlloc_seqcst;
+        typedef cc::MichaelHashSet< rcu_gpt, typename ll::LazyList_RCU_GPT_less_stdAlloc_seqcst, traits_MichaelSet_stdAlloc > MichaelSet_Lazy_RCU_GPT_less_stdAlloc_seqcst;
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        typedef cc::MichaelHashSet< rcu_shb, typename ll::LazyList_RCU_SHB_less_stdAlloc_seqcst, traits_MichaelSet_stdAlloc > MichaelSet_Lazy_RCU_SHB_less_stdAlloc_seqcst;
+        typedef cc::MichaelHashSet< rcu_sht, typename ll::LazyList_RCU_SHT_less_stdAlloc_seqcst, traits_MichaelSet_stdAlloc > MichaelSet_Lazy_RCU_SHT_less_stdAlloc_seqcst;
+#endif
+
+        typedef cc::MichaelHashSet< cds::gc::HP, typename ll::LazyList_HP_cmp_michaelAlloc, traits_MichaelSet_michaelAlloc > MichaelSet_Lazy_HP_cmp_michaelAlloc;
+        typedef cc::MichaelHashSet< cds::gc::DHP, typename ll::LazyList_DHP_cmp_michaelAlloc, traits_MichaelSet_michaelAlloc > MichaelSet_Lazy_DHP_cmp_michaelAlloc;
+        typedef cc::MichaelHashSet< rcu_gpi, typename ll::LazyList_RCU_GPI_cmp_michaelAlloc, traits_MichaelSet_michaelAlloc > MichaelSet_Lazy_RCU_GPI_cmp_michaelAlloc;
+        typedef cc::MichaelHashSet< rcu_gpb, typename ll::LazyList_RCU_GPB_cmp_michaelAlloc, traits_MichaelSet_michaelAlloc > MichaelSet_Lazy_RCU_GPB_cmp_michaelAlloc;
+        typedef cc::MichaelHashSet< rcu_gpt, typename ll::LazyList_RCU_GPT_cmp_michaelAlloc, traits_MichaelSet_michaelAlloc > MichaelSet_Lazy_RCU_GPT_cmp_michaelAlloc;
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        typedef cc::MichaelHashSet< rcu_shb, typename ll::LazyList_RCU_SHB_cmp_michaelAlloc, traits_MichaelSet_michaelAlloc > MichaelSet_Lazy_RCU_SHB_cmp_michaelAlloc;
+        typedef cc::MichaelHashSet< rcu_sht, typename ll::LazyList_RCU_SHT_cmp_michaelAlloc, traits_MichaelSet_michaelAlloc > MichaelSet_Lazy_RCU_SHT_cmp_michaelAlloc;
+#endif
+
+        typedef cc::MichaelHashSet< cds::gc::HP, typename ll::LazyList_HP_less_michaelAlloc, traits_MichaelSet_michaelAlloc > MichaelSet_Lazy_HP_less_michaelAlloc;
+        typedef cc::MichaelHashSet< cds::gc::DHP, typename ll::LazyList_DHP_less_michaelAlloc, traits_MichaelSet_michaelAlloc > MichaelSet_Lazy_DHP_less_michaelAlloc;
+        typedef cc::MichaelHashSet< rcu_gpi, typename ll::LazyList_RCU_GPI_less_michaelAlloc, traits_MichaelSet_michaelAlloc > MichaelSet_Lazy_RCU_GPI_less_michaelAlloc;
+        typedef cc::MichaelHashSet< rcu_gpb, typename ll::LazyList_RCU_GPB_less_michaelAlloc, traits_MichaelSet_michaelAlloc > MichaelSet_Lazy_RCU_GPB_less_michaelAlloc;
+        typedef cc::MichaelHashSet< rcu_gpt, typename ll::LazyList_RCU_GPT_less_michaelAlloc, traits_MichaelSet_michaelAlloc > MichaelSet_Lazy_RCU_GPT_less_michaelAlloc;
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        typedef cc::MichaelHashSet< rcu_shb, typename ll::LazyList_RCU_SHB_less_michaelAlloc, traits_MichaelSet_michaelAlloc > MichaelSet_Lazy_RCU_SHB_less_michaelAlloc;
+        typedef cc::MichaelHashSet< rcu_sht, typename ll::LazyList_RCU_SHT_less_michaelAlloc, traits_MichaelSet_michaelAlloc > MichaelSet_Lazy_RCU_SHT_less_michaelAlloc;
+#endif
+    };
+
+} // namespace set2
+
+#endif // #ifndef CDSUNIT_SET_TYPE_MICHAEL_H
diff --git a/tests/unit/set2/set_type_michael_list.h b/tests/unit/set2/set_type_michael_list.h
new file mode 100644 (file)
index 0000000..bccd496
--- /dev/null
@@ -0,0 +1,116 @@
+//$$CDS-header$$
+
+#ifndef CDSUNIT_SET_TYPE_MICHAEL_LIST_H
+#define CDSUNIT_SET_TYPE_MICHAEL_LIST_H
+
+#include "set2/set_type.h"
+
+#include <cds/container/michael_list_hp.h>
+#include <cds/container/michael_list_dhp.h>
+#include <cds/container/michael_list_rcu.h>
+
+namespace set2 {
+
+    template <typename Key, typename Val>
+    struct michael_list_type
+    {
+        typedef typename set_type_base< Key, Val >::key_val key_val;
+        typedef typename set_type_base< Key, Val >::compare compare;
+        typedef typename set_type_base< Key, Val >::less    less;
+
+        struct traits_MichaelList_cmp_stdAlloc:
+            public cc::michael_list::make_traits<
+                co::compare< compare >
+            >::type
+        {};
+        typedef cc::MichaelList< cds::gc::HP,  key_val, traits_MichaelList_cmp_stdAlloc > MichaelList_HP_cmp_stdAlloc;
+        typedef cc::MichaelList< cds::gc::DHP, key_val, traits_MichaelList_cmp_stdAlloc > MichaelList_DHP_cmp_stdAlloc;
+        typedef cc::MichaelList< rcu_gpi, key_val, traits_MichaelList_cmp_stdAlloc > MichaelList_RCU_GPI_cmp_stdAlloc;
+        typedef cc::MichaelList< rcu_gpb, key_val, traits_MichaelList_cmp_stdAlloc > MichaelList_RCU_GPB_cmp_stdAlloc;
+        typedef cc::MichaelList< rcu_gpt, key_val, traits_MichaelList_cmp_stdAlloc > MichaelList_RCU_GPT_cmp_stdAlloc;
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        typedef cc::MichaelList< rcu_shb, key_val, traits_MichaelList_cmp_stdAlloc > MichaelList_RCU_SHB_cmp_stdAlloc;
+        typedef cc::MichaelList< rcu_sht, key_val, traits_MichaelList_cmp_stdAlloc > MichaelList_RCU_SHT_cmp_stdAlloc;
+#endif
+
+        struct traits_MichaelList_cmp_stdAlloc_seqcst : public traits_MichaelList_cmp_stdAlloc
+        {
+            typedef co::v::sequential_consistent memory_model;
+        };
+        typedef cc::MichaelList< cds::gc::HP,  key_val, traits_MichaelList_cmp_stdAlloc_seqcst > MichaelList_HP_cmp_stdAlloc_seqcst;
+        typedef cc::MichaelList< cds::gc::DHP, key_val, traits_MichaelList_cmp_stdAlloc_seqcst > MichaelList_DHP_cmp_stdAlloc_seqcst;
+        typedef cc::MichaelList< rcu_gpi, key_val, traits_MichaelList_cmp_stdAlloc_seqcst > MichaelList_RCU_GPI_cmp_stdAlloc_seqcst;
+        typedef cc::MichaelList< rcu_gpb, key_val, traits_MichaelList_cmp_stdAlloc_seqcst > MichaelList_RCU_GPB_cmp_stdAlloc_seqcst;
+        typedef cc::MichaelList< rcu_gpt, key_val, traits_MichaelList_cmp_stdAlloc_seqcst > MichaelList_RCU_GPT_cmp_stdAlloc_seqcst;
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        typedef cc::MichaelList< rcu_shb, key_val, traits_MichaelList_cmp_stdAlloc_seqcst > MichaelList_RCU_SHB_cmp_stdAlloc_seqcst;
+        typedef cc::MichaelList< rcu_sht, key_val, traits_MichaelList_cmp_stdAlloc_seqcst > MichaelList_RCU_SHT_cmp_stdAlloc_seqcst;
+#endif
+
+        struct traits_MichaelList_less_stdAlloc :
+            public cc::michael_list::make_traits<
+                co::less< less >
+            >::type
+        {};
+        typedef cc::MichaelList< cds::gc::HP,  key_val, traits_MichaelList_less_stdAlloc > MichaelList_HP_less_stdAlloc;
+        typedef cc::MichaelList< cds::gc::DHP, key_val, traits_MichaelList_less_stdAlloc > MichaelList_DHP_less_stdAlloc;
+        typedef cc::MichaelList< rcu_gpi, key_val, traits_MichaelList_less_stdAlloc > MichaelList_RCU_GPI_less_stdAlloc;
+        typedef cc::MichaelList< rcu_gpb, key_val, traits_MichaelList_less_stdAlloc > MichaelList_RCU_GPB_less_stdAlloc;
+        typedef cc::MichaelList< rcu_gpt, key_val, traits_MichaelList_less_stdAlloc > MichaelList_RCU_GPT_less_stdAlloc;
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        typedef cc::MichaelList< rcu_shb, key_val, traits_MichaelList_less_stdAlloc > MichaelList_RCU_SHB_less_stdAlloc;
+        typedef cc::MichaelList< rcu_sht, key_val, traits_MichaelList_less_stdAlloc > MichaelList_RCU_SHT_less_stdAlloc;
+#endif
+
+        struct traits_MichaelList_less_stdAlloc_seqcst :
+            public cc::michael_list::make_traits<
+                co::less< less >
+                ,co::memory_model< co::v::sequential_consistent >
+            >::type
+        {};
+        typedef cc::MichaelList< cds::gc::HP,  key_val, traits_MichaelList_less_stdAlloc_seqcst > MichaelList_HP_less_stdAlloc_seqcst;
+        typedef cc::MichaelList< cds::gc::DHP, key_val, traits_MichaelList_less_stdAlloc_seqcst > MichaelList_DHP_less_stdAlloc_seqcst;
+        typedef cc::MichaelList< rcu_gpi, key_val, traits_MichaelList_less_stdAlloc_seqcst > MichaelList_RCU_GPI_less_stdAlloc_seqcst;
+        typedef cc::MichaelList< rcu_gpb, key_val, traits_MichaelList_less_stdAlloc_seqcst > MichaelList_RCU_GPB_less_stdAlloc_seqcst;
+        typedef cc::MichaelList< rcu_gpt, key_val, traits_MichaelList_less_stdAlloc_seqcst > MichaelList_RCU_GPT_less_stdAlloc_seqcst;
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        typedef cc::MichaelList< rcu_shb, key_val, traits_MichaelList_less_stdAlloc_seqcst > MichaelList_RCU_SHB_less_stdAlloc_seqcst;
+        typedef cc::MichaelList< rcu_sht, key_val, traits_MichaelList_less_stdAlloc_seqcst > MichaelList_RCU_SHT_less_stdAlloc_seqcst;
+#endif
+
+        struct traits_MichaelList_cmp_michaelAlloc :
+            public cc::michael_list::make_traits<
+                co::compare< compare >,
+                co::allocator< memory::MichaelAllocator<int> >
+            >::type
+        {};
+        typedef cc::MichaelList< cds::gc::HP,  key_val, traits_MichaelList_cmp_michaelAlloc > MichaelList_HP_cmp_michaelAlloc;
+        typedef cc::MichaelList< cds::gc::DHP, key_val, traits_MichaelList_cmp_michaelAlloc > MichaelList_DHP_cmp_michaelAlloc;
+        typedef cc::MichaelList< rcu_gpi, key_val, traits_MichaelList_cmp_michaelAlloc > MichaelList_RCU_GPI_cmp_michaelAlloc;
+        typedef cc::MichaelList< rcu_gpb, key_val, traits_MichaelList_cmp_michaelAlloc > MichaelList_RCU_GPB_cmp_michaelAlloc;
+        typedef cc::MichaelList< rcu_gpt, key_val, traits_MichaelList_cmp_michaelAlloc > MichaelList_RCU_GPT_cmp_michaelAlloc;
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        typedef cc::MichaelList< rcu_shb, key_val, traits_MichaelList_cmp_michaelAlloc > MichaelList_RCU_SHB_cmp_michaelAlloc;
+        typedef cc::MichaelList< rcu_sht, key_val, traits_MichaelList_cmp_michaelAlloc > MichaelList_RCU_SHT_cmp_michaelAlloc;
+#endif
+
+        struct traits_MichaelList_less_michaelAlloc :
+            public cc::michael_list::make_traits<
+                co::less< less >,
+                co::allocator< memory::MichaelAllocator<int> >
+            >::type
+        {};
+        typedef cc::MichaelList< cds::gc::HP,  key_val, traits_MichaelList_less_michaelAlloc > MichaelList_HP_less_michaelAlloc;
+        typedef cc::MichaelList< cds::gc::DHP, key_val, traits_MichaelList_less_michaelAlloc > MichaelList_DHP_less_michaelAlloc;
+        typedef cc::MichaelList< rcu_gpi, key_val, traits_MichaelList_less_michaelAlloc > MichaelList_RCU_GPI_less_michaelAlloc;
+        typedef cc::MichaelList< rcu_gpb, key_val, traits_MichaelList_less_michaelAlloc > MichaelList_RCU_GPB_less_michaelAlloc;
+        typedef cc::MichaelList< rcu_gpt, key_val, traits_MichaelList_less_michaelAlloc > MichaelList_RCU_GPT_less_michaelAlloc;
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        typedef cc::MichaelList< rcu_shb, key_val, traits_MichaelList_less_michaelAlloc > MichaelList_RCU_SHB_less_michaelAlloc;
+        typedef cc::MichaelList< rcu_sht, key_val, traits_MichaelList_less_michaelAlloc > MichaelList_RCU_SHT_less_michaelAlloc;
+#endif
+    };
+
+} // namespace set2
+
+#endif // #ifndef CDSUNIT_SET_TYPE_MICHAEL_LIST_H
diff --git a/tests/unit/set2/set_type_skip_list.h b/tests/unit/set2/set_type_skip_list.h
new file mode 100644 (file)
index 0000000..27e3103
--- /dev/null
@@ -0,0 +1,183 @@
+//$$CDS-header$$
+
+#ifndef CDSUNIT_SET_TYPE_SKIP_LIST_H
+#define CDSUNIT_SET_TYPE_SKIP_LIST_H
+
+#include "set2/set_type.h"
+
+#include <cds/container/skip_list_set_hp.h>
+#include <cds/container/skip_list_set_dhp.h>
+#include <cds/container/skip_list_set_rcu.h>
+
+#include "print_skip_list_stat.h"
+
+namespace set2 {
+
+    template <typename Key, typename Val>
+    struct set_type< cc::skip_list::implementation_tag, Key, Val >: public set_type_base< Key, Val >
+    {
+        typedef set_type_base< Key, Val > base_class;
+        using base_class::key_val;
+        using base_class::compare;
+        using base_class::less;
+        using base_class::hash;
+
+        class traits_SkipListSet_less_pascal: public cc::skip_list::make_traits <
+                co::less< less >
+                ,cc::skip_list::random_level_generator< cc::skip_list::turbo_pascal >
+                ,co::item_counter< cds::atomicity::item_counter >
+            >::type
+        {};
+        typedef cc::SkipListSet< cds::gc::HP, key_val, traits_SkipListSet_less_pascal > SkipListSet_hp_less_pascal;
+        typedef cc::SkipListSet< cds::gc::DHP, key_val, traits_SkipListSet_less_pascal > SkipListSet_dhp_less_pascal;
+        typedef cc::SkipListSet< rcu_gpi, key_val, traits_SkipListSet_less_pascal > SkipListSet_rcu_gpi_less_pascal;
+        typedef cc::SkipListSet< rcu_gpb, key_val, traits_SkipListSet_less_pascal > SkipListSet_rcu_gpb_less_pascal;
+        typedef cc::SkipListSet< rcu_gpt, key_val, traits_SkipListSet_less_pascal > SkipListSet_rcu_gpt_less_pascal;
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        typedef cc::SkipListSet< rcu_shb, key_val, traits_SkipListSet_less_pascal > SkipListSet_rcu_shb_less_pascal;
+        typedef cc::SkipListSet< rcu_sht, key_val, traits_SkipListSet_less_pascal > SkipListSet_rcu_sht_less_pascal;
+#endif
+
+        class traits_SkipListSet_less_pascal_seqcst: public cc::skip_list::make_traits <
+                co::less< less >
+                ,cc::skip_list::random_level_generator< cc::skip_list::turbo_pascal >
+                ,co::memory_model< co::v::sequential_consistent >
+                ,co::item_counter< cds::atomicity::item_counter >
+            >::type
+        {};
+        typedef cc::SkipListSet< cds::gc::HP, key_val, traits_SkipListSet_less_pascal_seqcst > SkipListSet_hp_less_pascal_seqcst;
+        typedef cc::SkipListSet< cds::gc::DHP, key_val, traits_SkipListSet_less_pascal_seqcst > SkipListSet_dhp_less_pascal_seqcst;
+        typedef cc::SkipListSet< rcu_gpi, key_val, traits_SkipListSet_less_pascal_seqcst > SkipListSet_rcu_gpi_less_pascal_seqcst;
+        typedef cc::SkipListSet< rcu_gpb, key_val, traits_SkipListSet_less_pascal_seqcst > SkipListSet_rcu_gpb_less_pascal_seqcst;
+        typedef cc::SkipListSet< rcu_gpt, key_val, traits_SkipListSet_less_pascal_seqcst > SkipListSet_rcu_gpt_less_pascal_seqcst;
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        typedef cc::SkipListSet< rcu_shb, key_val, traits_SkipListSet_less_pascal_seqcst > SkipListSet_rcu_shb_less_pascal_seqcst;
+        typedef cc::SkipListSet< rcu_sht, key_val, traits_SkipListSet_less_pascal_seqcst > SkipListSet_rcu_sht_less_pascal_seqcst;
+#endif
+
+        class traits_SkipListSet_less_pascal_stat: public cc::skip_list::make_traits <
+                co::less< less >
+                ,cc::skip_list::random_level_generator< cc::skip_list::turbo_pascal >
+                ,co::stat< cc::skip_list::stat<> >
+                ,co::item_counter< cds::atomicity::item_counter >
+            >::type
+        {};
+        typedef cc::SkipListSet< cds::gc::HP, key_val, traits_SkipListSet_less_pascal_stat > SkipListSet_hp_less_pascal_stat;
+        typedef cc::SkipListSet< cds::gc::DHP, key_val, traits_SkipListSet_less_pascal_stat > SkipListSet_dhp_less_pascal_stat;
+        typedef cc::SkipListSet< rcu_gpi, key_val, traits_SkipListSet_less_pascal_stat > SkipListSet_rcu_gpi_less_pascal_stat;
+        typedef cc::SkipListSet< rcu_gpb, key_val, traits_SkipListSet_less_pascal_stat > SkipListSet_rcu_gpb_less_pascal_stat;
+        typedef cc::SkipListSet< rcu_gpt, key_val, traits_SkipListSet_less_pascal_stat > SkipListSet_rcu_gpt_less_pascal_stat;
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        typedef cc::SkipListSet< rcu_shb, key_val, traits_SkipListSet_less_pascal_stat > SkipListSet_rcu_shb_less_pascal_stat;
+        typedef cc::SkipListSet< rcu_sht, key_val, traits_SkipListSet_less_pascal_stat > SkipListSet_rcu_sht_less_pascal_stat;
+#endif
+
+        class traits_SkipListSet_cmp_pascal: public cc::skip_list::make_traits <
+            co::compare< compare >
+            ,cc::skip_list::random_level_generator< cc::skip_list::turbo_pascal >
+            ,co::item_counter< cds::atomicity::item_counter >
+        >::type
+        {};
+        typedef cc::SkipListSet< cds::gc::HP, key_val, traits_SkipListSet_cmp_pascal > SkipListSet_hp_cmp_pascal;
+        typedef cc::SkipListSet< cds::gc::DHP, key_val, traits_SkipListSet_cmp_pascal > SkipListSet_dhp_cmp_pascal;
+        typedef cc::SkipListSet< rcu_gpi, key_val, traits_SkipListSet_cmp_pascal > SkipListSet_rcu_gpi_cmp_pascal;
+        typedef cc::SkipListSet< rcu_gpb, key_val, traits_SkipListSet_cmp_pascal > SkipListSet_rcu_gpb_cmp_pascal;
+        typedef cc::SkipListSet< rcu_gpt, key_val, traits_SkipListSet_cmp_pascal > SkipListSet_rcu_gpt_cmp_pascal;
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        typedef cc::SkipListSet< rcu_shb, key_val, traits_SkipListSet_cmp_pascal > SkipListSet_rcu_shb_cmp_pascal;
+        typedef cc::SkipListSet< rcu_sht, key_val, traits_SkipListSet_cmp_pascal > SkipListSet_rcu_sht_cmp_pascal;
+#endif
+
+        class traits_SkipListSet_cmp_pascal_stat: public cc::skip_list::make_traits <
+            co::compare< compare >
+            ,cc::skip_list::random_level_generator< cc::skip_list::turbo_pascal >
+            ,co::stat< cc::skip_list::stat<> >
+            ,co::item_counter< cds::atomicity::item_counter >
+        >::type
+        {};
+        typedef cc::SkipListSet< cds::gc::HP, key_val, traits_SkipListSet_cmp_pascal_stat > SkipListSet_hp_cmp_pascal_stat;
+        typedef cc::SkipListSet< cds::gc::DHP, key_val, traits_SkipListSet_cmp_pascal_stat > SkipListSet_dhp_cmp_pascal_stat;
+        typedef cc::SkipListSet< rcu_gpi, key_val, traits_SkipListSet_cmp_pascal_stat > SkipListSet_rcu_gpi_cmp_pascal_stat;
+        typedef cc::SkipListSet< rcu_gpb, key_val, traits_SkipListSet_cmp_pascal_stat > SkipListSet_rcu_gpb_cmp_pascal_stat;
+        typedef cc::SkipListSet< rcu_gpt, key_val, traits_SkipListSet_cmp_pascal_stat > SkipListSet_rcu_gpt_cmp_pascal_stat;
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        typedef cc::SkipListSet< rcu_shb, key_val, traits_SkipListSet_cmp_pascal_stat > SkipListSet_rcu_shb_cmp_pascal_stat;
+        typedef cc::SkipListSet< rcu_sht, key_val, traits_SkipListSet_cmp_pascal_stat > SkipListSet_rcu_sht_cmp_pascal_stat;
+#endif
+
+        class traits_SkipListSet_less_xorshift: public cc::skip_list::make_traits <
+            co::less< less >
+            ,cc::skip_list::random_level_generator< cc::skip_list::xorshift >
+            ,co::item_counter< cds::atomicity::item_counter >
+        >::type
+        {};
+        typedef cc::SkipListSet< cds::gc::HP, key_val, traits_SkipListSet_less_xorshift > SkipListSet_hp_less_xorshift;
+        typedef cc::SkipListSet< cds::gc::DHP, key_val, traits_SkipListSet_less_xorshift > SkipListSet_dhp_less_xorshift;
+        typedef cc::SkipListSet< rcu_gpi, key_val, traits_SkipListSet_less_xorshift > SkipListSet_rcu_gpi_less_xorshift;
+        typedef cc::SkipListSet< rcu_gpb, key_val, traits_SkipListSet_less_xorshift > SkipListSet_rcu_gpb_less_xorshift;
+        typedef cc::SkipListSet< rcu_gpt, key_val, traits_SkipListSet_less_xorshift > SkipListSet_rcu_gpt_less_xorshift;
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        typedef cc::SkipListSet< rcu_shb, key_val, traits_SkipListSet_less_xorshift > SkipListSet_rcu_shb_less_xorshift;
+        typedef cc::SkipListSet< rcu_sht, key_val, traits_SkipListSet_less_xorshift > SkipListSet_rcu_sht_less_xorshift;
+#endif
+
+        class traits_SkipListSet_less_xorshift_stat: public cc::skip_list::make_traits <
+            co::less< less >
+            ,cc::skip_list::random_level_generator< cc::skip_list::xorshift >
+            ,co::stat< cc::skip_list::stat<> >
+            ,co::item_counter< cds::atomicity::item_counter >
+        >::type
+        {};
+        typedef cc::SkipListSet< cds::gc::HP, key_val, traits_SkipListSet_less_xorshift_stat > SkipListSet_hp_less_xorshift_stat;
+        typedef cc::SkipListSet< cds::gc::DHP, key_val, traits_SkipListSet_less_xorshift_stat > SkipListSet_dhp_less_xorshift_stat;
+        typedef cc::SkipListSet< rcu_gpi, key_val, traits_SkipListSet_less_xorshift_stat > SkipListSet_rcu_gpi_less_xorshift_stat;
+        typedef cc::SkipListSet< rcu_gpb, key_val, traits_SkipListSet_less_xorshift_stat > SkipListSet_rcu_gpb_less_xorshift_stat;
+        typedef cc::SkipListSet< rcu_gpt, key_val, traits_SkipListSet_less_xorshift_stat > SkipListSet_rcu_gpt_less_xorshift_stat;
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        typedef cc::SkipListSet< rcu_shb, key_val, traits_SkipListSet_less_xorshift_stat > SkipListSet_rcu_shb_less_xorshift_stat;
+        typedef cc::SkipListSet< rcu_sht, key_val, traits_SkipListSet_less_xorshift_stat > SkipListSet_rcu_sht_less_xorshift_stat;
+#endif
+
+        class traits_SkipListSet_cmp_xorshift: public cc::skip_list::make_traits <
+            co::compare< compare >
+            ,cc::skip_list::random_level_generator< cc::skip_list::xorshift >
+            ,co::item_counter< cds::atomicity::item_counter >
+        >::type
+        {};
+        typedef cc::SkipListSet< cds::gc::HP, key_val, traits_SkipListSet_cmp_xorshift > SkipListSet_hp_cmp_xorshift;
+        typedef cc::SkipListSet< cds::gc::DHP, key_val, traits_SkipListSet_cmp_xorshift > SkipListSet_dhp_cmp_xorshift;
+        typedef cc::SkipListSet< rcu_gpi, key_val, traits_SkipListSet_cmp_xorshift > SkipListSet_rcu_gpi_cmp_xorshift;
+        typedef cc::SkipListSet< rcu_gpb, key_val, traits_SkipListSet_cmp_xorshift > SkipListSet_rcu_gpb_cmp_xorshift;
+        typedef cc::SkipListSet< rcu_gpt, key_val, traits_SkipListSet_cmp_xorshift > SkipListSet_rcu_gpt_cmp_xorshift;
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        typedef cc::SkipListSet< rcu_shb, key_val, traits_SkipListSet_cmp_xorshift > SkipListSet_rcu_shb_cmp_xorshift;
+        typedef cc::SkipListSet< rcu_sht, key_val, traits_SkipListSet_cmp_xorshift > SkipListSet_rcu_sht_cmp_xorshift;
+#endif
+
+        class traits_SkipListSet_cmp_xorshift_stat: public cc::skip_list::make_traits <
+            co::compare< compare >
+            ,cc::skip_list::random_level_generator< cc::skip_list::xorshift >
+            ,co::stat< cc::skip_list::stat<> >
+            ,co::item_counter< cds::atomicity::item_counter >
+        >::type
+        {};
+        typedef cc::SkipListSet< cds::gc::HP, key_val, traits_SkipListSet_cmp_xorshift_stat > SkipListSet_hp_cmp_xorshift_stat;
+        typedef cc::SkipListSet< cds::gc::DHP, key_val, traits_SkipListSet_cmp_xorshift_stat > SkipListSet_dhp_cmp_xorshift_stat;
+        typedef cc::SkipListSet< rcu_gpi, key_val, traits_SkipListSet_cmp_xorshift_stat > SkipListSet_rcu_gpi_cmp_xorshift_stat;
+        typedef cc::SkipListSet< rcu_gpb, key_val, traits_SkipListSet_cmp_xorshift_stat > SkipListSet_rcu_gpb_cmp_xorshift_stat;
+        typedef cc::SkipListSet< rcu_gpt, key_val, traits_SkipListSet_cmp_xorshift_stat > SkipListSet_rcu_gpt_cmp_xorshift_stat;
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        typedef cc::SkipListSet< rcu_shb, key_val, traits_SkipListSet_cmp_xorshift_stat > SkipListSet_rcu_shb_cmp_xorshift_stat;
+        typedef cc::SkipListSet< rcu_sht, key_val, traits_SkipListSet_cmp_xorshift_stat > SkipListSet_rcu_sht_cmp_xorshift_stat;
+#endif
+    };
+
+    template <typename GC, typename T, typename Traits>
+    static inline void print_stat( cc::SkipListSet<GC, T, Traits> const& s )
+    {
+        CPPUNIT_MSG( s.statistics() );
+    }
+
+} // namespace set2
+
+#endif // #ifndef CDSUNIT_SET_TYPE_SKIP_LIST_H
diff --git a/tests/unit/set2/set_type_split_list.h b/tests/unit/set2/set_type_split_list.h
new file mode 100644 (file)
index 0000000..dfbbc12
--- /dev/null
@@ -0,0 +1,480 @@
+//$$CDS-header$$
+
+#ifndef CDSUNIT_SET_TYPE_SPLIT_LIST_H
+#define CDSUNIT_SET_TYPE_SPLIT_LIST_H
+
+#include "set2/set_type.h"
+
+#include <cds/container/michael_list_hp.h>
+#include <cds/container/michael_list_dhp.h>
+#include <cds/container/michael_list_rcu.h>
+#include <cds/container/lazy_list_hp.h>
+#include <cds/container/lazy_list_dhp.h>
+#include <cds/container/lazy_list_rcu.h>
+
+#include <cds/container/split_list_set.h>
+#include <cds/container/split_list_set_rcu.h>
+
+#include "print_split_list_stat.h"
+
+namespace set2 {
+
+    template <typename Key, typename Val>
+    struct set_type< cc::split_list::implementation_tag, Key, Val >: public set_type_base< Key, Val >
+    {
+        typedef set_type_base< Key, Val > base_class;
+        using base_class::key_val;
+        using base_class::compare;
+        using base_class::less;
+        using base_class::hash;
+
+        // ***************************************************************************
+        // SplitListSet based on MichaelList
+
+        struct traits_SplitList_Michael_dyn_cmp :
+            public cc::split_list::make_traits<
+                cc::split_list::ordered_list<cc::michael_list_tag>
+                ,co::hash< hash >
+                ,cc::split_list::ordered_list_traits<
+                    typename cc::michael_list::make_traits<
+                        co::compare< compare >
+                    >::type
+                >
+            >::type
+        {};
+        typedef cc::SplitListSet< cds::gc::HP,  key_val, traits_SplitList_Michael_dyn_cmp > SplitList_Michael_HP_dyn_cmp;
+        typedef cc::SplitListSet< cds::gc::DHP, key_val, traits_SplitList_Michael_dyn_cmp > SplitList_Michael_DHP_dyn_cmp;
+        typedef cc::SplitListSet< rcu_gpi, key_val, traits_SplitList_Michael_dyn_cmp > SplitList_Michael_RCU_GPI_dyn_cmp;
+        typedef cc::SplitListSet< rcu_gpb, key_val, traits_SplitList_Michael_dyn_cmp > SplitList_Michael_RCU_GPB_dyn_cmp;
+        typedef cc::SplitListSet< rcu_gpt, key_val, traits_SplitList_Michael_dyn_cmp > SplitList_Michael_RCU_GPT_dyn_cmp;
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        typedef cc::SplitListSet< rcu_shb, key_val, traits_SplitList_Michael_dyn_cmp > SplitList_Michael_RCU_SHB_dyn_cmp;
+        typedef cc::SplitListSet< rcu_sht, key_val, traits_SplitList_Michael_dyn_cmp > SplitList_Michael_RCU_SHT_dyn_cmp;
+#endif
+
+        struct traits_SplitList_Michael_dyn_cmp_stat :
+            public cc::split_list::make_traits<
+                cc::split_list::ordered_list<cc::michael_list_tag>
+                ,co::hash< hash >
+                ,co::stat< cc::split_list::stat<> >
+                ,cc::split_list::ordered_list_traits<
+                    typename cc::michael_list::make_traits<
+                        co::compare< compare >
+                    >::type
+                >
+            >::type
+        {};
+        typedef cc::SplitListSet< cds::gc::HP, key_val, traits_SplitList_Michael_dyn_cmp_stat > SplitList_Michael_HP_dyn_cmp_stat;
+        typedef cc::SplitListSet< cds::gc::DHP, key_val, traits_SplitList_Michael_dyn_cmp_stat > SplitList_Michael_DHP_dyn_cmp_stat;
+        typedef cc::SplitListSet< rcu_gpi, key_val, traits_SplitList_Michael_dyn_cmp_stat > SplitList_Michael_RCU_GPI_dyn_cmp_stat;
+        typedef cc::SplitListSet< rcu_gpb, key_val, traits_SplitList_Michael_dyn_cmp_stat > SplitList_Michael_RCU_GPB_dyn_cmp_stat;
+        typedef cc::SplitListSet< rcu_gpt, key_val, traits_SplitList_Michael_dyn_cmp_stat > SplitList_Michael_RCU_GPT_dyn_cmp_stat;
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        typedef cc::SplitListSet< rcu_shb, key_val, traits_SplitList_Michael_dyn_cmp_stat > SplitList_Michael_RCU_SHB_dyn_cmp_stat;
+        typedef cc::SplitListSet< rcu_sht, key_val, traits_SplitList_Michael_dyn_cmp_stat > SplitList_Michael_RCU_SHT_dyn_cmp_stat;
+#endif
+
+        struct traits_SplitList_Michael_dyn_cmp_seqcst :
+            public cc::split_list::make_traits<
+                cc::split_list::ordered_list<cc::michael_list_tag>
+                ,co::hash< hash >
+                ,co::memory_model< co::v::sequential_consistent >
+                ,cc::split_list::ordered_list_traits<
+                    typename cc::michael_list::make_traits<
+                        co::compare< compare >
+                        ,co::memory_model< co::v::sequential_consistent >
+                    >::type
+                >
+            >::type
+        {};
+        typedef cc::SplitListSet< cds::gc::HP,  key_val, traits_SplitList_Michael_dyn_cmp_seqcst > SplitList_Michael_HP_dyn_cmp_seqcst;
+        typedef cc::SplitListSet< cds::gc::DHP, key_val, traits_SplitList_Michael_dyn_cmp_seqcst > SplitList_Michael_DHP_dyn_cmp_seqcst;
+        typedef cc::SplitListSet< rcu_gpi, key_val, traits_SplitList_Michael_dyn_cmp_seqcst > SplitList_Michael_RCU_GPI_dyn_cmp_seqcst;
+        typedef cc::SplitListSet< rcu_gpb, key_val, traits_SplitList_Michael_dyn_cmp_seqcst > SplitList_Michael_RCU_GPB_dyn_cmp_seqcst;
+        typedef cc::SplitListSet< rcu_gpt, key_val, traits_SplitList_Michael_dyn_cmp_seqcst > SplitList_Michael_RCU_GPT_dyn_cmp_seqcst;
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        typedef cc::SplitListSet< rcu_shb, key_val, traits_SplitList_Michael_dyn_cmp_seqcst > SplitList_Michael_RCU_SHB_dyn_cmp_seqcst;
+        typedef cc::SplitListSet< rcu_sht, key_val, traits_SplitList_Michael_dyn_cmp_seqcst > SplitList_Michael_RCU_SHT_dyn_cmp_seqcst;
+#endif
+
+        struct traits_SplitList_Michael_st_cmp :
+            public cc::split_list::make_traits<
+                cc::split_list::ordered_list<cc::michael_list_tag>
+                ,cc::split_list::dynamic_bucket_table< false >
+                ,co::hash< hash >
+                ,cc::split_list::ordered_list_traits<
+                    typename cc::michael_list::make_traits<
+                        co::compare< compare >
+                    >::type
+                >
+            >::type
+        {};
+        typedef cc::SplitListSet< cds::gc::HP,  key_val, traits_SplitList_Michael_st_cmp > SplitList_Michael_HP_st_cmp;
+        typedef cc::SplitListSet< cds::gc::DHP, key_val, traits_SplitList_Michael_st_cmp > SplitList_Michael_DHP_st_cmp;
+        typedef cc::SplitListSet< rcu_gpi, key_val, traits_SplitList_Michael_st_cmp > SplitList_Michael_RCU_GPI_st_cmp;
+        typedef cc::SplitListSet< rcu_gpb, key_val, traits_SplitList_Michael_st_cmp > SplitList_Michael_RCU_GPB_st_cmp;
+        typedef cc::SplitListSet< rcu_gpt, key_val, traits_SplitList_Michael_st_cmp > SplitList_Michael_RCU_GPT_st_cmp;
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        typedef cc::SplitListSet< rcu_shb, key_val, traits_SplitList_Michael_st_cmp > SplitList_Michael_RCU_SHB_st_cmp;
+        typedef cc::SplitListSet< rcu_sht, key_val, traits_SplitList_Michael_st_cmp > SplitList_Michael_RCU_SHT_st_cmp;
+#endif
+
+        struct traits_SplitList_Michael_st_cmp_seqcst :
+            public cc::split_list::make_traits<
+                cc::split_list::ordered_list<cc::michael_list_tag>
+                ,co::hash< hash >
+                ,cc::split_list::dynamic_bucket_table< false >
+                ,co::memory_model< co::v::sequential_consistent >
+                ,cc::split_list::ordered_list_traits<
+                    typename cc::michael_list::make_traits<
+                        co::compare< compare >
+                        ,co::memory_model< co::v::sequential_consistent >
+                    >::type
+                >
+            >::type
+        {};
+        typedef cc::SplitListSet< cds::gc::HP,  key_val, traits_SplitList_Michael_st_cmp_seqcst> SplitList_Michael_HP_st_cmp_seqcst;
+        typedef cc::SplitListSet< cds::gc::DHP, key_val, traits_SplitList_Michael_st_cmp_seqcst> SplitList_Michael_DHP_st_cmp_seqcst;
+        typedef cc::SplitListSet< rcu_gpi, key_val, traits_SplitList_Michael_st_cmp_seqcst> SplitList_Michael_RCU_GPI_st_cmp_seqcst;
+        typedef cc::SplitListSet< rcu_gpb, key_val, traits_SplitList_Michael_st_cmp_seqcst> SplitList_Michael_RCU_GPB_st_cmp_seqcst;
+        typedef cc::SplitListSet< rcu_gpt, key_val, traits_SplitList_Michael_st_cmp_seqcst> SplitList_Michael_RCU_GPT_st_cmp_seqcst;
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        typedef cc::SplitListSet< rcu_shb, key_val, traits_SplitList_Michael_st_cmp_seqcst> SplitList_Michael_RCU_SHB_st_cmp_seqcst;
+        typedef cc::SplitListSet< rcu_sht, key_val, traits_SplitList_Michael_st_cmp_seqcst> SplitList_Michael_RCU_SHT_st_cmp_seqcst;
+#endif
+
+        //HP + less
+        struct traits_SplitList_Michael_dyn_less :
+            public cc::split_list::make_traits<
+                cc::split_list::ordered_list<cc::michael_list_tag>
+                ,co::hash< hash >
+                ,cc::split_list::ordered_list_traits<
+                    typename cc::michael_list::make_traits<
+                        co::less< less >
+                    >::type
+                >
+            >::type
+        {};
+        typedef cc::SplitListSet< cds::gc::HP,  key_val, traits_SplitList_Michael_dyn_less > SplitList_Michael_HP_dyn_less;
+        typedef cc::SplitListSet< cds::gc::DHP, key_val, traits_SplitList_Michael_dyn_less > SplitList_Michael_DHP_dyn_less;
+        typedef cc::SplitListSet< rcu_gpi, key_val, traits_SplitList_Michael_dyn_less > SplitList_Michael_RCU_GPI_dyn_less;
+        typedef cc::SplitListSet< rcu_gpb, key_val, traits_SplitList_Michael_dyn_less > SplitList_Michael_RCU_GPB_dyn_less;
+        typedef cc::SplitListSet< rcu_gpt, key_val, traits_SplitList_Michael_dyn_less > SplitList_Michael_RCU_GPT_dyn_less;
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        typedef cc::SplitListSet< rcu_shb, key_val, traits_SplitList_Michael_dyn_less > SplitList_Michael_RCU_SHB_dyn_less;
+        typedef cc::SplitListSet< rcu_sht, key_val, traits_SplitList_Michael_dyn_less > SplitList_Michael_RCU_SHT_dyn_less;
+#endif
+
+        struct traits_SplitList_Michael_dyn_less_seqcst :
+            public cc::split_list::make_traits<
+                cc::split_list::ordered_list<cc::michael_list_tag>
+                ,co::hash< hash >
+                ,co::memory_model< co::v::sequential_consistent >
+                ,cc::split_list::ordered_list_traits<
+                    typename cc::michael_list::make_traits<
+                        co::less< less >
+                        ,co::memory_model< co::v::sequential_consistent >
+                    >::type
+                >
+            >::type
+        {};
+        typedef cc::SplitListSet< cds::gc::HP, key_val,  traits_SplitList_Michael_dyn_less_seqcst > SplitList_Michael_HP_dyn_less_seqcst;
+        typedef cc::SplitListSet< cds::gc::DHP, key_val, traits_SplitList_Michael_dyn_less_seqcst > SplitList_Michael_DHP_dyn_less_seqcst;
+        typedef cc::SplitListSet< rcu_gpi, key_val, traits_SplitList_Michael_dyn_less_seqcst > SplitList_Michael_RCU_GPI_dyn_less_seqcst;
+        typedef cc::SplitListSet< rcu_gpb, key_val, traits_SplitList_Michael_dyn_less_seqcst > SplitList_Michael_RCU_GPB_dyn_less_seqcst;
+        typedef cc::SplitListSet< rcu_gpt, key_val, traits_SplitList_Michael_dyn_less_seqcst > SplitList_Michael_RCU_GPT_dyn_less_seqcst;
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        typedef cc::SplitListSet< rcu_shb, key_val, traits_SplitList_Michael_dyn_less_seqcst > SplitList_Michael_RCU_SHB_dyn_less_seqcst;
+        typedef cc::SplitListSet< rcu_sht, key_val, traits_SplitList_Michael_dyn_less_seqcst > SplitList_Michael_RCU_SHT_dyn_less_seqcst;
+#endif
+
+        struct traits_SplitList_Michael_st_less :
+            public cc::split_list::make_traits<
+                cc::split_list::ordered_list<cc::michael_list_tag>
+                ,cc::split_list::dynamic_bucket_table< false >
+                ,co::hash< hash >
+                ,cc::split_list::ordered_list_traits<
+                    typename cc::michael_list::make_traits<
+                        co::less< less >
+                    >::type
+                >
+            >::type
+        {};
+        typedef cc::SplitListSet< cds::gc::HP,  key_val, traits_SplitList_Michael_st_less > SplitList_Michael_HP_st_less;
+        typedef cc::SplitListSet< cds::gc::DHP, key_val, traits_SplitList_Michael_st_less > SplitList_Michael_DHP_st_less;
+        typedef cc::SplitListSet< rcu_gpi, key_val, traits_SplitList_Michael_st_less > SplitList_Michael_RCU_GPI_st_less;
+        typedef cc::SplitListSet< rcu_gpb, key_val, traits_SplitList_Michael_st_less > SplitList_Michael_RCU_GPB_st_less;
+        typedef cc::SplitListSet< rcu_gpt, key_val, traits_SplitList_Michael_st_less > SplitList_Michael_RCU_GPT_st_less;
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        typedef cc::SplitListSet< rcu_shb, key_val, traits_SplitList_Michael_st_less > SplitList_Michael_RCU_SHB_st_less;
+        typedef cc::SplitListSet< rcu_sht, key_val, traits_SplitList_Michael_st_less > SplitList_Michael_RCU_SHT_st_less;
+#endif
+
+        struct traits_SplitList_Michael_st_less_stat :
+            public cc::split_list::make_traits<
+                cc::split_list::ordered_list<cc::michael_list_tag>
+                ,cc::split_list::dynamic_bucket_table< false >
+                ,co::hash< hash >
+                ,co::stat< cc::split_list::stat<>>
+                ,cc::split_list::ordered_list_traits<
+                    typename cc::michael_list::make_traits<
+                        co::less< less >
+                    >::type
+                >
+            >::type
+        {};
+        typedef cc::SplitListSet< cds::gc::HP,  key_val, traits_SplitList_Michael_st_less_stat > SplitList_Michael_HP_st_less_stat;
+        typedef cc::SplitListSet< cds::gc::DHP, key_val, traits_SplitList_Michael_st_less_stat > SplitList_Michael_DHP_st_less_stat;
+        typedef cc::SplitListSet< rcu_gpi, key_val, traits_SplitList_Michael_st_less_stat > SplitList_Michael_RCU_GPI_st_less_stat;
+        typedef cc::SplitListSet< rcu_gpb, key_val, traits_SplitList_Michael_st_less_stat > SplitList_Michael_RCU_GPB_st_less_stat;
+        typedef cc::SplitListSet< rcu_gpt, key_val, traits_SplitList_Michael_st_less_stat > SplitList_Michael_RCU_GPT_st_less_stat;
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        typedef cc::SplitListSet< rcu_shb, key_val, traits_SplitList_Michael_st_less_stat > SplitList_Michael_RCU_SHB_st_less_stat;
+        typedef cc::SplitListSet< rcu_sht, key_val, traits_SplitList_Michael_st_less_stat > SplitList_Michael_RCU_SHT_st_less_stat;
+#endif
+
+        struct traits_SplitList_Michael_st_less_seqcst :
+            public cc::split_list::make_traits<
+                cc::split_list::ordered_list<cc::michael_list_tag>
+                ,co::hash< hash >
+                ,cc::split_list::dynamic_bucket_table< false >
+                ,co::memory_model< co::v::sequential_consistent >
+                ,cc::split_list::ordered_list_traits<
+                    typename cc::michael_list::make_traits<
+                        co::less< less >
+                        ,co::memory_model< co::v::sequential_consistent >
+                    >::type
+                >
+            >::type
+        {};
+        typedef cc::SplitListSet< cds::gc::HP,  key_val, traits_SplitList_Michael_st_less_seqcst > SplitList_Michael_HP_st_less_seqcst;
+        typedef cc::SplitListSet< cds::gc::DHP, key_val, traits_SplitList_Michael_st_less_seqcst > SplitList_Michael_DHP_st_less_seqcst;
+        typedef cc::SplitListSet< rcu_gpi, key_val, traits_SplitList_Michael_st_less_seqcst > SplitList_Michael_RCU_GPI_st_less_seqcst;
+        typedef cc::SplitListSet< rcu_gpb, key_val, traits_SplitList_Michael_st_less_seqcst > SplitList_Michael_RCU_GPB_st_less_seqcst;
+        typedef cc::SplitListSet< rcu_gpt, key_val, traits_SplitList_Michael_st_less_seqcst > SplitList_Michael_RCU_GPT_st_less_seqcst;
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        typedef cc::SplitListSet< rcu_shb, key_val, traits_SplitList_Michael_st_less_seqcst > SplitList_Michael_RCU_SHB_st_less_seqcst;
+        typedef cc::SplitListSet< rcu_sht, key_val, traits_SplitList_Michael_st_less_seqcst > SplitList_Michael_RCU_SHT_st_less_seqcst;
+#endif
+
+        // ***************************************************************************
+        // SplitListSet based on LazyList
+
+        struct traits_SplitList_Lazy_dyn_cmp :
+            public cc::split_list::make_traits<
+                cc::split_list::ordered_list<cc::lazy_list_tag>
+                ,co::hash< hash >
+                ,cc::split_list::ordered_list_traits<
+                    typename cc::lazy_list::make_traits<
+                        co::compare< compare >
+                    >::type
+                >
+            >::type
+        {};
+        typedef cc::SplitListSet< cds::gc::HP, key_val, traits_SplitList_Lazy_dyn_cmp > SplitList_Lazy_HP_dyn_cmp;
+        typedef cc::SplitListSet< cds::gc::DHP, key_val, traits_SplitList_Lazy_dyn_cmp > SplitList_Lazy_DHP_dyn_cmp;
+        typedef cc::SplitListSet< rcu_gpi, key_val, traits_SplitList_Lazy_dyn_cmp > SplitList_Lazy_RCU_GPI_dyn_cmp;
+        typedef cc::SplitListSet< rcu_gpb, key_val, traits_SplitList_Lazy_dyn_cmp > SplitList_Lazy_RCU_GPB_dyn_cmp;
+        typedef cc::SplitListSet< rcu_gpt, key_val, traits_SplitList_Lazy_dyn_cmp > SplitList_Lazy_RCU_GPT_dyn_cmp;
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        typedef cc::SplitListSet< rcu_shb, key_val, traits_SplitList_Lazy_dyn_cmp > SplitList_Lazy_RCU_SHB_dyn_cmp;
+        typedef cc::SplitListSet< rcu_sht, key_val, traits_SplitList_Lazy_dyn_cmp > SplitList_Lazy_RCU_SHT_dyn_cmp;
+#endif
+
+        struct traits_SplitList_Lazy_dyn_cmp_stat : public traits_SplitList_Lazy_dyn_cmp
+        {
+            typedef cc::split_list::stat<> stat;
+        };
+        typedef cc::SplitListSet< cds::gc::HP, key_val, traits_SplitList_Lazy_dyn_cmp_stat > SplitList_Lazy_HP_dyn_cmp_stat;
+        typedef cc::SplitListSet< cds::gc::DHP, key_val, traits_SplitList_Lazy_dyn_cmp_stat > SplitList_Lazy_DHP_dyn_cmp_stat;
+        typedef cc::SplitListSet< rcu_gpi, key_val, traits_SplitList_Lazy_dyn_cmp_stat > SplitList_Lazy_RCU_GPI_dyn_cmp_stat;
+        typedef cc::SplitListSet< rcu_gpb, key_val, traits_SplitList_Lazy_dyn_cmp_stat > SplitList_Lazy_RCU_GPB_dyn_cmp_stat;
+        typedef cc::SplitListSet< rcu_gpt, key_val, traits_SplitList_Lazy_dyn_cmp_stat > SplitList_Lazy_RCU_GPT_dyn_cmp_stat;
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        typedef cc::SplitListSet< rcu_shb, key_val, traits_SplitList_Lazy_dyn_cmp > SplitList_Lazy_RCU_SHB_dyn_cmp_stat;
+        typedef cc::SplitListSet< rcu_sht, key_val, traits_SplitList_Lazy_dyn_cmp > SplitList_Lazy_RCU_SHT_dyn_cmp_stat;
+#endif
+
+        struct traits_SplitList_Lazy_dyn_cmp_seqcst :
+            public cc::split_list::make_traits<
+                cc::split_list::ordered_list<cc::lazy_list_tag>
+                ,co::hash< hash >
+                ,co::memory_model< co::v::sequential_consistent >
+                ,cc::split_list::ordered_list_traits<
+                    typename cc::lazy_list::make_traits<
+                        co::compare< compare >
+                        ,co::memory_model< co::v::sequential_consistent >
+                    >::type
+                >
+            >::type
+        {};
+        typedef cc::SplitListSet< cds::gc::HP, key_val, traits_SplitList_Lazy_dyn_cmp_seqcst > SplitList_Lazy_HP_dyn_cmp_seqcst;
+        typedef cc::SplitListSet< cds::gc::DHP, key_val, traits_SplitList_Lazy_dyn_cmp_seqcst > SplitList_Lazy_DHP_dyn_cmp_seqcst;
+        typedef cc::SplitListSet< rcu_gpi, key_val, traits_SplitList_Lazy_dyn_cmp_seqcst > SplitList_Lazy_RCU_GPI_dyn_cmp_seqcst;
+        typedef cc::SplitListSet< rcu_gpb, key_val, traits_SplitList_Lazy_dyn_cmp_seqcst > SplitList_Lazy_RCU_GPB_dyn_cmp_seqcst;
+        typedef cc::SplitListSet< rcu_gpt, key_val, traits_SplitList_Lazy_dyn_cmp_seqcst > SplitList_Lazy_RCU_GPT_dyn_cmp_seqcst;
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        typedef cc::SplitListSet< rcu_shb, key_val, traits_SplitList_Lazy_dyn_cmp_seqcst > SplitList_Lazy_RCU_SHB_dyn_cmp_seqcst;
+        typedef cc::SplitListSet< rcu_sht, key_val, traits_SplitList_Lazy_dyn_cmp_seqcst > SplitList_Lazy_RCU_SHT_dyn_cmp_seqcst;
+#endif
+
+        struct traits_SplitList_Lazy_st_cmp :
+            public cc::split_list::make_traits<
+                cc::split_list::ordered_list<cc::lazy_list_tag>
+                ,cc::split_list::dynamic_bucket_table< false >
+                ,co::hash< hash >
+                ,cc::split_list::ordered_list_traits<
+                    typename cc::lazy_list::make_traits<
+                        co::compare< compare >
+                    >::type
+                >
+            >::type
+        {};
+        typedef cc::SplitListSet< cds::gc::HP, key_val, traits_SplitList_Lazy_st_cmp > SplitList_Lazy_HP_st_cmp;
+        typedef cc::SplitListSet< cds::gc::DHP, key_val, traits_SplitList_Lazy_st_cmp > SplitList_Lazy_DHP_st_cmp;
+        typedef cc::SplitListSet< rcu_gpi, key_val, traits_SplitList_Lazy_st_cmp > SplitList_Lazy_RCU_GPI_st_cmp;
+        typedef cc::SplitListSet< rcu_gpb, key_val, traits_SplitList_Lazy_st_cmp > SplitList_Lazy_RCU_GPB_st_cmp;
+        typedef cc::SplitListSet< rcu_gpt, key_val, traits_SplitList_Lazy_st_cmp > SplitList_Lazy_RCU_GPT_st_cmp;
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        typedef cc::SplitListSet< rcu_shb, key_val, traits_SplitList_Lazy_st_cmp > SplitList_Lazy_RCU_SHB_st_cmp;
+        typedef cc::SplitListSet< rcu_sht, key_val, traits_SplitList_Lazy_st_cmp > SplitList_Lazy_RCU_SHT_st_cmp;
+#endif
+
+        struct traits_SplitList_Lazy_st_cmp_seqcst :
+            public cc::split_list::make_traits<
+                cc::split_list::ordered_list<cc::lazy_list_tag>
+                ,co::hash< hash >
+                ,cc::split_list::dynamic_bucket_table< false >
+                ,co::memory_model< co::v::sequential_consistent >
+                ,cc::split_list::ordered_list_traits<
+                    typename cc::lazy_list::make_traits<
+                        co::compare< compare >
+                        ,co::memory_model< co::v::sequential_consistent >
+                    >::type
+                >
+            >::type
+        {};
+        typedef cc::SplitListSet< cds::gc::HP, key_val, traits_SplitList_Lazy_st_cmp_seqcst > SplitList_Lazy_HP_st_cmp_seqcst;
+        typedef cc::SplitListSet< cds::gc::DHP, key_val, traits_SplitList_Lazy_st_cmp_seqcst > SplitList_Lazy_DHP_st_cmp_seqcst;
+        typedef cc::SplitListSet< rcu_gpi, key_val, traits_SplitList_Lazy_st_cmp_seqcst > SplitList_Lazy_RCU_GPI_st_cmp_seqcst;
+        typedef cc::SplitListSet< rcu_gpb, key_val, traits_SplitList_Lazy_st_cmp_seqcst > SplitList_Lazy_RCU_GPB_st_cmp_seqcst;
+        typedef cc::SplitListSet< rcu_gpt, key_val, traits_SplitList_Lazy_st_cmp_seqcst > SplitList_Lazy_RCU_GPT_st_cmp_seqcst;
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        typedef cc::SplitListSet< rcu_shb, key_val, traits_SplitList_Lazy_st_cmp_seqcst > SplitList_Lazy_RCU_SHB_st_cmp_seqcst;
+        typedef cc::SplitListSet< rcu_sht, key_val, traits_SplitList_Lazy_st_cmp_seqcst > SplitList_Lazy_RCU_SHT_st_cmp_seqcst;
+#endif
+
+        struct traits_SplitList_Lazy_dyn_less :
+            public cc::split_list::make_traits<
+                cc::split_list::ordered_list<cc::lazy_list_tag>
+                ,co::hash< hash >
+                ,cc::split_list::ordered_list_traits<
+                    typename cc::lazy_list::make_traits<
+                        co::less< less >
+                    >::type
+                >
+            >::type
+        {};
+        typedef cc::SplitListSet< cds::gc::HP, key_val, traits_SplitList_Lazy_dyn_less > SplitList_Lazy_HP_dyn_less;
+        typedef cc::SplitListSet< cds::gc::DHP, key_val, traits_SplitList_Lazy_dyn_less > SplitList_Lazy_DHP_dyn_less;
+        typedef cc::SplitListSet< rcu_gpi, key_val, traits_SplitList_Lazy_dyn_less > SplitList_Lazy_RCU_GPI_dyn_less;
+        typedef cc::SplitListSet< rcu_gpb, key_val, traits_SplitList_Lazy_dyn_less > SplitList_Lazy_RCU_GPB_dyn_less;
+        typedef cc::SplitListSet< rcu_gpt, key_val, traits_SplitList_Lazy_dyn_less > SplitList_Lazy_RCU_GPT_dyn_less;
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        typedef cc::SplitListSet< rcu_shb, key_val, traits_SplitList_Lazy_dyn_less > SplitList_Lazy_RCU_SHB_dyn_less;
+        typedef cc::SplitListSet< rcu_sht, key_val, traits_SplitList_Lazy_dyn_less > SplitList_Lazy_RCU_SHT_dyn_less;
+#endif
+
+        struct traits_SplitList_Lazy_dyn_less_seqcst :
+            public cc::split_list::make_traits<
+                cc::split_list::ordered_list<cc::lazy_list_tag>
+                ,co::hash< hash >
+                ,co::memory_model< co::v::sequential_consistent >
+                ,cc::split_list::ordered_list_traits<
+                    typename cc::lazy_list::make_traits<
+                        co::less< less >
+                        ,co::memory_model< co::v::sequential_consistent >
+                    >::type
+                >
+            >::type
+        {};
+        typedef cc::SplitListSet< cds::gc::HP, key_val, traits_SplitList_Lazy_dyn_less_seqcst > SplitList_Lazy_HP_dyn_less_seqcst;
+        typedef cc::SplitListSet< cds::gc::DHP, key_val, traits_SplitList_Lazy_dyn_less_seqcst > SplitList_Lazy_DHP_dyn_less_seqcst;
+        typedef cc::SplitListSet< rcu_gpi, key_val, traits_SplitList_Lazy_dyn_less_seqcst > SplitList_Lazy_RCU_GPI_dyn_less_seqcst;
+        typedef cc::SplitListSet< rcu_gpb, key_val, traits_SplitList_Lazy_dyn_less_seqcst > SplitList_Lazy_RCU_GPB_dyn_less_seqcst;
+        typedef cc::SplitListSet< rcu_gpt, key_val, traits_SplitList_Lazy_dyn_less_seqcst > SplitList_Lazy_RCU_GPT_dyn_less_seqcst;
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        typedef cc::SplitListSet< rcu_shb, key_val, traits_SplitList_Lazy_dyn_less_seqcst > SplitList_Lazy_RCU_SHB_dyn_less_seqcst;
+        typedef cc::SplitListSet< rcu_sht, key_val, traits_SplitList_Lazy_dyn_less_seqcst > SplitList_Lazy_RCU_SHT_dyn_less_seqcst;
+#endif
+
+        struct traits_SplitList_Lazy_st_less :
+            public cc::split_list::make_traits<
+                cc::split_list::ordered_list<cc::lazy_list_tag>
+                ,cc::split_list::dynamic_bucket_table< false >
+                ,co::hash< hash >
+                ,cc::split_list::ordered_list_traits<
+                    typename cc::lazy_list::make_traits<
+                        co::less< less >
+                    >::type
+                >
+            >::type
+        {};
+        typedef cc::SplitListSet< cds::gc::HP, key_val, traits_SplitList_Lazy_st_less > SplitList_Lazy_HP_st_less;
+        typedef cc::SplitListSet< cds::gc::DHP, key_val, traits_SplitList_Lazy_st_less > SplitList_Lazy_DHP_st_less;
+        typedef cc::SplitListSet< rcu_gpi, key_val, traits_SplitList_Lazy_st_less > SplitList_Lazy_RCU_GPI_st_less;
+        typedef cc::SplitListSet< rcu_gpb, key_val, traits_SplitList_Lazy_st_less > SplitList_Lazy_RCU_GPB_st_less;
+        typedef cc::SplitListSet< rcu_gpt, key_val, traits_SplitList_Lazy_st_less > SplitList_Lazy_RCU_GPT_st_less;
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        typedef cc::SplitListSet< rcu_shb, key_val, traits_SplitList_Lazy_st_less > SplitList_Lazy_RCU_SHB_st_less;
+        typedef cc::SplitListSet< rcu_sht, key_val, traits_SplitList_Lazy_st_less > SplitList_Lazy_RCU_SHT_st_less;
+#endif
+
+        struct traits_SplitList_Lazy_st_less_seqcst :
+            public cc::split_list::make_traits<
+                cc::split_list::ordered_list<cc::lazy_list_tag>
+                ,co::hash< hash >
+                ,cc::split_list::dynamic_bucket_table< false >
+                ,co::memory_model< co::v::sequential_consistent >
+                ,cc::split_list::ordered_list_traits<
+                    typename cc::lazy_list::make_traits<
+                        co::less< less >
+                        ,co::memory_model< co::v::sequential_consistent >
+                    >::type
+                >
+            >::type
+        {};
+        typedef cc::SplitListSet< cds::gc::HP, key_val, traits_SplitList_Lazy_st_less_seqcst > SplitList_Lazy_HP_st_less_seqcst;
+        typedef cc::SplitListSet< cds::gc::DHP, key_val, traits_SplitList_Lazy_st_less_seqcst > SplitList_Lazy_DHP_st_less_seqcst;
+        typedef cc::SplitListSet< rcu_gpi, key_val, traits_SplitList_Lazy_st_less_seqcst > SplitList_Lazy_RCU_GPI_st_less_seqcst;
+        typedef cc::SplitListSet< rcu_gpb, key_val, traits_SplitList_Lazy_st_less_seqcst > SplitList_Lazy_RCU_GPB_st_less_seqcst;
+        typedef cc::SplitListSet< rcu_gpt, key_val, traits_SplitList_Lazy_st_less_seqcst > SplitList_Lazy_RCU_GPT_st_less_seqcst;
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        typedef cc::SplitListSet< rcu_shb, key_val, traits_SplitList_Lazy_st_less_seqcst > SplitList_Lazy_RCU_SHB_st_less_seqcst;
+        typedef cc::SplitListSet< rcu_sht, key_val, traits_SplitList_Lazy_st_less_seqcst > SplitList_Lazy_RCU_SHT_st_less_seqcst;
+#endif
+
+        struct traits_SplitList_Lazy_st_less_stat : public traits_SplitList_Lazy_st_less
+        {
+            typedef cc::split_list::stat<> stat;
+        };
+        typedef cc::SplitListSet< cds::gc::HP, key_val, traits_SplitList_Lazy_st_less_stat > SplitList_Lazy_HP_st_less_stat;
+        typedef cc::SplitListSet< cds::gc::DHP, key_val, traits_SplitList_Lazy_st_less_stat > SplitList_Lazy_DHP_st_less_stat;
+        typedef cc::SplitListSet< rcu_gpi, key_val, traits_SplitList_Lazy_st_less_stat > SplitList_Lazy_RCU_GPI_st_less_stat;
+        typedef cc::SplitListSet< rcu_gpb, key_val, traits_SplitList_Lazy_st_less_stat > SplitList_Lazy_RCU_GPB_st_less_stat;
+        typedef cc::SplitListSet< rcu_gpt, key_val, traits_SplitList_Lazy_st_less_stat > SplitList_Lazy_RCU_GPT_st_less_stat;
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        typedef cc::SplitListSet< rcu_shb, key_val, traits_SplitList_Lazy_st_less_stat > SplitList_Lazy_RCU_SHB_st_less_stat;
+        typedef cc::SplitListSet< rcu_sht, key_val, traits_SplitList_Lazy_st_less_stat > SplitList_Lazy_RCU_SHT_st_less_stat;
+#endif
+    };
+
+    template <typename GC, typename T, typename Traits>
+    static inline void print_stat( cc::SplitListSet<GC, T, Traits> const& s )
+    {
+        CPPUNIT_MSG( s.statistics() );
+    }
+
+} // namespace set2
+
+#endif // #ifndef CDSUNIT_SET_TYPE_SPLIT_LIST_H
diff --git a/tests/unit/set2/set_type_std.h b/tests/unit/set2/set_type_std.h
new file mode 100644 (file)
index 0000000..fd441be
--- /dev/null
@@ -0,0 +1,206 @@
+//$$CDS-header$$
+
+#ifndef CDSUNIT_SET_TYPE_STD_H
+#define CDSUNIT_SET_TYPE_STD_H
+
+#include <unordered_set>
+#include <set>
+#include <mutex>    //unique_lock
+
+#include "set2/set_type.h"
+
+namespace set2 {
+
+    struct std_implementation_tag;
+
+    template <typename Value, typename Hash, typename Less, typename EqualTo, typename Lock,
+        class Alloc = typename CDS_DEFAULT_ALLOCATOR::template rebind<Value>::other
+    >
+    class StdHashSet
+        : public std::unordered_set<
+            Value
+            , Hash
+            , EqualTo
+            , Alloc
+        >
+    {
+    public:
+        Lock m_lock;
+        typedef std::unique_lock<Lock> scoped_lock;
+        typedef std::unordered_set<
+            Value
+            , Hash
+            , EqualTo
+            , Alloc
+        >   base_class;
+
+    public:
+        typedef typename base_class::value_type value_type;
+        typedef std_implementation_tag implementation_tag;
+
+        StdHashSet( size_t /*nSetSize*/, size_t /*nLoadFactor*/ )
+        {}
+
+        template <typename Key>
+        bool find( const Key& key )
+        {
+            scoped_lock al( m_lock );
+            return base_class::find( value_type(key) ) != base_class::end();
+        }
+
+        template <typename Key>
+        bool insert( Key const& key )
+        {
+            scoped_lock al( m_lock );
+            std::pair<typename base_class::iterator, bool> pRet = base_class::insert( value_type( key ));
+            return pRet.second;
+        }
+
+        template <typename Key, typename Func>
+        bool insert( Key const& key, Func func )
+        {
+            scoped_lock al( m_lock );
+            std::pair<typename base_class::iterator, bool> pRet = base_class::insert( value_type( key ));
+            if ( pRet.second ) {
+                func( *pRet.first );
+                return true;
+            }
+            return false;
+        }
+
+        template <typename T, typename Func>
+        std::pair<bool, bool> ensure( const T& key, Func func )
+        {
+            scoped_lock al( m_lock );
+            std::pair<typename base_class::iterator, bool> pRet = base_class::insert( value_type( key ));
+            if ( pRet.second ) {
+                func( true, *pRet.first, key );
+                return std::make_pair( true, true );
+            }
+            else {
+                func( false, *pRet.first, key );
+                return std::make_pair( true, false );
+            }
+        }
+
+        template <typename Key>
+        bool erase( const Key& key )
+        {
+            scoped_lock al( m_lock );
+            return base_class::erase( value_type(key) ) != 0;
+        }
+
+        template <typename T, typename Func>
+        bool erase( const T& key, Func func )
+        {
+            scoped_lock al( m_lock );
+            typename base_class::iterator it = base_class::find( value_type(key) );
+            if ( it != base_class::end() ) {
+                func( *it );
+                return base_class::erase( it ) != base_class::end();
+            }
+            return false;
+        }
+
+        std::ostream& dump( std::ostream& stm ) { return stm; }
+    };
+
+    template <typename Value, typename Less, typename Lock,
+        class Alloc = typename CDS_DEFAULT_ALLOCATOR::template rebind<Value>::other
+    >
+    class StdSet: public std::set<Value, Less, Alloc>
+    {
+        Lock m_lock;
+        typedef std::unique_lock<Lock> scoped_lock;
+        typedef std::set<Value, Less, Alloc> base_class;
+    public:
+        typedef typename base_class::key_type value_type;
+        typedef std_implementation_tag implementation_tag;
+
+        StdSet( size_t /*nMapSize*/, size_t /*nLoadFactor*/ )
+        {}
+
+        template <typename Key>
+        bool find( const Key& key )
+        {
+            value_type v( key );
+            scoped_lock al( m_lock );
+            return base_class::find( v ) != base_class::end();
+        }
+
+        bool insert( value_type const& v )
+        {
+            scoped_lock al( m_lock );
+            return base_class::insert( v ).second;
+        }
+
+        template <typename Key, typename Func>
+        bool insert( Key const& key, Func func )
+        {
+            scoped_lock al( m_lock );
+            std::pair<typename base_class::iterator, bool> pRet = base_class::insert( value_type( key ));
+            if ( pRet.second ) {
+                func( *pRet.first );
+                return true;
+            }
+            return false;
+        }
+
+        template <typename T, typename Func>
+        std::pair<bool, bool> ensure( const T& key, Func func )
+        {
+            scoped_lock al( m_lock );
+            std::pair<typename base_class::iterator, bool> pRet = base_class::insert( value_type( key ));
+            if ( pRet.second ) {
+                func( true, *pRet.first, key );
+                return std::make_pair( true, true );
+            }
+            else {
+                func( false, *pRet.first, key );
+                return std::make_pair( true, false );
+            }
+        }
+
+        template <typename Key>
+        bool erase( const Key& key )
+        {
+            scoped_lock al( m_lock );
+            return base_class::erase( value_type(key) ) != 0;
+        }
+
+        template <typename T, typename Func>
+        bool erase( const T& key, Func func )
+        {
+            scoped_lock al( m_lock );
+            typename base_class::iterator it = base_class::find( value_type(key) );
+            if ( it != base_class::end() ) {
+                func( *it );
+
+                base_class::erase( it );
+                return true;
+            }
+            return false;
+        }
+
+        std::ostream& dump( std::ostream& stm ) { return stm; }
+    };
+
+    template <typename Key, typename Val>
+    struct set_type< std_implementation_tag, Key, Val >: public set_type_base< Key, Val >
+    {
+        typedef set_type_base< Key, Val > base_class;
+        using base_class::key_val;
+        using base_class::compare;
+        using base_class::less;
+        using base_class::hash;
+
+        typedef StdSet< key_val, less, cds::sync::spin > StdSet_Spin;
+        typedef StdSet< key_val, less, lock::NoLock>     StdSet_NoLock;
+
+        typedef StdHashSet< key_val, hash, less, equal_to, cds::sync::spin > StdHashSet_Spin;
+        typedef StdHashSet< key_val, hash, less, equal_to, lock::NoLock >    StdHashSet_NoLock;
+    };
+
+} // namespace set2
+
+#endif // #ifndef CDSUNIT_SET_TYPE_STD_H
diff --git a/tests/unit/set2/set_type_striped.h b/tests/unit/set2/set_type_striped.h
new file mode 100644 (file)
index 0000000..3807603
--- /dev/null
@@ -0,0 +1,293 @@
+//$$CDS-header$$
+
+#ifndef CDSUNIT_SET_TYPE_STRIPED_H
+#define CDSUNIT_SET_TYPE_STRIPED_H
+
+#include "set2/set_type.h"
+
+#include <cds/container/striped_set/std_list.h>
+#include <cds/container/striped_set/std_vector.h>
+#include <cds/container/striped_set/std_set.h>
+#include <cds/container/striped_set/std_hash_set.h>
+#include <cds/container/striped_set/boost_unordered_set.h>
+
+#include <boost/version.hpp>
+#if BOOST_VERSION >= 104800
+#   include <cds/container/striped_set/boost_slist.h>
+#   include <cds/container/striped_set/boost_list.h>
+#   include <cds/container/striped_set/boost_vector.h>
+#   include <cds/container/striped_set/boost_stable_vector.h>
+#   include <cds/container/striped_set/boost_set.h>
+#   include <cds/container/striped_set/boost_flat_set.h>
+#endif
+#include <cds/container/striped_set.h>
+
+namespace set2 {
+
+    template <typename Key, typename Val>
+    struct set_type< cc::striped_set::implementation_tag, Key, Val >: public set_type_base< Key, Val >
+    {
+        typedef set_type_base< Key, Val > base_class;
+        using base_class::key_val;
+        using base_class::compare;
+        using base_class::less;
+        using base_class::hash;
+
+
+        // ***************************************************************************
+        // StripedSet
+
+        // for sequential containers
+        template <class BucketEntry, typename... Options>
+        class StripedHashSet_seq:
+            public cc::StripedSet< BucketEntry,
+                co::mutex_policy< cc::striped_set::striping<> >
+                ,co::resizing_policy<cc::striped_set::load_factor_resizing<0> >
+                , Options...
+            >
+        {
+            typedef cc::StripedSet< BucketEntry,
+                co::mutex_policy< cc::striped_set::striping<> >
+                ,co::resizing_policy<cc::striped_set::load_factor_resizing<0> >
+                , Options...
+            > base_class;
+            typedef typename base_class::resizing_policy resizing_policy_t;
+
+            resizing_policy_t   m_placeHolder;
+        public:
+            StripedHashSet_seq( size_t nCapacity, size_t nLoadFactor )
+                : base_class( nCapacity / nLoadFactor / 16, *(new(&m_placeHolder) resizing_policy_t( nLoadFactor )) )
+            {}
+
+            template <typename Q, typename Less>
+            bool erase_with( Q const& v, Less /*pred*/ )
+            {
+                return base_class::erase( v );
+            }
+        };
+
+        // for non-sequential ordered containers
+        template <class BucketEntry, typename... Options>
+        class StripedHashSet_ord:
+            public cc::StripedSet< BucketEntry,
+                co::resizing_policy<cc::striped_set::load_factor_resizing<0> >
+                ,co::mutex_policy< cc::striped_set::striping<> >
+                , Options...
+            >
+        {
+            typedef cc::StripedSet< BucketEntry,
+               co::resizing_policy<cc::striped_set::load_factor_resizing<0> >
+                ,co::mutex_policy< cc::striped_set::striping<> >
+                , Options...
+            > base_class;
+            typedef typename base_class::resizing_policy resizing_policy_t;
+
+            resizing_policy_t   m_placeHolder;
+        public:
+            StripedHashSet_ord( size_t /*nCapacity*/, size_t nLoadFactor )
+                : base_class( 0, *(new(&m_placeHolder) resizing_policy_t( nLoadFactor * 1024 )) )
+            {}
+
+            template <typename Q, typename Less>
+            bool erase_with( Q const& v, Less /*pred*/ )
+            {
+                return base_class::erase( v );
+            }
+        };
+
+        typedef StripedHashSet_seq<
+            std::list< key_val >
+            , co::hash< hash2 >
+            , co::less< less >
+        > StripedSet_list;
+
+        typedef StripedHashSet_seq<
+            std::vector< key_val >
+            , co::hash< hash2 >
+            , co::less< less >
+        > StripedSet_vector;
+
+#if BOOST_VERSION >= 104800
+        typedef StripedHashSet_seq<
+            boost::container::slist< key_val >
+            , co::hash< hash2 >
+            , co::less< less >
+        > StripedSet_boost_slist;
+
+        typedef StripedHashSet_seq<
+            boost::container::list< key_val >
+            , co::hash< hash2 >
+            , co::less< less >
+        > StripedSet_boost_list;
+
+        typedef StripedHashSet_seq<
+            boost::container::vector< key_val >
+            , co::hash< hash2 >
+            , co::less< less >
+        > StripedSet_boost_vector;
+
+        typedef StripedHashSet_seq<
+            boost::container::stable_vector< key_val >
+            , co::hash< hash2 >
+            , co::less< less >
+        > StripedSet_boost_stable_vector;
+#endif
+
+        typedef StripedHashSet_ord<
+            std::set< key_val, less >
+            , co::hash< hash2 >
+        > StripedSet_set;
+
+        typedef StripedHashSet_ord<
+            std::unordered_set< key_val, hash, equal_to >
+            , co::hash< hash2 >
+        > StripedSet_hashset;
+
+#if BOOST_VERSION >= 104800
+        typedef StripedHashSet_ord<
+            boost::container::set< key_val, less >
+            , co::hash< hash2 >
+        > StripedSet_boost_set;
+
+        typedef StripedHashSet_ord<
+            boost::container::flat_set< key_val, less >
+            , co::hash< hash2 >
+        > StripedSet_boost_flat_set;
+#endif
+
+        typedef StripedHashSet_ord<
+            boost::unordered_set< key_val, hash, equal_to >
+            , co::hash< hash2 >
+        > StripedSet_boost_unordered_set;
+
+
+        // ***************************************************************************
+        // RefinableSet
+
+        // for sequential containers
+        template <class BucketEntry, typename... Options>
+        class RefinableHashSet_seq:
+            public cc::StripedSet< BucketEntry,
+            co::mutex_policy< cc::striped_set::refinable<> >
+            ,co::resizing_policy<cc::striped_set::load_factor_resizing<0> >
+            , Options...
+            >
+        {
+            typedef cc::StripedSet< BucketEntry,
+                co::mutex_policy< cc::striped_set::refinable<> >
+                ,co::resizing_policy<cc::striped_set::load_factor_resizing<0> >
+                , Options...
+            > base_class;
+            typedef typename base_class::resizing_policy resizing_policy_t;
+
+            resizing_policy_t   m_placeHolder;
+        public:
+            RefinableHashSet_seq( size_t nCapacity, size_t nLoadFactor )
+                : base_class( nCapacity / nLoadFactor / 16, *(new(&m_placeHolder) resizing_policy_t( nLoadFactor )) )
+            {}
+
+            template <typename Q, typename Less>
+            bool erase_with( Q const& v, Less /*pred*/ )
+            {
+                return base_class::erase( v );
+            }
+        };
+
+        // for non-sequential ordered containers
+        template <class BucketEntry, typename... Options>
+        class RefinableHashSet_ord:
+            public cc::StripedSet< BucketEntry,
+                co::resizing_policy<cc::striped_set::load_factor_resizing<0> >
+                ,co::mutex_policy< cc::striped_set::refinable<> >
+                , Options...
+            >
+        {
+            typedef cc::StripedSet< BucketEntry,
+                co::resizing_policy<cc::striped_set::load_factor_resizing<0> >
+                ,co::mutex_policy< cc::striped_set::refinable<> >
+                , Options...
+            > base_class;
+            typedef typename base_class::resizing_policy resizing_policy_t;
+
+            resizing_policy_t   m_placeHolder;
+        public:
+            RefinableHashSet_ord( size_t /*nCapacity*/, size_t nLoadFactor )
+                : base_class( 0, *(new(&m_placeHolder) resizing_policy_t( nLoadFactor * 1024 )) )
+            {}
+
+            template <typename Q, typename Less>
+            bool erase_with( Q const& v, Less /*pred*/ )
+            {
+                return base_class::erase( v );
+            }
+        };
+
+        typedef RefinableHashSet_seq<
+            std::list< key_val >
+            , co::hash< hash2 >
+            , co::less< less >
+        > RefinableSet_list;
+
+        typedef RefinableHashSet_seq<
+            std::vector< key_val >
+            , co::hash< hash2 >
+            , co::less< less >
+        > RefinableSet_vector;
+
+#if BOOST_VERSION >= 104800
+        typedef RefinableHashSet_seq<
+            boost::container::slist< key_val >
+            , co::hash< hash2 >
+            , co::less< less >
+        > RefinableSet_boost_slist;
+
+        typedef RefinableHashSet_seq<
+            boost::container::list< key_val >
+            , co::hash< hash2 >
+            , co::less< less >
+        > RefinableSet_boost_list;
+
+        typedef RefinableHashSet_seq<
+            boost::container::vector< key_val >
+            , co::hash< hash2 >
+            , co::less< less >
+        > RefinableSet_boost_vector;
+
+        typedef RefinableHashSet_seq<
+            boost::container::stable_vector< key_val >
+            , co::hash< hash2 >
+            , co::less< less >
+        > RefinableSet_boost_stable_vector;
+#endif
+
+        typedef RefinableHashSet_ord<
+            std::set< key_val, less >
+            , co::hash< hash2 >
+        > RefinableSet_set;
+
+        typedef RefinableHashSet_ord<
+            std::unordered_set< key_val, hash, equal_to >
+            , co::hash< hash2 >
+        > RefinableSet_hashset;
+
+#if BOOST_VERSION >= 104800
+        typedef RefinableHashSet_ord<
+            boost::container::set< key_val, less >
+            , co::hash< hash2 >
+        > RefinableSet_boost_set;
+
+        typedef RefinableHashSet_ord<
+            boost::container::flat_set< key_val, less >
+            , co::hash< hash2 >
+        > RefinableSet_boost_flat_set;
+#endif
+
+        typedef RefinableHashSet_ord<
+            boost::unordered_set< key_val, hash, equal_to >
+            , co::hash< hash2 >
+        > RefinableSet_boost_unordered_set;
+    };
+
+} // namespace set2
+
+#endif // #ifndef CDSUNIT_SET_TYPE_STRIPED_H
diff --git a/tests/unit/set2/set_types.h b/tests/unit/set2/set_types.h
deleted file mode 100644 (file)
index 1e16323..0000000
+++ /dev/null
@@ -1,1825 +0,0 @@
-//$$CDS-header$$
-
-#ifndef CDSUNIT_SET_TYPES_H
-#define CDSUNIT_SET_TYPES_H
-
-#include <cds/urcu/general_instant.h>
-#include <cds/urcu/general_buffered.h>
-#include <cds/urcu/general_threaded.h>
-#include <cds/urcu/signal_buffered.h>
-#include <cds/urcu/signal_threaded.h>
-
-#include <cds/container/michael_list_hp.h>
-#include <cds/container/michael_list_dhp.h>
-#include <cds/container/michael_list_rcu.h>
-#include <cds/container/lazy_list_hp.h>
-#include <cds/container/lazy_list_dhp.h>
-#include <cds/container/lazy_list_rcu.h>
-
-#include <cds/container/michael_set.h>
-#include <cds/container/michael_set_rcu.h>
-
-#include <cds/container/split_list_set.h>
-#include <cds/container/split_list_set_rcu.h>
-
-#include <cds/container/cuckoo_set.h>
-
-#include <cds/container/skip_list_set_hp.h>
-#include <cds/container/skip_list_set_dhp.h>
-#include <cds/container/skip_list_set_rcu.h>
-
-#include <cds/container/ellen_bintree_set_rcu.h>
-#include <cds/container/ellen_bintree_set_hp.h>
-#include <cds/container/ellen_bintree_set_dhp.h>
-
-#include <cds/container/striped_set/std_list.h>
-#include <cds/container/striped_set/std_vector.h>
-#include <cds/container/striped_set/std_set.h>
-#include <cds/container/striped_set/std_hash_set.h>
-#include <cds/container/striped_set/boost_unordered_set.h>
-
-#include <boost/version.hpp>
-#if BOOST_VERSION >= 104800
-#   include <cds/container/striped_set/boost_slist.h>
-#   include <cds/container/striped_set/boost_list.h>
-#   include <cds/container/striped_set/boost_vector.h>
-#   include <cds/container/striped_set/boost_stable_vector.h>
-#   include <cds/container/striped_set/boost_set.h>
-#   include <cds/container/striped_set/boost_flat_set.h>
-#endif
-#include <cds/container/striped_set.h>
-
-#include <cds/sync/spinlock.h>
-#include <boost/functional/hash/hash.hpp>
-
-#include "cppunit/cppunit_mini.h"
-#include "lock/nolock.h"
-#include "set2/std_set.h"
-#include "set2/std_hash_set.h"
-#include "michael_alloc.h"
-#include "print_cuckoo_stat.h"
-#include "print_split_list_stat.h"
-#include "print_skip_list_stat.h"
-#include "print_ellenbintree_stat.h"
-#include "ellen_bintree_update_desc_pool.h"
-
-namespace set2 {
-    namespace cc = cds::container;
-    namespace co = cds::opt;
-
-    typedef cds::urcu::gc< cds::urcu::general_instant<> >   rcu_gpi;
-    typedef cds::urcu::gc< cds::urcu::general_buffered<> >  rcu_gpb;
-    typedef cds::urcu::gc< cds::urcu::general_threaded<> >  rcu_gpt;
-#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
-    typedef cds::urcu::gc< cds::urcu::signal_buffered<> >  rcu_shb;
-    typedef cds::urcu::gc< cds::urcu::signal_threaded<> >  rcu_sht;
-#endif
-
-    template <typename V, typename Traits>
-    class CuckooSet : public cc::CuckooSet< V, Traits >
-    {
-    public:
-        typedef cc::CuckooSet< V, Traits > cuckoo_base_class;
-
-    public:
-        CuckooSet( size_t nCapacity, size_t nLoadFactor )
-            : cuckoo_base_class( nCapacity / (nLoadFactor * 16), (unsigned int)4 )
-        {}
-
-        template <typename Q, typename Pred>
-        bool erase_with( Q const& key, Pred /*pred*/ )
-        {
-            return cuckoo_base_class::erase_with( key, typename std::conditional< cuckoo_base_class::c_isSorted, Pred, typename Pred::equal_to>::type() );
-        }
-    };
-
-    template <typename Key>
-    struct cmp {
-        int operator ()(Key const& k1, Key const& k2) const
-        {
-            if ( std::less<Key>( k1, k2 ) )
-                return -1;
-            return std::less<Key>( k2, k1 ) ? 1 : 0;
-        }
-    };
-
-#define CDSUNIT_INT_COMPARE(t)  template <> struct cmp<t> { int operator()( t k1, t k2 ){ return (int)(k1 - k2); } }
-    CDSUNIT_INT_COMPARE(char);
-    CDSUNIT_INT_COMPARE(unsigned char);
-    CDSUNIT_INT_COMPARE(int);
-    CDSUNIT_INT_COMPARE(unsigned int);
-    CDSUNIT_INT_COMPARE(long);
-    CDSUNIT_INT_COMPARE(unsigned long);
-    CDSUNIT_INT_COMPARE(long long);
-    CDSUNIT_INT_COMPARE(unsigned long long);
-#undef CDSUNIT_INT_COMPARE
-
-    template <>
-    struct cmp<std::string>
-    {
-        int operator()(std::string const& s1, std::string const& s2)
-        {
-            return s1.compare( s2 );
-        }
-        int operator()(std::string const& s1, char const * s2)
-        {
-            return s1.compare( s2 );
-        }
-        int operator()(char const * s1, std::string const& s2)
-        {
-            return -s2.compare( s1 );
-        }
-    };
-
-    template <typename Key, typename Value>
-    struct SetTypes {
-
-        typedef Key     key_type;
-        typedef Value   value_type;
-
-        struct key_val {
-            key_type    key;
-            value_type  val;
-
-            /*explicit*/ key_val( key_type const& k ): key(k), val() {}
-            key_val( key_type const& k, value_type const& v ): key(k), val(v) {}
-
-            template <typename K>
-            /*explicit*/ key_val( K const& k ): key(k) {}
-
-            template <typename K, typename T>
-            key_val( K const& k, T const& v ): key(k), val(v) {}
-        };
-
-        typedef co::v::hash<key_type>   key_hash;
-        typedef std::less<key_type>     key_less;
-        typedef cmp<key_type>           key_compare;
-
-        struct less {
-            bool operator()( key_val const& k1, key_val const& k2 ) const
-            {
-                return key_less()( k1.key, k2.key );
-            }
-            bool operator()( key_type const& k1, key_val const& k2 ) const
-            {
-                return key_less()( k1, k2.key );
-            }
-            bool operator()( key_val const& k1, key_type const& k2 ) const
-            {
-                return key_less()( k1.key, k2 );
-            }
-        };
-
-        struct compare {
-            int operator()( key_val const& k1, key_val const& k2 ) const
-            {
-                return key_compare()( k1.key, k2.key );
-            }
-            int operator()( key_type const& k1, key_val const& k2 ) const
-            {
-                return key_compare()( k1, k2.key );
-            }
-            int operator()( key_val const& k1, key_type const& k2 ) const
-            {
-                return key_compare()( k1.key, k2 );
-            }
-        };
-
-        struct equal_to {
-            bool operator()( key_val const& k1, key_val const& k2 ) const
-            {
-                return key_compare()( k1.key, k2.key ) == 0;
-            }
-            bool operator()( key_type const& k1, key_val const& k2 ) const
-            {
-                return key_compare()( k1, k2.key ) == 0;
-            }
-            bool operator()( key_val const& k1, key_type const& k2 ) const
-            {
-                return key_compare()( k1.key, k2 ) == 0;
-            }
-        };
-
-
-        struct hash: public key_hash
-        {
-            size_t operator()( key_val const& v ) const
-            {
-                return key_hash::operator()( v.key );
-            }
-            size_t operator()( key_type const& key ) const
-            {
-                return key_hash::operator()( key );
-            }
-            template <typename Q>
-            size_t operator()( Q const& k ) const
-            {
-                return key_hash::operator()( k );
-            }
-        };
-
-        struct hash2: public hash
-        {
-            size_t operator()( key_val const& k ) const
-            {
-                size_t seed = ~hash::operator ()( k );
-                boost::hash_combine( seed, k.key );
-                return seed;
-            }
-            size_t operator()( key_type const& k ) const
-            {
-                size_t seed = ~hash::operator ()( k );
-                boost::hash_combine( seed, k );
-                return seed;
-            }
-            template <typename Q>
-            size_t operator()( Q const& k ) const
-            {
-                return key_hash::operator()( k );
-            }
-        };
-
-        // ***************************************************************************
-        // MichaelList
-
-        struct traits_MichaelList_cmp_stdAlloc:
-            public cc::michael_list::make_traits<
-                co::compare< compare >
-            >::type
-        {};
-        typedef cc::MichaelList< cds::gc::HP,  key_val, traits_MichaelList_cmp_stdAlloc > MichaelList_HP_cmp_stdAlloc;
-        typedef cc::MichaelList< cds::gc::DHP, key_val, traits_MichaelList_cmp_stdAlloc > MichaelList_DHP_cmp_stdAlloc;
-        typedef cc::MichaelList< rcu_gpi, key_val, traits_MichaelList_cmp_stdAlloc > MichaelList_RCU_GPI_cmp_stdAlloc;
-        typedef cc::MichaelList< rcu_gpb, key_val, traits_MichaelList_cmp_stdAlloc > MichaelList_RCU_GPB_cmp_stdAlloc;
-        typedef cc::MichaelList< rcu_gpt, key_val, traits_MichaelList_cmp_stdAlloc > MichaelList_RCU_GPT_cmp_stdAlloc;
-#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
-        typedef cc::MichaelList< rcu_shb, key_val, traits_MichaelList_cmp_stdAlloc > MichaelList_RCU_SHB_cmp_stdAlloc;
-        typedef cc::MichaelList< rcu_sht, key_val, traits_MichaelList_cmp_stdAlloc > MichaelList_RCU_SHT_cmp_stdAlloc;
-#endif
-
-        struct traits_MichaelList_cmp_stdAlloc_seqcst : public traits_MichaelList_cmp_stdAlloc
-        {
-            typedef co::v::sequential_consistent memory_model;
-        };
-        typedef cc::MichaelList< cds::gc::HP,  key_val, traits_MichaelList_cmp_stdAlloc_seqcst > MichaelList_HP_cmp_stdAlloc_seqcst;
-        typedef cc::MichaelList< cds::gc::DHP, key_val, traits_MichaelList_cmp_stdAlloc_seqcst > MichaelList_DHP_cmp_stdAlloc_seqcst;
-        typedef cc::MichaelList< rcu_gpi, key_val, traits_MichaelList_cmp_stdAlloc_seqcst > MichaelList_RCU_GPI_cmp_stdAlloc_seqcst;
-        typedef cc::MichaelList< rcu_gpb, key_val, traits_MichaelList_cmp_stdAlloc_seqcst > MichaelList_RCU_GPB_cmp_stdAlloc_seqcst;
-        typedef cc::MichaelList< rcu_gpt, key_val, traits_MichaelList_cmp_stdAlloc_seqcst > MichaelList_RCU_GPT_cmp_stdAlloc_seqcst;
-#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
-        typedef cc::MichaelList< rcu_shb, key_val, traits_MichaelList_cmp_stdAlloc_seqcst > MichaelList_RCU_SHB_cmp_stdAlloc_seqcst;
-        typedef cc::MichaelList< rcu_sht, key_val, traits_MichaelList_cmp_stdAlloc_seqcst > MichaelList_RCU_SHT_cmp_stdAlloc_seqcst;
-#endif
-
-        struct traits_MichaelList_less_stdAlloc :
-            public cc::michael_list::make_traits<
-                co::less< less >
-            >::type
-        {};
-        typedef cc::MichaelList< cds::gc::HP,  key_val, traits_MichaelList_less_stdAlloc > MichaelList_HP_less_stdAlloc;
-        typedef cc::MichaelList< cds::gc::DHP, key_val, traits_MichaelList_less_stdAlloc > MichaelList_DHP_less_stdAlloc;
-        typedef cc::MichaelList< rcu_gpi, key_val, traits_MichaelList_less_stdAlloc > MichaelList_RCU_GPI_less_stdAlloc;
-        typedef cc::MichaelList< rcu_gpb, key_val, traits_MichaelList_less_stdAlloc > MichaelList_RCU_GPB_less_stdAlloc;
-        typedef cc::MichaelList< rcu_gpt, key_val, traits_MichaelList_less_stdAlloc > MichaelList_RCU_GPT_less_stdAlloc;
-#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
-        typedef cc::MichaelList< rcu_shb, key_val, traits_MichaelList_less_stdAlloc > MichaelList_RCU_SHB_less_stdAlloc;
-        typedef cc::MichaelList< rcu_sht, key_val, traits_MichaelList_less_stdAlloc > MichaelList_RCU_SHT_less_stdAlloc;
-#endif
-
-        struct traits_MichaelList_less_stdAlloc_seqcst :
-            public cc::michael_list::make_traits<
-                co::less< less >
-                ,co::memory_model< co::v::sequential_consistent >
-            >::type
-        {};
-        typedef cc::MichaelList< cds::gc::HP,  key_val, traits_MichaelList_less_stdAlloc_seqcst > MichaelList_HP_less_stdAlloc_seqcst;
-        typedef cc::MichaelList< cds::gc::DHP, key_val, traits_MichaelList_less_stdAlloc_seqcst > MichaelList_DHP_less_stdAlloc_seqcst;
-        typedef cc::MichaelList< rcu_gpi, key_val, traits_MichaelList_less_stdAlloc_seqcst > MichaelList_RCU_GPI_less_stdAlloc_seqcst;
-        typedef cc::MichaelList< rcu_gpb, key_val, traits_MichaelList_less_stdAlloc_seqcst > MichaelList_RCU_GPB_less_stdAlloc_seqcst;
-        typedef cc::MichaelList< rcu_gpt, key_val, traits_MichaelList_less_stdAlloc_seqcst > MichaelList_RCU_GPT_less_stdAlloc_seqcst;
-#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
-        typedef cc::MichaelList< rcu_shb, key_val, traits_MichaelList_less_stdAlloc_seqcst > MichaelList_RCU_SHB_less_stdAlloc_seqcst;
-        typedef cc::MichaelList< rcu_sht, key_val, traits_MichaelList_less_stdAlloc_seqcst > MichaelList_RCU_SHT_less_stdAlloc_seqcst;
-#endif
-
-        struct traits_MichaelList_cmp_michaelAlloc :
-            public cc::michael_list::make_traits<
-                co::compare< compare >,
-                co::allocator< memory::MichaelAllocator<int> >
-            >::type
-        {};
-        typedef cc::MichaelList< cds::gc::HP,  key_val, traits_MichaelList_cmp_michaelAlloc > MichaelList_HP_cmp_michaelAlloc;
-        typedef cc::MichaelList< cds::gc::DHP, key_val, traits_MichaelList_cmp_michaelAlloc > MichaelList_DHP_cmp_michaelAlloc;
-        typedef cc::MichaelList< rcu_gpi, key_val, traits_MichaelList_cmp_michaelAlloc > MichaelList_RCU_GPI_cmp_michaelAlloc;
-        typedef cc::MichaelList< rcu_gpb, key_val, traits_MichaelList_cmp_michaelAlloc > MichaelList_RCU_GPB_cmp_michaelAlloc;
-        typedef cc::MichaelList< rcu_gpt, key_val, traits_MichaelList_cmp_michaelAlloc > MichaelList_RCU_GPT_cmp_michaelAlloc;
-#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
-        typedef cc::MichaelList< rcu_shb, key_val, traits_MichaelList_cmp_michaelAlloc > MichaelList_RCU_SHB_cmp_michaelAlloc;
-        typedef cc::MichaelList< rcu_sht, key_val, traits_MichaelList_cmp_michaelAlloc > MichaelList_RCU_SHT_cmp_michaelAlloc;
-#endif
-
-        struct traits_MichaelList_less_michaelAlloc :
-            public cc::michael_list::make_traits<
-                co::less< less >,
-                co::allocator< memory::MichaelAllocator<int> >
-            >::type
-        {};
-        typedef cc::MichaelList< cds::gc::HP,  key_val, traits_MichaelList_less_michaelAlloc > MichaelList_HP_less_michaelAlloc;
-        typedef cc::MichaelList< cds::gc::DHP, key_val, traits_MichaelList_less_michaelAlloc > MichaelList_DHP_less_michaelAlloc;
-        typedef cc::MichaelList< rcu_gpi, key_val, traits_MichaelList_less_michaelAlloc > MichaelList_RCU_GPI_less_michaelAlloc;
-        typedef cc::MichaelList< rcu_gpb, key_val, traits_MichaelList_less_michaelAlloc > MichaelList_RCU_GPB_less_michaelAlloc;
-        typedef cc::MichaelList< rcu_gpt, key_val, traits_MichaelList_less_michaelAlloc > MichaelList_RCU_GPT_less_michaelAlloc;
-#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
-        typedef cc::MichaelList< rcu_shb, key_val, traits_MichaelList_less_michaelAlloc > MichaelList_RCU_SHB_less_michaelAlloc;
-        typedef cc::MichaelList< rcu_sht, key_val, traits_MichaelList_less_michaelAlloc > MichaelList_RCU_SHT_less_michaelAlloc;
-#endif
-
-        // ***************************************************************************
-        // MichaelHashSet based on MichaelList
-
-        struct traits_MichaelSet_stdAlloc :
-            public cc::michael_set::make_traits<
-                co::hash< hash >
-            >::type
-        {};
-        typedef cc::MichaelHashSet< cds::gc::HP,  MichaelList_HP_cmp_stdAlloc,  traits_MichaelSet_stdAlloc > MichaelSet_HP_cmp_stdAlloc;
-        typedef cc::MichaelHashSet< cds::gc::DHP, MichaelList_DHP_cmp_stdAlloc, traits_MichaelSet_stdAlloc > MichaelSet_DHP_cmp_stdAlloc;
-        typedef cc::MichaelHashSet< rcu_gpi, MichaelList_RCU_GPI_cmp_stdAlloc, traits_MichaelSet_stdAlloc > MichaelSet_RCU_GPI_cmp_stdAlloc;
-        typedef cc::MichaelHashSet< rcu_gpb, MichaelList_RCU_GPB_cmp_stdAlloc, traits_MichaelSet_stdAlloc > MichaelSet_RCU_GPB_cmp_stdAlloc;
-        typedef cc::MichaelHashSet< rcu_gpt, MichaelList_RCU_GPT_cmp_stdAlloc, traits_MichaelSet_stdAlloc > MichaelSet_RCU_GPT_cmp_stdAlloc;
-#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
-        typedef cc::MichaelHashSet< rcu_shb, MichaelList_RCU_SHB_cmp_stdAlloc, traits_MichaelSet_stdAlloc > MichaelSet_RCU_SHB_cmp_stdAlloc;
-        typedef cc::MichaelHashSet< rcu_sht, MichaelList_RCU_SHT_cmp_stdAlloc, traits_MichaelSet_stdAlloc > MichaelSet_RCU_SHT_cmp_stdAlloc;
-#endif
-
-        typedef cc::MichaelHashSet< cds::gc::HP, MichaelList_HP_less_stdAlloc, traits_MichaelSet_stdAlloc > MichaelSet_HP_less_stdAlloc;
-        typedef cc::MichaelHashSet< cds::gc::DHP, MichaelList_DHP_less_stdAlloc, traits_MichaelSet_stdAlloc > MichaelSet_DHP_less_stdAlloc;
-        typedef cc::MichaelHashSet< rcu_gpi, MichaelList_RCU_GPI_less_stdAlloc, traits_MichaelSet_stdAlloc > MichaelSet_RCU_GPI_less_stdAlloc;
-        typedef cc::MichaelHashSet< rcu_gpb, MichaelList_RCU_GPB_less_stdAlloc, traits_MichaelSet_stdAlloc > MichaelSet_RCU_GPB_less_stdAlloc;
-        typedef cc::MichaelHashSet< rcu_gpt, MichaelList_RCU_GPT_less_stdAlloc, traits_MichaelSet_stdAlloc > MichaelSet_RCU_GPT_less_stdAlloc;
-#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
-        typedef cc::MichaelHashSet< rcu_shb, MichaelList_RCU_SHB_less_stdAlloc, traits_MichaelSet_stdAlloc > MichaelSet_RCU_SHB_less_stdAlloc;
-        typedef cc::MichaelHashSet< rcu_sht, MichaelList_RCU_SHT_less_stdAlloc, traits_MichaelSet_stdAlloc > MichaelSet_RCU_SHT_less_stdAlloc;
-#endif
-
-        typedef cc::MichaelHashSet< cds::gc::HP, MichaelList_HP_less_stdAlloc_seqcst, traits_MichaelSet_stdAlloc > MichaelSet_HP_less_stdAlloc_seqcst;
-        typedef cc::MichaelHashSet< cds::gc::DHP, MichaelList_DHP_less_stdAlloc_seqcst, traits_MichaelSet_stdAlloc > MichaelSet_DHP_less_stdAlloc_seqcst;
-        typedef cc::MichaelHashSet< rcu_gpi, MichaelList_RCU_GPI_less_stdAlloc_seqcst, traits_MichaelSet_stdAlloc > MichaelSet_RCU_GPI_less_stdAlloc_seqcst;
-        typedef cc::MichaelHashSet< rcu_gpb, MichaelList_RCU_GPB_less_stdAlloc_seqcst, traits_MichaelSet_stdAlloc > MichaelSet_RCU_GPB_less_stdAlloc_seqcst;
-        typedef cc::MichaelHashSet< rcu_gpt, MichaelList_RCU_GPT_less_stdAlloc_seqcst, traits_MichaelSet_stdAlloc > MichaelSet_RCU_GPT_less_stdAlloc_seqcst;
-#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
-        typedef cc::MichaelHashSet< rcu_shb, MichaelList_RCU_SHB_less_stdAlloc_seqcst, traits_MichaelSet_stdAlloc > MichaelSet_RCU_SHB_less_stdAlloc_seqcst;
-        typedef cc::MichaelHashSet< rcu_sht, MichaelList_RCU_SHT_less_stdAlloc_seqcst, traits_MichaelSet_stdAlloc > MichaelSet_RCU_SHT_less_stdAlloc_seqcst;
-#endif
-
-        struct traits_MichaelSet_michaelAlloc :
-            public cc::michael_set::make_traits<
-                co::hash< hash >,
-                co::allocator< memory::MichaelAllocator<int> >
-            >::type
-        {};
-        typedef cc::MichaelHashSet< cds::gc::HP,  MichaelList_HP_cmp_michaelAlloc,  traits_MichaelSet_michaelAlloc > MichaelSet_HP_cmp_michaelAlloc;
-        typedef cc::MichaelHashSet< cds::gc::DHP, MichaelList_DHP_cmp_michaelAlloc, traits_MichaelSet_michaelAlloc > MichaelSet_DHP_cmp_michaelAlloc;
-        typedef cc::MichaelHashSet< rcu_gpi, MichaelList_RCU_GPI_cmp_michaelAlloc, traits_MichaelSet_michaelAlloc > MichaelSet_RCU_GPI_cmp_michaelAlloc;
-        typedef cc::MichaelHashSet< rcu_gpb, MichaelList_RCU_GPB_cmp_michaelAlloc, traits_MichaelSet_michaelAlloc > MichaelSet_RCU_GPB_cmp_michaelAlloc;
-        typedef cc::MichaelHashSet< rcu_gpt, MichaelList_RCU_GPT_cmp_michaelAlloc, traits_MichaelSet_michaelAlloc > MichaelSet_RCU_GPT_cmp_michaelAlloc;
-#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
-        typedef cc::MichaelHashSet< rcu_shb, MichaelList_RCU_SHB_cmp_michaelAlloc, traits_MichaelSet_michaelAlloc > MichaelSet_RCU_SHB_cmp_michaelAlloc;
-        typedef cc::MichaelHashSet< rcu_sht, MichaelList_RCU_SHT_cmp_michaelAlloc, traits_MichaelSet_michaelAlloc > MichaelSet_RCU_SHT_cmp_michaelAlloc;
-#endif
-
-        typedef cc::MichaelHashSet< cds::gc::HP, MichaelList_HP_less_michaelAlloc, traits_MichaelSet_michaelAlloc > MichaelSet_HP_less_michaelAlloc;
-        typedef cc::MichaelHashSet< cds::gc::DHP, MichaelList_DHP_less_michaelAlloc, traits_MichaelSet_michaelAlloc > MichaelSet_DHP_less_michaelAlloc;
-        typedef cc::MichaelHashSet< rcu_gpi, MichaelList_RCU_GPI_less_michaelAlloc, traits_MichaelSet_michaelAlloc > MichaelSet_RCU_GPI_less_michaelAlloc;
-        typedef cc::MichaelHashSet< rcu_gpb, MichaelList_RCU_GPB_less_michaelAlloc, traits_MichaelSet_michaelAlloc > MichaelSet_RCU_GPB_less_michaelAlloc;
-        typedef cc::MichaelHashSet< rcu_gpt, MichaelList_RCU_GPT_less_michaelAlloc, traits_MichaelSet_michaelAlloc > MichaelSet_RCU_GPT_less_michaelAlloc;
-#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
-        typedef cc::MichaelHashSet< rcu_shb, MichaelList_RCU_SHB_less_michaelAlloc, traits_MichaelSet_michaelAlloc > MichaelSet_RCU_SHB_less_michaelAlloc;
-        typedef cc::MichaelHashSet< rcu_sht, MichaelList_RCU_SHT_less_michaelAlloc, traits_MichaelSet_michaelAlloc > MichaelSet_RCU_SHT_less_michaelAlloc;
-#endif
-
-
-        // ***************************************************************************
-        // LazyList
-
-        struct traits_LazyList_cmp_stdAlloc :
-            public cc::lazy_list::make_traits<
-                co::compare< compare >
-            >::type
-        {};
-        typedef cc::LazyList< cds::gc::HP,  key_val, traits_LazyList_cmp_stdAlloc > LazyList_HP_cmp_stdAlloc;
-        typedef cc::LazyList< cds::gc::DHP, key_val, traits_LazyList_cmp_stdAlloc > LazyList_DHP_cmp_stdAlloc;
-        typedef cc::LazyList< rcu_gpi, key_val, traits_LazyList_cmp_stdAlloc > LazyList_RCU_GPI_cmp_stdAlloc;
-        typedef cc::LazyList< rcu_gpb, key_val, traits_LazyList_cmp_stdAlloc > LazyList_RCU_GPB_cmp_stdAlloc;
-        typedef cc::LazyList< rcu_gpt, key_val, traits_LazyList_cmp_stdAlloc > LazyList_RCU_GPT_cmp_stdAlloc;
-#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
-        typedef cc::LazyList< rcu_shb, key_val, traits_LazyList_cmp_stdAlloc > LazyList_RCU_SHB_cmp_stdAlloc;
-        typedef cc::LazyList< rcu_sht, key_val, traits_LazyList_cmp_stdAlloc > LazyList_RCU_SHT_cmp_stdAlloc;
-#endif
-        struct traits_LazyList_cmp_stdAlloc_seqcst :
-            public cc::lazy_list::make_traits<
-                co::compare< compare >
-                ,co::memory_model< co::v::sequential_consistent >
-            >::type
-        {};
-        typedef cc::LazyList< cds::gc::HP, key_val,  traits_LazyList_cmp_stdAlloc_seqcst > LazyList_HP_cmp_stdAlloc_seqcst;
-        typedef cc::LazyList< cds::gc::DHP, key_val, traits_LazyList_cmp_stdAlloc_seqcst > LazyList_DHP_cmp_stdAlloc_seqcst;
-        typedef cc::LazyList< rcu_gpi, key_val, traits_LazyList_cmp_stdAlloc_seqcst > LazyList_RCU_GPI_cmp_stdAlloc_seqcst;
-        typedef cc::LazyList< rcu_gpb, key_val, traits_LazyList_cmp_stdAlloc_seqcst > LazyList_RCU_GPB_cmp_stdAlloc_seqcst;
-        typedef cc::LazyList< rcu_gpt, key_val, traits_LazyList_cmp_stdAlloc_seqcst > LazyList_RCU_GPT_cmp_stdAlloc_seqcst;
-#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
-        typedef cc::LazyList< rcu_shb, key_val, traits_LazyList_cmp_stdAlloc_seqcst > LazyList_RCU_SHB_cmp_stdAlloc_seqcst;
-        typedef cc::LazyList< rcu_sht, key_val, traits_LazyList_cmp_stdAlloc_seqcst > LazyList_RCU_SHT_cmp_stdAlloc_seqcst;
-#endif
-        struct traits_LazyList_cmp_michaelAlloc :
-            public cc::lazy_list::make_traits<
-                co::compare< compare >,
-                co::allocator< memory::MichaelAllocator<int> >
-            >::type
-        {};
-        typedef cc::LazyList< cds::gc::HP,  key_val, traits_LazyList_cmp_michaelAlloc > LazyList_HP_cmp_michaelAlloc;
-        typedef cc::LazyList< cds::gc::DHP, key_val, traits_LazyList_cmp_michaelAlloc > LazyList_DHP_cmp_michaelAlloc;
-        typedef cc::LazyList< rcu_gpi, key_val, traits_LazyList_cmp_michaelAlloc > LazyList_RCU_GPI_cmp_michaelAlloc;
-        typedef cc::LazyList< rcu_gpb, key_val, traits_LazyList_cmp_michaelAlloc > LazyList_RCU_GPB_cmp_michaelAlloc;
-        typedef cc::LazyList< rcu_gpt, key_val, traits_LazyList_cmp_michaelAlloc > LazyList_RCU_GPT_cmp_michaelAlloc;
-#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
-        typedef cc::LazyList< rcu_shb, key_val, traits_LazyList_cmp_michaelAlloc > LazyList_RCU_SHB_cmp_michaelAlloc;
-        typedef cc::LazyList< rcu_sht, key_val, traits_LazyList_cmp_michaelAlloc > LazyList_RCU_SHT_cmp_michaelAlloc;
-#endif
-
-        struct traits_LazyList_less_stdAlloc:
-            public cc::lazy_list::make_traits<
-                co::less< less >
-            >::type
-        {};
-        typedef cc::LazyList< cds::gc::HP,  key_val, traits_LazyList_less_stdAlloc > LazyList_HP_less_stdAlloc;
-        typedef cc::LazyList< cds::gc::DHP, key_val, traits_LazyList_less_stdAlloc > LazyList_DHP_less_stdAlloc;
-        typedef cc::LazyList< rcu_gpi, key_val, traits_LazyList_less_stdAlloc > LazyList_RCU_GPI_less_stdAlloc;
-        typedef cc::LazyList< rcu_gpb, key_val, traits_LazyList_less_stdAlloc > LazyList_RCU_GPB_less_stdAlloc;
-        typedef cc::LazyList< rcu_gpt, key_val, traits_LazyList_less_stdAlloc > LazyList_RCU_GPT_less_stdAlloc;
-#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
-        typedef cc::LazyList< rcu_shb, key_val, traits_LazyList_less_stdAlloc > LazyList_RCU_SHB_less_stdAlloc;
-        typedef cc::LazyList< rcu_sht, key_val, traits_LazyList_less_stdAlloc > LazyList_RCU_SHT_less_stdAlloc;
-#endif
-
-        struct traits_LazyList_less_stdAlloc_seqcst :
-            public cc::lazy_list::make_traits<
-                co::less< less >
-                ,co::memory_model< co::v::sequential_consistent >
-            >::type
-        {};
-        typedef cc::LazyList< cds::gc::HP, key_val,  traits_LazyList_less_stdAlloc_seqcst > LazyList_HP_less_stdAlloc_seqcst;
-        typedef cc::LazyList< cds::gc::DHP, key_val, traits_LazyList_less_stdAlloc_seqcst > LazyList_DHP_less_stdAlloc_seqcst;
-        typedef cc::LazyList< rcu_gpi, key_val, traits_LazyList_less_stdAlloc_seqcst > LazyList_RCU_GPI_less_stdAlloc_seqcst;
-        typedef cc::LazyList< rcu_gpb, key_val, traits_LazyList_less_stdAlloc_seqcst > LazyList_RCU_GPB_less_stdAlloc_seqcst;
-        typedef cc::LazyList< rcu_gpt, key_val, traits_LazyList_less_stdAlloc_seqcst > LazyList_RCU_GPT_less_stdAlloc_seqcst;
-#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
-        typedef cc::LazyList< rcu_shb, key_val, traits_LazyList_less_stdAlloc_seqcst > LazyList_RCU_SHB_less_stdAlloc_seqcst;
-        typedef cc::LazyList< rcu_sht, key_val, traits_LazyList_less_stdAlloc_seqcst > LazyList_RCU_SHT_less_stdAlloc_seqcst;
-#endif
-
-        struct traits_LazyList_less_michaelAlloc :
-            public cc::lazy_list::make_traits<
-                co::less< less >,
-                co::allocator< memory::MichaelAllocator<int> >
-            >::type
-        {};
-        typedef cc::LazyList< cds::gc::HP,  key_val, traits_LazyList_less_michaelAlloc > LazyList_HP_less_michaelAlloc;
-        typedef cc::LazyList< cds::gc::DHP, key_val, traits_LazyList_less_michaelAlloc > LazyList_DHP_less_michaelAlloc;
-        typedef cc::LazyList< rcu_gpi, key_val, traits_LazyList_less_michaelAlloc > LazyList_RCU_GPI_less_michaelAlloc;
-        typedef cc::LazyList< rcu_gpb, key_val, traits_LazyList_less_michaelAlloc > LazyList_RCU_GPB_less_michaelAlloc;
-        typedef cc::LazyList< rcu_gpt, key_val, traits_LazyList_less_michaelAlloc > LazyList_RCU_GPT_less_michaelAlloc;
-#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
-        typedef cc::LazyList< rcu_shb, key_val, traits_LazyList_less_michaelAlloc > LazyList_RCU_SHB_less_michaelAlloc;
-        typedef cc::LazyList< rcu_sht, key_val, traits_LazyList_less_michaelAlloc > LazyList_RCU_SHT_less_michaelAlloc;
-#endif
-
-        // ***************************************************************************
-        // MichaelHashSet based on LazyList
-
-        typedef cc::MichaelHashSet< cds::gc::HP, LazyList_HP_cmp_stdAlloc, traits_MichaelSet_stdAlloc > MichaelSet_Lazy_HP_cmp_stdAlloc;
-        typedef cc::MichaelHashSet< cds::gc::DHP, LazyList_DHP_cmp_stdAlloc, traits_MichaelSet_stdAlloc > MichaelSet_Lazy_DHP_cmp_stdAlloc;
-        typedef cc::MichaelHashSet< rcu_gpi, LazyList_RCU_GPI_cmp_stdAlloc, traits_MichaelSet_stdAlloc > MichaelSet_Lazy_RCU_GPI_cmp_stdAlloc;
-        typedef cc::MichaelHashSet< rcu_gpb, LazyList_RCU_GPB_cmp_stdAlloc, traits_MichaelSet_stdAlloc > MichaelSet_Lazy_RCU_GPB_cmp_stdAlloc;
-        typedef cc::MichaelHashSet< rcu_gpt, LazyList_RCU_GPT_cmp_stdAlloc, traits_MichaelSet_stdAlloc > MichaelSet_Lazy_RCU_GPT_cmp_stdAlloc;
-#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
-        typedef cc::MichaelHashSet< rcu_shb, LazyList_RCU_SHB_cmp_stdAlloc, traits_MichaelSet_stdAlloc > MichaelSet_Lazy_RCU_SHB_cmp_stdAlloc;
-        typedef cc::MichaelHashSet< rcu_sht, LazyList_RCU_SHT_cmp_stdAlloc, traits_MichaelSet_stdAlloc > MichaelSet_Lazy_RCU_SHT_cmp_stdAlloc;
-#endif
-
-        typedef cc::MichaelHashSet< cds::gc::HP, LazyList_HP_less_stdAlloc, traits_MichaelSet_stdAlloc > MichaelSet_Lazy_HP_less_stdAlloc;
-        typedef cc::MichaelHashSet< cds::gc::DHP, LazyList_DHP_less_stdAlloc, traits_MichaelSet_stdAlloc > MichaelSet_Lazy_DHP_less_stdAlloc;
-        typedef cc::MichaelHashSet< rcu_gpi, LazyList_RCU_GPI_less_stdAlloc, traits_MichaelSet_stdAlloc > MichaelSet_Lazy_RCU_GPI_less_stdAlloc;
-        typedef cc::MichaelHashSet< rcu_gpb, LazyList_RCU_GPB_less_stdAlloc, traits_MichaelSet_stdAlloc > MichaelSet_Lazy_RCU_GPB_less_stdAlloc;
-        typedef cc::MichaelHashSet< rcu_gpt, LazyList_RCU_GPT_less_stdAlloc, traits_MichaelSet_stdAlloc > MichaelSet_Lazy_RCU_GPT_less_stdAlloc;
-#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
-        typedef cc::MichaelHashSet< rcu_shb, LazyList_RCU_SHB_less_stdAlloc, traits_MichaelSet_stdAlloc > MichaelSet_Lazy_RCU_SHB_less_stdAlloc;
-        typedef cc::MichaelHashSet< rcu_sht, LazyList_RCU_SHT_less_stdAlloc, traits_MichaelSet_stdAlloc > MichaelSet_Lazy_RCU_SHT_less_stdAlloc;
-#endif
-
-        typedef cc::MichaelHashSet< cds::gc::HP, LazyList_HP_less_stdAlloc_seqcst, traits_MichaelSet_stdAlloc > MichaelSet_Lazy_HP_less_stdAlloc_seqcst;
-        typedef cc::MichaelHashSet< cds::gc::DHP, LazyList_DHP_less_stdAlloc_seqcst, traits_MichaelSet_stdAlloc > MichaelSet_Lazy_DHP_less_stdAlloc_seqcst;
-        typedef cc::MichaelHashSet< rcu_gpi, LazyList_RCU_GPI_less_stdAlloc_seqcst, traits_MichaelSet_stdAlloc > MichaelSet_Lazy_RCU_GPI_less_stdAlloc_seqcst;
-        typedef cc::MichaelHashSet< rcu_gpb, LazyList_RCU_GPB_less_stdAlloc_seqcst, traits_MichaelSet_stdAlloc > MichaelSet_Lazy_RCU_GPB_less_stdAlloc_seqcst;
-        typedef cc::MichaelHashSet< rcu_gpt, LazyList_RCU_GPT_less_stdAlloc_seqcst, traits_MichaelSet_stdAlloc > MichaelSet_Lazy_RCU_GPT_less_stdAlloc_seqcst;
-#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
-        typedef cc::MichaelHashSet< rcu_shb, LazyList_RCU_SHB_less_stdAlloc_seqcst, traits_MichaelSet_stdAlloc > MichaelSet_Lazy_RCU_SHB_less_stdAlloc_seqcst;
-        typedef cc::MichaelHashSet< rcu_sht, LazyList_RCU_SHT_less_stdAlloc_seqcst, traits_MichaelSet_stdAlloc > MichaelSet_Lazy_RCU_SHT_less_stdAlloc_seqcst;
-#endif
-
-        typedef cc::MichaelHashSet< cds::gc::HP, LazyList_HP_cmp_michaelAlloc, traits_MichaelSet_michaelAlloc > MichaelSet_Lazy_HP_cmp_michaelAlloc;
-        typedef cc::MichaelHashSet< cds::gc::DHP, LazyList_DHP_cmp_michaelAlloc, traits_MichaelSet_michaelAlloc > MichaelSet_Lazy_DHP_cmp_michaelAlloc;
-        typedef cc::MichaelHashSet< rcu_gpi, LazyList_RCU_GPI_cmp_michaelAlloc, traits_MichaelSet_michaelAlloc > MichaelSet_Lazy_RCU_GPI_cmp_michaelAlloc;
-        typedef cc::MichaelHashSet< rcu_gpb, LazyList_RCU_GPB_cmp_michaelAlloc, traits_MichaelSet_michaelAlloc > MichaelSet_Lazy_RCU_GPB_cmp_michaelAlloc;
-        typedef cc::MichaelHashSet< rcu_gpt, LazyList_RCU_GPT_cmp_michaelAlloc, traits_MichaelSet_michaelAlloc > MichaelSet_Lazy_RCU_GPT_cmp_michaelAlloc;
-#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
-        typedef cc::MichaelHashSet< rcu_shb, LazyList_RCU_SHB_cmp_michaelAlloc, traits_MichaelSet_michaelAlloc > MichaelSet_Lazy_RCU_SHB_cmp_michaelAlloc;
-        typedef cc::MichaelHashSet< rcu_sht, LazyList_RCU_SHT_cmp_michaelAlloc, traits_MichaelSet_michaelAlloc > MichaelSet_Lazy_RCU_SHT_cmp_michaelAlloc;
-#endif
-
-        typedef cc::MichaelHashSet< cds::gc::HP, LazyList_HP_less_michaelAlloc, traits_MichaelSet_michaelAlloc > MichaelSet_Lazy_HP_less_michaelAlloc;
-        typedef cc::MichaelHashSet< cds::gc::DHP, LazyList_DHP_less_michaelAlloc, traits_MichaelSet_michaelAlloc > MichaelSet_Lazy_DHP_less_michaelAlloc;
-        typedef cc::MichaelHashSet< rcu_gpi, LazyList_RCU_GPI_less_michaelAlloc, traits_MichaelSet_michaelAlloc > MichaelSet_Lazy_RCU_GPI_less_michaelAlloc;
-        typedef cc::MichaelHashSet< rcu_gpb, LazyList_RCU_GPB_less_michaelAlloc, traits_MichaelSet_michaelAlloc > MichaelSet_Lazy_RCU_GPB_less_michaelAlloc;
-        typedef cc::MichaelHashSet< rcu_gpt, LazyList_RCU_GPT_less_michaelAlloc, traits_MichaelSet_michaelAlloc > MichaelSet_Lazy_RCU_GPT_less_michaelAlloc;
-#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
-        typedef cc::MichaelHashSet< rcu_shb, LazyList_RCU_SHB_less_michaelAlloc, traits_MichaelSet_michaelAlloc > MichaelSet_Lazy_RCU_SHB_less_michaelAlloc;
-        typedef cc::MichaelHashSet< rcu_sht, LazyList_RCU_SHT_less_michaelAlloc, traits_MichaelSet_michaelAlloc > MichaelSet_Lazy_RCU_SHT_less_michaelAlloc;
-#endif
-
-        // ***************************************************************************
-        // SplitListSet based on MichaelList
-
-        struct traits_SplitList_Michael_dyn_cmp :
-            public cc::split_list::make_traits<
-                cc::split_list::ordered_list<cc::michael_list_tag>
-                ,co::hash< hash >
-                ,cc::split_list::ordered_list_traits<
-                    typename cc::michael_list::make_traits<
-                        co::compare< compare >
-                    >::type
-                >
-            >::type
-        {};
-        typedef cc::SplitListSet< cds::gc::HP,  key_val, traits_SplitList_Michael_dyn_cmp > SplitList_Michael_HP_dyn_cmp;
-        typedef cc::SplitListSet< cds::gc::DHP, key_val, traits_SplitList_Michael_dyn_cmp > SplitList_Michael_DHP_dyn_cmp;
-        typedef cc::SplitListSet< rcu_gpi, key_val, traits_SplitList_Michael_dyn_cmp > SplitList_Michael_RCU_GPI_dyn_cmp;
-        typedef cc::SplitListSet< rcu_gpb, key_val, traits_SplitList_Michael_dyn_cmp > SplitList_Michael_RCU_GPB_dyn_cmp;
-        typedef cc::SplitListSet< rcu_gpt, key_val, traits_SplitList_Michael_dyn_cmp > SplitList_Michael_RCU_GPT_dyn_cmp;
-#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
-        typedef cc::SplitListSet< rcu_shb, key_val, traits_SplitList_Michael_dyn_cmp > SplitList_Michael_RCU_SHB_dyn_cmp;
-        typedef cc::SplitListSet< rcu_sht, key_val, traits_SplitList_Michael_dyn_cmp > SplitList_Michael_RCU_SHT_dyn_cmp;
-#endif
-
-        struct traits_SplitList_Michael_dyn_cmp_stat :
-            public cc::split_list::make_traits<
-                cc::split_list::ordered_list<cc::michael_list_tag>
-                ,co::hash< hash >
-                ,co::stat< cc::split_list::stat<> >
-                ,cc::split_list::ordered_list_traits<
-                    typename cc::michael_list::make_traits<
-                        co::compare< compare >
-                    >::type
-                >
-            >::type
-        {};
-        typedef cc::SplitListSet< cds::gc::HP, key_val, traits_SplitList_Michael_dyn_cmp_stat > SplitList_Michael_HP_dyn_cmp_stat;
-        typedef cc::SplitListSet< cds::gc::DHP, key_val, traits_SplitList_Michael_dyn_cmp_stat > SplitList_Michael_DHP_dyn_cmp_stat;
-        typedef cc::SplitListSet< rcu_gpi, key_val, traits_SplitList_Michael_dyn_cmp_stat > SplitList_Michael_RCU_GPI_dyn_cmp_stat;
-        typedef cc::SplitListSet< rcu_gpb, key_val, traits_SplitList_Michael_dyn_cmp_stat > SplitList_Michael_RCU_GPB_dyn_cmp_stat;
-        typedef cc::SplitListSet< rcu_gpt, key_val, traits_SplitList_Michael_dyn_cmp_stat > SplitList_Michael_RCU_GPT_dyn_cmp_stat;
-#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
-        typedef cc::SplitListSet< rcu_shb, key_val, traits_SplitList_Michael_dyn_cmp_stat > SplitList_Michael_RCU_SHB_dyn_cmp_stat;
-        typedef cc::SplitListSet< rcu_sht, key_val, traits_SplitList_Michael_dyn_cmp_stat > SplitList_Michael_RCU_SHT_dyn_cmp_stat;
-#endif
-
-        struct traits_SplitList_Michael_dyn_cmp_seqcst :
-            public cc::split_list::make_traits<
-                cc::split_list::ordered_list<cc::michael_list_tag>
-                ,co::hash< hash >
-                ,co::memory_model< co::v::sequential_consistent >
-                ,cc::split_list::ordered_list_traits<
-                    typename cc::michael_list::make_traits<
-                        co::compare< compare >
-                        ,co::memory_model< co::v::sequential_consistent >
-                    >::type
-                >
-            >::type
-        {};
-        typedef cc::SplitListSet< cds::gc::HP,  key_val, traits_SplitList_Michael_dyn_cmp_seqcst > SplitList_Michael_HP_dyn_cmp_seqcst;
-        typedef cc::SplitListSet< cds::gc::DHP, key_val, traits_SplitList_Michael_dyn_cmp_seqcst > SplitList_Michael_DHP_dyn_cmp_seqcst;
-        typedef cc::SplitListSet< rcu_gpi, key_val, traits_SplitList_Michael_dyn_cmp_seqcst > SplitList_Michael_RCU_GPI_dyn_cmp_seqcst;
-        typedef cc::SplitListSet< rcu_gpb, key_val, traits_SplitList_Michael_dyn_cmp_seqcst > SplitList_Michael_RCU_GPB_dyn_cmp_seqcst;
-        typedef cc::SplitListSet< rcu_gpt, key_val, traits_SplitList_Michael_dyn_cmp_seqcst > SplitList_Michael_RCU_GPT_dyn_cmp_seqcst;
-#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
-        typedef cc::SplitListSet< rcu_shb, key_val, traits_SplitList_Michael_dyn_cmp_seqcst > SplitList_Michael_RCU_SHB_dyn_cmp_seqcst;
-        typedef cc::SplitListSet< rcu_sht, key_val, traits_SplitList_Michael_dyn_cmp_seqcst > SplitList_Michael_RCU_SHT_dyn_cmp_seqcst;
-#endif
-
-        struct traits_SplitList_Michael_st_cmp :
-            public cc::split_list::make_traits<
-                cc::split_list::ordered_list<cc::michael_list_tag>
-                ,cc::split_list::dynamic_bucket_table< false >
-                ,co::hash< hash >
-                ,cc::split_list::ordered_list_traits<
-                    typename cc::michael_list::make_traits<
-                        co::compare< compare >
-                    >::type
-                >
-            >::type
-        {};
-        typedef cc::SplitListSet< cds::gc::HP,  key_val, traits_SplitList_Michael_st_cmp > SplitList_Michael_HP_st_cmp;
-        typedef cc::SplitListSet< cds::gc::DHP, key_val, traits_SplitList_Michael_st_cmp > SplitList_Michael_DHP_st_cmp;
-        typedef cc::SplitListSet< rcu_gpi, key_val, traits_SplitList_Michael_st_cmp > SplitList_Michael_RCU_GPI_st_cmp;
-        typedef cc::SplitListSet< rcu_gpb, key_val, traits_SplitList_Michael_st_cmp > SplitList_Michael_RCU_GPB_st_cmp;
-        typedef cc::SplitListSet< rcu_gpt, key_val, traits_SplitList_Michael_st_cmp > SplitList_Michael_RCU_GPT_st_cmp;
-#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
-        typedef cc::SplitListSet< rcu_shb, key_val, traits_SplitList_Michael_st_cmp > SplitList_Michael_RCU_SHB_st_cmp;
-        typedef cc::SplitListSet< rcu_sht, key_val, traits_SplitList_Michael_st_cmp > SplitList_Michael_RCU_SHT_st_cmp;
-#endif
-
-        struct traits_SplitList_Michael_st_cmp_seqcst :
-            public cc::split_list::make_traits<
-                cc::split_list::ordered_list<cc::michael_list_tag>
-                ,co::hash< hash >
-                ,cc::split_list::dynamic_bucket_table< false >
-                ,co::memory_model< co::v::sequential_consistent >
-                ,cc::split_list::ordered_list_traits<
-                    typename cc::michael_list::make_traits<
-                        co::compare< compare >
-                        ,co::memory_model< co::v::sequential_consistent >
-                    >::type
-                >
-            >::type
-        {};
-        typedef cc::SplitListSet< cds::gc::HP,  key_val, traits_SplitList_Michael_st_cmp_seqcst> SplitList_Michael_HP_st_cmp_seqcst;
-        typedef cc::SplitListSet< cds::gc::DHP, key_val, traits_SplitList_Michael_st_cmp_seqcst> SplitList_Michael_DHP_st_cmp_seqcst;
-        typedef cc::SplitListSet< rcu_gpi, key_val, traits_SplitList_Michael_st_cmp_seqcst> SplitList_Michael_RCU_GPI_st_cmp_seqcst;
-        typedef cc::SplitListSet< rcu_gpb, key_val, traits_SplitList_Michael_st_cmp_seqcst> SplitList_Michael_RCU_GPB_st_cmp_seqcst;
-        typedef cc::SplitListSet< rcu_gpt, key_val, traits_SplitList_Michael_st_cmp_seqcst> SplitList_Michael_RCU_GPT_st_cmp_seqcst;
-#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
-        typedef cc::SplitListSet< rcu_shb, key_val, traits_SplitList_Michael_st_cmp_seqcst> SplitList_Michael_RCU_SHB_st_cmp_seqcst;
-        typedef cc::SplitListSet< rcu_sht, key_val, traits_SplitList_Michael_st_cmp_seqcst> SplitList_Michael_RCU_SHT_st_cmp_seqcst;
-#endif
-
-        //HP + less
-        struct traits_SplitList_Michael_dyn_less :
-            public cc::split_list::make_traits<
-                cc::split_list::ordered_list<cc::michael_list_tag>
-                ,co::hash< hash >
-                ,cc::split_list::ordered_list_traits<
-                    typename cc::michael_list::make_traits<
-                        co::less< less >
-                    >::type
-                >
-            >::type
-        {};
-        typedef cc::SplitListSet< cds::gc::HP,  key_val, traits_SplitList_Michael_dyn_less > SplitList_Michael_HP_dyn_less;
-        typedef cc::SplitListSet< cds::gc::DHP, key_val, traits_SplitList_Michael_dyn_less > SplitList_Michael_DHP_dyn_less;
-        typedef cc::SplitListSet< rcu_gpi, key_val, traits_SplitList_Michael_dyn_less > SplitList_Michael_RCU_GPI_dyn_less;
-        typedef cc::SplitListSet< rcu_gpb, key_val, traits_SplitList_Michael_dyn_less > SplitList_Michael_RCU_GPB_dyn_less;
-        typedef cc::SplitListSet< rcu_gpt, key_val, traits_SplitList_Michael_dyn_less > SplitList_Michael_RCU_GPT_dyn_less;
-#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
-        typedef cc::SplitListSet< rcu_shb, key_val, traits_SplitList_Michael_dyn_less > SplitList_Michael_RCU_SHB_dyn_less;
-        typedef cc::SplitListSet< rcu_sht, key_val, traits_SplitList_Michael_dyn_less > SplitList_Michael_RCU_SHT_dyn_less;
-#endif
-
-        struct traits_SplitList_Michael_dyn_less_seqcst :
-            public cc::split_list::make_traits<
-                cc::split_list::ordered_list<cc::michael_list_tag>
-                ,co::hash< hash >
-                ,co::memory_model< co::v::sequential_consistent >
-                ,cc::split_list::ordered_list_traits<
-                    typename cc::michael_list::make_traits<
-                        co::less< less >
-                        ,co::memory_model< co::v::sequential_consistent >
-                    >::type
-                >
-            >::type
-        {};
-        typedef cc::SplitListSet< cds::gc::HP, key_val,  traits_SplitList_Michael_dyn_less_seqcst > SplitList_Michael_HP_dyn_less_seqcst;
-        typedef cc::SplitListSet< cds::gc::DHP, key_val, traits_SplitList_Michael_dyn_less_seqcst > SplitList_Michael_DHP_dyn_less_seqcst;
-        typedef cc::SplitListSet< rcu_gpi, key_val, traits_SplitList_Michael_dyn_less_seqcst > SplitList_Michael_RCU_GPI_dyn_less_seqcst;
-        typedef cc::SplitListSet< rcu_gpb, key_val, traits_SplitList_Michael_dyn_less_seqcst > SplitList_Michael_RCU_GPB_dyn_less_seqcst;
-        typedef cc::SplitListSet< rcu_gpt, key_val, traits_SplitList_Michael_dyn_less_seqcst > SplitList_Michael_RCU_GPT_dyn_less_seqcst;
-#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
-        typedef cc::SplitListSet< rcu_shb, key_val, traits_SplitList_Michael_dyn_less_seqcst > SplitList_Michael_RCU_SHB_dyn_less_seqcst;
-        typedef cc::SplitListSet< rcu_sht, key_val, traits_SplitList_Michael_dyn_less_seqcst > SplitList_Michael_RCU_SHT_dyn_less_seqcst;
-#endif
-
-        struct traits_SplitList_Michael_st_less :
-            public cc::split_list::make_traits<
-                cc::split_list::ordered_list<cc::michael_list_tag>
-                ,cc::split_list::dynamic_bucket_table< false >
-                ,co::hash< hash >
-                ,cc::split_list::ordered_list_traits<
-                    typename cc::michael_list::make_traits<
-                        co::less< less >
-                    >::type
-                >
-            >::type
-        {};
-        typedef cc::SplitListSet< cds::gc::HP,  key_val, traits_SplitList_Michael_st_less > SplitList_Michael_HP_st_less;
-        typedef cc::SplitListSet< cds::gc::DHP, key_val, traits_SplitList_Michael_st_less > SplitList_Michael_DHP_st_less;
-        typedef cc::SplitListSet< rcu_gpi, key_val, traits_SplitList_Michael_st_less > SplitList_Michael_RCU_GPI_st_less;
-        typedef cc::SplitListSet< rcu_gpb, key_val, traits_SplitList_Michael_st_less > SplitList_Michael_RCU_GPB_st_less;
-        typedef cc::SplitListSet< rcu_gpt, key_val, traits_SplitList_Michael_st_less > SplitList_Michael_RCU_GPT_st_less;
-#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
-        typedef cc::SplitListSet< rcu_shb, key_val, traits_SplitList_Michael_st_less > SplitList_Michael_RCU_SHB_st_less;
-        typedef cc::SplitListSet< rcu_sht, key_val, traits_SplitList_Michael_st_less > SplitList_Michael_RCU_SHT_st_less;
-#endif
-
-        struct traits_SplitList_Michael_st_less_stat :
-            public cc::split_list::make_traits<
-                cc::split_list::ordered_list<cc::michael_list_tag>
-                ,cc::split_list::dynamic_bucket_table< false >
-                ,co::hash< hash >
-                ,co::stat< cc::split_list::stat<>>
-                ,cc::split_list::ordered_list_traits<
-                    typename cc::michael_list::make_traits<
-                        co::less< less >
-                    >::type
-                >
-            >::type
-        {};
-        typedef cc::SplitListSet< cds::gc::HP,  key_val, traits_SplitList_Michael_st_less_stat > SplitList_Michael_HP_st_less_stat;
-        typedef cc::SplitListSet< cds::gc::DHP, key_val, traits_SplitList_Michael_st_less_stat > SplitList_Michael_DHP_st_less_stat;
-        typedef cc::SplitListSet< rcu_gpi, key_val, traits_SplitList_Michael_st_less_stat > SplitList_Michael_RCU_GPI_st_less_stat;
-        typedef cc::SplitListSet< rcu_gpb, key_val, traits_SplitList_Michael_st_less_stat > SplitList_Michael_RCU_GPB_st_less_stat;
-        typedef cc::SplitListSet< rcu_gpt, key_val, traits_SplitList_Michael_st_less_stat > SplitList_Michael_RCU_GPT_st_less_stat;
-#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
-        typedef cc::SplitListSet< rcu_shb, key_val, traits_SplitList_Michael_st_less_stat > SplitList_Michael_RCU_SHB_st_less_stat;
-        typedef cc::SplitListSet< rcu_sht, key_val, traits_SplitList_Michael_st_less_stat > SplitList_Michael_RCU_SHT_st_less_stat;
-#endif
-
-        struct traits_SplitList_Michael_st_less_seqcst :
-            public cc::split_list::make_traits<
-                cc::split_list::ordered_list<cc::michael_list_tag>
-                ,co::hash< hash >
-                ,cc::split_list::dynamic_bucket_table< false >
-                ,co::memory_model< co::v::sequential_consistent >
-                ,cc::split_list::ordered_list_traits<
-                    typename cc::michael_list::make_traits<
-                        co::less< less >
-                        ,co::memory_model< co::v::sequential_consistent >
-                    >::type
-                >
-            >::type
-        {};
-        typedef cc::SplitListSet< cds::gc::HP,  key_val, traits_SplitList_Michael_st_less_seqcst > SplitList_Michael_HP_st_less_seqcst;
-        typedef cc::SplitListSet< cds::gc::DHP, key_val, traits_SplitList_Michael_st_less_seqcst > SplitList_Michael_DHP_st_less_seqcst;
-        typedef cc::SplitListSet< rcu_gpi, key_val, traits_SplitList_Michael_st_less_seqcst > SplitList_Michael_RCU_GPI_st_less_seqcst;
-        typedef cc::SplitListSet< rcu_gpb, key_val, traits_SplitList_Michael_st_less_seqcst > SplitList_Michael_RCU_GPB_st_less_seqcst;
-        typedef cc::SplitListSet< rcu_gpt, key_val, traits_SplitList_Michael_st_less_seqcst > SplitList_Michael_RCU_GPT_st_less_seqcst;
-#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
-        typedef cc::SplitListSet< rcu_shb, key_val, traits_SplitList_Michael_st_less_seqcst > SplitList_Michael_RCU_SHB_st_less_seqcst;
-        typedef cc::SplitListSet< rcu_sht, key_val, traits_SplitList_Michael_st_less_seqcst > SplitList_Michael_RCU_SHT_st_less_seqcst;
-#endif
-
-        // ***************************************************************************
-        // SplitListSet based on LazyList
-
-        struct traits_SplitList_Lazy_dyn_cmp :
-            public cc::split_list::make_traits<
-                cc::split_list::ordered_list<cc::lazy_list_tag>
-                ,co::hash< hash >
-                ,cc::split_list::ordered_list_traits<
-                    typename cc::lazy_list::make_traits<
-                        co::compare< compare >
-                    >::type
-                >
-            >::type
-        {};
-        typedef cc::SplitListSet< cds::gc::HP, key_val, traits_SplitList_Lazy_dyn_cmp > SplitList_Lazy_HP_dyn_cmp;
-        typedef cc::SplitListSet< cds::gc::DHP, key_val, traits_SplitList_Lazy_dyn_cmp > SplitList_Lazy_DHP_dyn_cmp;
-        typedef cc::SplitListSet< rcu_gpi, key_val, traits_SplitList_Lazy_dyn_cmp > SplitList_Lazy_RCU_GPI_dyn_cmp;
-        typedef cc::SplitListSet< rcu_gpb, key_val, traits_SplitList_Lazy_dyn_cmp > SplitList_Lazy_RCU_GPB_dyn_cmp;
-        typedef cc::SplitListSet< rcu_gpt, key_val, traits_SplitList_Lazy_dyn_cmp > SplitList_Lazy_RCU_GPT_dyn_cmp;
-#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
-        typedef cc::SplitListSet< rcu_shb, key_val, traits_SplitList_Lazy_dyn_cmp > SplitList_Lazy_RCU_SHB_dyn_cmp;
-        typedef cc::SplitListSet< rcu_sht, key_val, traits_SplitList_Lazy_dyn_cmp > SplitList_Lazy_RCU_SHT_dyn_cmp;
-#endif
-
-        struct traits_SplitList_Lazy_dyn_cmp_stat : public traits_SplitList_Lazy_dyn_cmp
-        {
-            typedef cc::split_list::stat<> stat;
-        };
-        typedef cc::SplitListSet< cds::gc::HP, key_val, traits_SplitList_Lazy_dyn_cmp_stat > SplitList_Lazy_HP_dyn_cmp_stat;
-        typedef cc::SplitListSet< cds::gc::DHP, key_val, traits_SplitList_Lazy_dyn_cmp_stat > SplitList_Lazy_DHP_dyn_cmp_stat;
-        typedef cc::SplitListSet< rcu_gpi, key_val, traits_SplitList_Lazy_dyn_cmp_stat > SplitList_Lazy_RCU_GPI_dyn_cmp_stat;
-        typedef cc::SplitListSet< rcu_gpb, key_val, traits_SplitList_Lazy_dyn_cmp_stat > SplitList_Lazy_RCU_GPB_dyn_cmp_stat;
-        typedef cc::SplitListSet< rcu_gpt, key_val, traits_SplitList_Lazy_dyn_cmp_stat > SplitList_Lazy_RCU_GPT_dyn_cmp_stat;
-#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
-        typedef cc::SplitListSet< rcu_shb, key_val, traits_SplitList_Lazy_dyn_cmp > SplitList_Lazy_RCU_SHB_dyn_cmp_stat;
-        typedef cc::SplitListSet< rcu_sht, key_val, traits_SplitList_Lazy_dyn_cmp > SplitList_Lazy_RCU_SHT_dyn_cmp_stat;
-#endif
-
-        struct traits_SplitList_Lazy_dyn_cmp_seqcst :
-            public cc::split_list::make_traits<
-                cc::split_list::ordered_list<cc::lazy_list_tag>
-                ,co::hash< hash >
-                ,co::memory_model< co::v::sequential_consistent >
-                ,cc::split_list::ordered_list_traits<
-                    typename cc::lazy_list::make_traits<
-                        co::compare< compare >
-                        ,co::memory_model< co::v::sequential_consistent >
-                    >::type
-                >
-            >::type
-        {};
-        typedef cc::SplitListSet< cds::gc::HP, key_val, traits_SplitList_Lazy_dyn_cmp_seqcst > SplitList_Lazy_HP_dyn_cmp_seqcst;
-        typedef cc::SplitListSet< cds::gc::DHP, key_val, traits_SplitList_Lazy_dyn_cmp_seqcst > SplitList_Lazy_DHP_dyn_cmp_seqcst;
-        typedef cc::SplitListSet< rcu_gpi, key_val, traits_SplitList_Lazy_dyn_cmp_seqcst > SplitList_Lazy_RCU_GPI_dyn_cmp_seqcst;
-        typedef cc::SplitListSet< rcu_gpb, key_val, traits_SplitList_Lazy_dyn_cmp_seqcst > SplitList_Lazy_RCU_GPB_dyn_cmp_seqcst;
-        typedef cc::SplitListSet< rcu_gpt, key_val, traits_SplitList_Lazy_dyn_cmp_seqcst > SplitList_Lazy_RCU_GPT_dyn_cmp_seqcst;
-#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
-        typedef cc::SplitListSet< rcu_shb, key_val, traits_SplitList_Lazy_dyn_cmp_seqcst > SplitList_Lazy_RCU_SHB_dyn_cmp_seqcst;
-        typedef cc::SplitListSet< rcu_sht, key_val, traits_SplitList_Lazy_dyn_cmp_seqcst > SplitList_Lazy_RCU_SHT_dyn_cmp_seqcst;
-#endif
-
-        struct traits_SplitList_Lazy_st_cmp :
-            public cc::split_list::make_traits<
-                cc::split_list::ordered_list<cc::lazy_list_tag>
-                ,cc::split_list::dynamic_bucket_table< false >
-                ,co::hash< hash >
-                ,cc::split_list::ordered_list_traits<
-                    typename cc::lazy_list::make_traits<
-                        co::compare< compare >
-                    >::type
-                >
-            >::type
-        {};
-        typedef cc::SplitListSet< cds::gc::HP, key_val, traits_SplitList_Lazy_st_cmp > SplitList_Lazy_HP_st_cmp;
-        typedef cc::SplitListSet< cds::gc::DHP, key_val, traits_SplitList_Lazy_st_cmp > SplitList_Lazy_DHP_st_cmp;
-        typedef cc::SplitListSet< rcu_gpi, key_val, traits_SplitList_Lazy_st_cmp > SplitList_Lazy_RCU_GPI_st_cmp;
-        typedef cc::SplitListSet< rcu_gpb, key_val, traits_SplitList_Lazy_st_cmp > SplitList_Lazy_RCU_GPB_st_cmp;
-        typedef cc::SplitListSet< rcu_gpt, key_val, traits_SplitList_Lazy_st_cmp > SplitList_Lazy_RCU_GPT_st_cmp;
-#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
-        typedef cc::SplitListSet< rcu_shb, key_val, traits_SplitList_Lazy_st_cmp > SplitList_Lazy_RCU_SHB_st_cmp;
-        typedef cc::SplitListSet< rcu_sht, key_val, traits_SplitList_Lazy_st_cmp > SplitList_Lazy_RCU_SHT_st_cmp;
-#endif
-
-        struct traits_SplitList_Lazy_st_cmp_seqcst :
-            public cc::split_list::make_traits<
-                cc::split_list::ordered_list<cc::lazy_list_tag>
-                ,co::hash< hash >
-                ,cc::split_list::dynamic_bucket_table< false >
-                ,co::memory_model< co::v::sequential_consistent >
-                ,cc::split_list::ordered_list_traits<
-                    typename cc::lazy_list::make_traits<
-                        co::compare< compare >
-                        ,co::memory_model< co::v::sequential_consistent >
-                    >::type
-                >
-            >::type
-        {};
-        typedef cc::SplitListSet< cds::gc::HP, key_val, traits_SplitList_Lazy_st_cmp_seqcst > SplitList_Lazy_HP_st_cmp_seqcst;
-        typedef cc::SplitListSet< cds::gc::DHP, key_val, traits_SplitList_Lazy_st_cmp_seqcst > SplitList_Lazy_DHP_st_cmp_seqcst;
-        typedef cc::SplitListSet< rcu_gpi, key_val, traits_SplitList_Lazy_st_cmp_seqcst > SplitList_Lazy_RCU_GPI_st_cmp_seqcst;
-        typedef cc::SplitListSet< rcu_gpb, key_val, traits_SplitList_Lazy_st_cmp_seqcst > SplitList_Lazy_RCU_GPB_st_cmp_seqcst;
-        typedef cc::SplitListSet< rcu_gpt, key_val, traits_SplitList_Lazy_st_cmp_seqcst > SplitList_Lazy_RCU_GPT_st_cmp_seqcst;
-#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
-        typedef cc::SplitListSet< rcu_shb, key_val, traits_SplitList_Lazy_st_cmp_seqcst > SplitList_Lazy_RCU_SHB_st_cmp_seqcst;
-        typedef cc::SplitListSet< rcu_sht, key_val, traits_SplitList_Lazy_st_cmp_seqcst > SplitList_Lazy_RCU_SHT_st_cmp_seqcst;
-#endif
-
-        struct traits_SplitList_Lazy_dyn_less :
-            public cc::split_list::make_traits<
-                cc::split_list::ordered_list<cc::lazy_list_tag>
-                ,co::hash< hash >
-                ,cc::split_list::ordered_list_traits<
-                    typename cc::lazy_list::make_traits<
-                        co::less< less >
-                    >::type
-                >
-            >::type
-        {};
-        typedef cc::SplitListSet< cds::gc::HP, key_val, traits_SplitList_Lazy_dyn_less > SplitList_Lazy_HP_dyn_less;
-        typedef cc::SplitListSet< cds::gc::DHP, key_val, traits_SplitList_Lazy_dyn_less > SplitList_Lazy_DHP_dyn_less;
-        typedef cc::SplitListSet< rcu_gpi, key_val, traits_SplitList_Lazy_dyn_less > SplitList_Lazy_RCU_GPI_dyn_less;
-        typedef cc::SplitListSet< rcu_gpb, key_val, traits_SplitList_Lazy_dyn_less > SplitList_Lazy_RCU_GPB_dyn_less;
-        typedef cc::SplitListSet< rcu_gpt, key_val, traits_SplitList_Lazy_dyn_less > SplitList_Lazy_RCU_GPT_dyn_less;
-#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
-        typedef cc::SplitListSet< rcu_shb, key_val, traits_SplitList_Lazy_dyn_less > SplitList_Lazy_RCU_SHB_dyn_less;
-        typedef cc::SplitListSet< rcu_sht, key_val, traits_SplitList_Lazy_dyn_less > SplitList_Lazy_RCU_SHT_dyn_less;
-#endif
-
-        struct traits_SplitList_Lazy_dyn_less_seqcst :
-            public cc::split_list::make_traits<
-                cc::split_list::ordered_list<cc::lazy_list_tag>
-                ,co::hash< hash >
-                ,co::memory_model< co::v::sequential_consistent >
-                ,cc::split_list::ordered_list_traits<
-                    typename cc::lazy_list::make_traits<
-                        co::less< less >
-                        ,co::memory_model< co::v::sequential_consistent >
-                    >::type
-                >
-            >::type
-        {};
-        typedef cc::SplitListSet< cds::gc::HP, key_val, traits_SplitList_Lazy_dyn_less_seqcst > SplitList_Lazy_HP_dyn_less_seqcst;
-        typedef cc::SplitListSet< cds::gc::DHP, key_val, traits_SplitList_Lazy_dyn_less_seqcst > SplitList_Lazy_DHP_dyn_less_seqcst;
-        typedef cc::SplitListSet< rcu_gpi, key_val, traits_SplitList_Lazy_dyn_less_seqcst > SplitList_Lazy_RCU_GPI_dyn_less_seqcst;
-        typedef cc::SplitListSet< rcu_gpb, key_val, traits_SplitList_Lazy_dyn_less_seqcst > SplitList_Lazy_RCU_GPB_dyn_less_seqcst;
-        typedef cc::SplitListSet< rcu_gpt, key_val, traits_SplitList_Lazy_dyn_less_seqcst > SplitList_Lazy_RCU_GPT_dyn_less_seqcst;
-#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
-        typedef cc::SplitListSet< rcu_shb, key_val, traits_SplitList_Lazy_dyn_less_seqcst > SplitList_Lazy_RCU_SHB_dyn_less_seqcst;
-        typedef cc::SplitListSet< rcu_sht, key_val, traits_SplitList_Lazy_dyn_less_seqcst > SplitList_Lazy_RCU_SHT_dyn_less_seqcst;
-#endif
-
-        struct traits_SplitList_Lazy_st_less :
-            public cc::split_list::make_traits<
-                cc::split_list::ordered_list<cc::lazy_list_tag>
-                ,cc::split_list::dynamic_bucket_table< false >
-                ,co::hash< hash >
-                ,cc::split_list::ordered_list_traits<
-                    typename cc::lazy_list::make_traits<
-                        co::less< less >
-                    >::type
-                >
-            >::type
-        {};
-        typedef cc::SplitListSet< cds::gc::HP, key_val, traits_SplitList_Lazy_st_less > SplitList_Lazy_HP_st_less;
-        typedef cc::SplitListSet< cds::gc::DHP, key_val, traits_SplitList_Lazy_st_less > SplitList_Lazy_DHP_st_less;
-        typedef cc::SplitListSet< rcu_gpi, key_val, traits_SplitList_Lazy_st_less > SplitList_Lazy_RCU_GPI_st_less;
-        typedef cc::SplitListSet< rcu_gpb, key_val, traits_SplitList_Lazy_st_less > SplitList_Lazy_RCU_GPB_st_less;
-        typedef cc::SplitListSet< rcu_gpt, key_val, traits_SplitList_Lazy_st_less > SplitList_Lazy_RCU_GPT_st_less;
-#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
-        typedef cc::SplitListSet< rcu_shb, key_val, traits_SplitList_Lazy_st_less > SplitList_Lazy_RCU_SHB_st_less;
-        typedef cc::SplitListSet< rcu_sht, key_val, traits_SplitList_Lazy_st_less > SplitList_Lazy_RCU_SHT_st_less;
-#endif
-
-        struct traits_SplitList_Lazy_st_less_seqcst :
-            public cc::split_list::make_traits<
-                cc::split_list::ordered_list<cc::lazy_list_tag>
-                ,co::hash< hash >
-                ,cc::split_list::dynamic_bucket_table< false >
-                ,co::memory_model< co::v::sequential_consistent >
-                ,cc::split_list::ordered_list_traits<
-                    typename cc::lazy_list::make_traits<
-                        co::less< less >
-                        ,co::memory_model< co::v::sequential_consistent >
-                    >::type
-                >
-            >::type
-        {};
-        typedef cc::SplitListSet< cds::gc::HP, key_val, traits_SplitList_Lazy_st_less_seqcst > SplitList_Lazy_HP_st_less_seqcst;
-        typedef cc::SplitListSet< cds::gc::DHP, key_val, traits_SplitList_Lazy_st_less_seqcst > SplitList_Lazy_DHP_st_less_seqcst;
-        typedef cc::SplitListSet< rcu_gpi, key_val, traits_SplitList_Lazy_st_less_seqcst > SplitList_Lazy_RCU_GPI_st_less_seqcst;
-        typedef cc::SplitListSet< rcu_gpb, key_val, traits_SplitList_Lazy_st_less_seqcst > SplitList_Lazy_RCU_GPB_st_less_seqcst;
-        typedef cc::SplitListSet< rcu_gpt, key_val, traits_SplitList_Lazy_st_less_seqcst > SplitList_Lazy_RCU_GPT_st_less_seqcst;
-#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
-        typedef cc::SplitListSet< rcu_shb, key_val, traits_SplitList_Lazy_st_less_seqcst > SplitList_Lazy_RCU_SHB_st_less_seqcst;
-        typedef cc::SplitListSet< rcu_sht, key_val, traits_SplitList_Lazy_st_less_seqcst > SplitList_Lazy_RCU_SHT_st_less_seqcst;
-#endif
-
-        struct traits_SplitList_Lazy_st_less_stat : public traits_SplitList_Lazy_st_less
-        {
-            typedef cc::split_list::stat<> stat;
-        };
-        typedef cc::SplitListSet< cds::gc::HP, key_val, traits_SplitList_Lazy_st_less_stat > SplitList_Lazy_HP_st_less_stat;
-        typedef cc::SplitListSet< cds::gc::DHP, key_val, traits_SplitList_Lazy_st_less_stat > SplitList_Lazy_DHP_st_less_stat;
-        typedef cc::SplitListSet< rcu_gpi, key_val, traits_SplitList_Lazy_st_less_stat > SplitList_Lazy_RCU_GPI_st_less_stat;
-        typedef cc::SplitListSet< rcu_gpb, key_val, traits_SplitList_Lazy_st_less_stat > SplitList_Lazy_RCU_GPB_st_less_stat;
-        typedef cc::SplitListSet< rcu_gpt, key_val, traits_SplitList_Lazy_st_less_stat > SplitList_Lazy_RCU_GPT_st_less_stat;
-#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
-        typedef cc::SplitListSet< rcu_shb, key_val, traits_SplitList_Lazy_st_less_stat > SplitList_Lazy_RCU_SHB_st_less_stat;
-        typedef cc::SplitListSet< rcu_sht, key_val, traits_SplitList_Lazy_st_less_stat > SplitList_Lazy_RCU_SHT_st_less_stat;
-#endif
-
-
-        // ***************************************************************************
-        // StripedSet
-
-        // for sequential containers
-        template <class BucketEntry, typename... Options>
-        class StripedHashSet_seq:
-            public cc::StripedSet< BucketEntry,
-                co::mutex_policy< cc::striped_set::striping<> >
-                ,co::resizing_policy<cc::striped_set::load_factor_resizing<0> >
-                , Options...
-            >
-        {
-            typedef cc::StripedSet< BucketEntry,
-                co::mutex_policy< cc::striped_set::striping<> >
-                ,co::resizing_policy<cc::striped_set::load_factor_resizing<0> >
-                , Options...
-            > base_class;
-            typedef typename base_class::resizing_policy resizing_policy_t;
-
-            resizing_policy_t   m_placeHolder;
-        public:
-            StripedHashSet_seq( size_t nCapacity, size_t nLoadFactor )
-                : base_class( nCapacity / nLoadFactor / 16, *(new(&m_placeHolder) resizing_policy_t( nLoadFactor )) )
-            {}
-
-            template <typename Q, typename Less>
-            bool erase_with( Q const& v, Less /*pred*/ )
-            {
-                return base_class::erase( v );
-            }
-        };
-
-        // for non-sequential ordered containers
-        template <class BucketEntry, typename... Options>
-        class StripedHashSet_ord:
-            public cc::StripedSet< BucketEntry,
-                co::resizing_policy<cc::striped_set::load_factor_resizing<0> >
-                ,co::mutex_policy< cc::striped_set::striping<> >
-                , Options...
-            >
-        {
-            typedef cc::StripedSet< BucketEntry,
-               co::resizing_policy<cc::striped_set::load_factor_resizing<0> >
-                ,co::mutex_policy< cc::striped_set::striping<> >
-                , Options...
-            > base_class;
-            typedef typename base_class::resizing_policy resizing_policy_t;
-
-            resizing_policy_t   m_placeHolder;
-        public:
-            StripedHashSet_ord( size_t /*nCapacity*/, size_t nLoadFactor )
-                : base_class( 0, *(new(&m_placeHolder) resizing_policy_t( nLoadFactor * 1024 )) )
-            {}
-
-            template <typename Q, typename Less>
-            bool erase_with( Q const& v, Less /*pred*/ )
-            {
-                return base_class::erase( v );
-            }
-        };
-
-        typedef StripedHashSet_seq<
-            std::list< key_val >
-            , co::hash< hash2 >
-            , co::less< less >
-        > StripedSet_list;
-
-        typedef StripedHashSet_seq<
-            std::vector< key_val >
-            , co::hash< hash2 >
-            , co::less< less >
-        > StripedSet_vector;
-
-#if BOOST_VERSION >= 104800
-        typedef StripedHashSet_seq<
-            boost::container::slist< key_val >
-            , co::hash< hash2 >
-            , co::less< less >
-        > StripedSet_boost_slist;
-
-        typedef StripedHashSet_seq<
-            boost::container::list< key_val >
-            , co::hash< hash2 >
-            , co::less< less >
-        > StripedSet_boost_list;
-
-        typedef StripedHashSet_seq<
-            boost::container::vector< key_val >
-            , co::hash< hash2 >
-            , co::less< less >
-        > StripedSet_boost_vector;
-
-        typedef StripedHashSet_seq<
-            boost::container::stable_vector< key_val >
-            , co::hash< hash2 >
-            , co::less< less >
-        > StripedSet_boost_stable_vector;
-#endif
-
-        typedef StripedHashSet_ord<
-            std::set< key_val, less >
-            , co::hash< hash2 >
-        > StripedSet_set;
-
-        typedef StripedHashSet_ord<
-            std::unordered_set< key_val, hash, equal_to >
-            , co::hash< hash2 >
-        > StripedSet_hashset;
-
-#if BOOST_VERSION >= 104800
-        typedef StripedHashSet_ord<
-            boost::container::set< key_val, less >
-            , co::hash< hash2 >
-        > StripedSet_boost_set;
-
-        typedef StripedHashSet_ord<
-            boost::container::flat_set< key_val, less >
-            , co::hash< hash2 >
-        > StripedSet_boost_flat_set;
-#endif
-
-        typedef StripedHashSet_ord<
-            boost::unordered_set< key_val, hash, equal_to >
-            , co::hash< hash2 >
-        > StripedSet_boost_unordered_set;
-
-
-
-        // ***************************************************************************
-        // RefinableSet
-
-        // for sequential containers
-        template <class BucketEntry, typename... Options>
-        class RefinableHashSet_seq:
-            public cc::StripedSet< BucketEntry,
-            co::mutex_policy< cc::striped_set::refinable<> >
-            ,co::resizing_policy<cc::striped_set::load_factor_resizing<0> >
-            , Options...
-            >
-        {
-            typedef cc::StripedSet< BucketEntry,
-                co::mutex_policy< cc::striped_set::refinable<> >
-                ,co::resizing_policy<cc::striped_set::load_factor_resizing<0> >
-                , Options...
-            > base_class;
-            typedef typename base_class::resizing_policy resizing_policy_t;
-
-            resizing_policy_t   m_placeHolder;
-        public:
-            RefinableHashSet_seq( size_t nCapacity, size_t nLoadFactor )
-                : base_class( nCapacity / nLoadFactor / 16, *(new(&m_placeHolder) resizing_policy_t( nLoadFactor )) )
-            {}
-
-            template <typename Q, typename Less>
-            bool erase_with( Q const& v, Less /*pred*/ )
-            {
-                return base_class::erase( v );
-            }
-        };
-
-        // for non-sequential ordered containers
-        template <class BucketEntry, typename... Options>
-        class RefinableHashSet_ord:
-            public cc::StripedSet< BucketEntry,
-                co::resizing_policy<cc::striped_set::load_factor_resizing<0> >
-                ,co::mutex_policy< cc::striped_set::refinable<> >
-                , Options...
-            >
-        {
-            typedef cc::StripedSet< BucketEntry,
-                co::resizing_policy<cc::striped_set::load_factor_resizing<0> >
-                ,co::mutex_policy< cc::striped_set::refinable<> >
-                , Options...
-            > base_class;
-            typedef typename base_class::resizing_policy resizing_policy_t;
-
-            resizing_policy_t   m_placeHolder;
-        public:
-            RefinableHashSet_ord( size_t /*nCapacity*/, size_t nLoadFactor )
-                : base_class( 0, *(new(&m_placeHolder) resizing_policy_t( nLoadFactor * 1024 )) )
-            {}
-
-            template <typename Q, typename Less>
-            bool erase_with( Q const& v, Less /*pred*/ )
-            {
-                return base_class::erase( v );
-            }
-        };
-
-        typedef RefinableHashSet_seq<
-            std::list< key_val >
-            , co::hash< hash2 >
-            , co::less< less >
-        > RefinableSet_list;
-
-        typedef RefinableHashSet_seq<
-            std::vector< key_val >
-            , co::hash< hash2 >
-            , co::less< less >
-        > RefinableSet_vector;
-
-#if BOOST_VERSION >= 104800
-        typedef RefinableHashSet_seq<
-            boost::container::slist< key_val >
-            , co::hash< hash2 >
-            , co::less< less >
-        > RefinableSet_boost_slist;
-
-        typedef RefinableHashSet_seq<
-            boost::container::list< key_val >
-            , co::hash< hash2 >
-            , co::less< less >
-        > RefinableSet_boost_list;
-
-        typedef RefinableHashSet_seq<
-            boost::container::vector< key_val >
-            , co::hash< hash2 >
-            , co::less< less >
-        > RefinableSet_boost_vector;
-
-        typedef RefinableHashSet_seq<
-            boost::container::stable_vector< key_val >
-            , co::hash< hash2 >
-            , co::less< less >
-        > RefinableSet_boost_stable_vector;
-#endif
-
-        typedef RefinableHashSet_ord<
-            std::set< key_val, less >
-            , co::hash< hash2 >
-        > RefinableSet_set;
-
-        typedef RefinableHashSet_ord<
-            std::unordered_set< key_val, hash, equal_to >
-            , co::hash< hash2 >
-        > RefinableSet_hashset;
-
-#if BOOST_VERSION >= 104800
-        typedef RefinableHashSet_ord<
-            boost::container::set< key_val, less >
-            , co::hash< hash2 >
-        > RefinableSet_boost_set;
-
-        typedef RefinableHashSet_ord<
-            boost::container::flat_set< key_val, less >
-            , co::hash< hash2 >
-        > RefinableSet_boost_flat_set;
-#endif
-
-        typedef RefinableHashSet_ord<
-            boost::unordered_set< key_val, hash, equal_to >
-            , co::hash< hash2 >
-        > RefinableSet_boost_unordered_set;
-
-        // ***************************************************************************
-        // CuckooSet
-
-        template <typename Traits>
-        struct traits_CuckooStripedSet : public Traits
-        {
-            typedef cc::cuckoo::striping<> mutex_policy;
-        };
-        template <typename Traits>
-        struct traits_CuckooRefinableSet : public Traits
-        {
-            typedef cc::cuckoo::refinable<> mutex_policy;
-        };
-
-        struct traits_CuckooSet_list_unord :
-            public cc::cuckoo::make_traits <
-                cc::cuckoo::probeset_type< cc::cuckoo::list >
-                , co::equal_to< equal_to >
-                , co::hash< std::tuple< hash, hash2 > >
-            > ::type
-        {};
-        typedef CuckooSet< key_val, traits_CuckooStripedSet<traits_CuckooSet_list_unord>> CuckooStripedSet_list_unord;
-        typedef CuckooSet< key_val, traits_CuckooRefinableSet<traits_CuckooSet_list_unord>> CuckooRefinableSet_list_unord;
-
-        struct traits_CuckooSet_list_unord_stat : public traits_CuckooSet_list_unord
-        {
-            typedef cc::cuckoo::stat stat;
-        };
-        typedef CuckooSet< key_val, traits_CuckooStripedSet<traits_CuckooSet_list_unord_stat>> CuckooStripedSet_list_unord_stat;
-        typedef CuckooSet< key_val, traits_CuckooRefinableSet<traits_CuckooSet_list_unord_stat>> CuckooRefinableSet_list_unord_stat;
-
-        struct traits_CuckooSet_list_unord_storehash : public traits_CuckooSet_list_unord
-        {
-            static CDS_CONSTEXPR const bool store_hash = true;
-        };
-        typedef CuckooSet< key_val, traits_CuckooStripedSet<traits_CuckooSet_list_unord_storehash>> CuckooStripedSet_list_unord_storehash;
-        typedef CuckooSet< key_val, traits_CuckooRefinableSet<traits_CuckooSet_list_unord_storehash>> CuckooRefinableSet_list_unord_storehash;
-
-        struct traits_CuckooSet_list_ord :
-            public cc::cuckoo::make_traits <
-                cc::cuckoo::probeset_type< cc::cuckoo::list >
-                , co::compare< compare >
-                , co::hash< std::tuple< hash, hash2 > >
-            > ::type
-        {};
-        typedef CuckooSet< key_val, traits_CuckooStripedSet<traits_CuckooSet_list_ord>> CuckooStripedSet_list_ord;
-        typedef CuckooSet< key_val, traits_CuckooRefinableSet<traits_CuckooSet_list_ord>> CuckooRefinableSet_list_ord;
-
-        struct traits_CuckooSet_list_ord_stat : public traits_CuckooSet_list_ord
-        {
-            typedef cc::cuckoo::stat stat;
-        };
-        typedef CuckooSet< key_val, traits_CuckooStripedSet<traits_CuckooSet_list_ord_stat>> CuckooStripedSet_list_ord_stat;
-        typedef CuckooSet< key_val, traits_CuckooRefinableSet<traits_CuckooSet_list_ord_stat>> CuckooRefinableSet_list_ord_stat;
-
-        struct traits_CuckooSet_list_ord_storehash : public traits_CuckooSet_list_ord
-        {
-            static CDS_CONSTEXPR const bool store_hash = true;
-        };
-        typedef CuckooSet< key_val, traits_CuckooStripedSet<traits_CuckooSet_list_ord_storehash>> CuckooStripedSet_list_ord_storehash;
-        typedef CuckooSet< key_val, traits_CuckooRefinableSet<traits_CuckooSet_list_ord_storehash>> CuckooRefinableSet_list_ord_storehash;
-
-
-        struct traits_CuckooSet_vector_unord :
-            public cc::cuckoo::make_traits <
-                cc::cuckoo::probeset_type< cc::cuckoo::vector<4> >
-                , co::equal_to< equal_to >
-                , co::hash< std::tuple< hash, hash2 > >
-            > ::type
-        {};
-        typedef CuckooSet< key_val, traits_CuckooStripedSet<traits_CuckooSet_vector_unord>> CuckooStripedSet_vector_unord;
-        typedef CuckooSet< key_val, traits_CuckooRefinableSet<traits_CuckooSet_vector_unord>> CuckooRefinableSet_vector_unord;
-
-        struct traits_CuckooSet_vector_unord_stat : public traits_CuckooSet_vector_unord
-        {
-            typedef cc::cuckoo::stat stat;
-        };
-        typedef CuckooSet< key_val, traits_CuckooStripedSet<traits_CuckooSet_vector_unord_stat>> CuckooStripedSet_vector_unord_stat;
-        typedef CuckooSet< key_val, traits_CuckooRefinableSet<traits_CuckooSet_vector_unord_stat>> CuckooRefinableSet_vector_unord_stat;
-
-        struct traits_CuckooSet_vector_unord_storehash : public traits_CuckooSet_vector_unord
-        {
-            static CDS_CONSTEXPR const bool store_hash = true;
-        };
-        typedef CuckooSet< key_val, traits_CuckooStripedSet<traits_CuckooSet_vector_unord_storehash>> CuckooStripedSet_vector_unord_storehash;
-        typedef CuckooSet< key_val, traits_CuckooRefinableSet<traits_CuckooSet_vector_unord_storehash>> CuckooRefinableSet_vector_unord_storehash;
-
-        struct traits_CuckooSet_vector_ord :
-            public cc::cuckoo::make_traits <
-                cc::cuckoo::probeset_type< cc::cuckoo::vector<4> >
-                , co::compare< compare >
-                , co::hash< std::tuple< hash, hash2 > >
-            > ::type
-        {};
-        typedef CuckooSet< key_val, traits_CuckooStripedSet<traits_CuckooSet_vector_ord>> CuckooStripedSet_vector_ord;
-        typedef CuckooSet< key_val, traits_CuckooRefinableSet<traits_CuckooSet_vector_ord>> CuckooRefinableSet_vector_ord;
-
-        struct traits_CuckooSet_vector_ord_stat : public traits_CuckooSet_vector_ord
-        {
-            typedef cc::cuckoo::stat stat;
-        };
-        typedef CuckooSet< key_val, traits_CuckooStripedSet<traits_CuckooSet_vector_ord_stat>> CuckooStripedSet_vector_ord_stat;
-        typedef CuckooSet< key_val, traits_CuckooRefinableSet<traits_CuckooSet_vector_ord_stat>> CuckooRefinableSet_vector_ord_stat;
-
-        struct traits_CuckooSet_vector_ord_storehash : public traits_CuckooSet_vector_ord
-        {
-            static CDS_CONSTEXPR const bool store_hash = true;
-        };
-        typedef CuckooSet< key_val, traits_CuckooStripedSet<traits_CuckooSet_vector_ord_storehash>> CuckooStripedSet_vector_ord_storehash;
-        typedef CuckooSet< key_val, traits_CuckooRefinableSet<traits_CuckooSet_vector_ord_storehash>> CuckooRefinableSet_vector_ord_storehash;
-
-
-        // ***************************************************************************
-        // SkipListSet
-
-        class traits_SkipListSet_less_pascal: public cc::skip_list::make_traits <
-                co::less< less >
-                ,cc::skip_list::random_level_generator< cc::skip_list::turbo_pascal >
-                ,co::item_counter< cds::atomicity::item_counter >
-            >::type
-        {};
-        typedef cc::SkipListSet< cds::gc::HP, key_val, traits_SkipListSet_less_pascal > SkipListSet_hp_less_pascal;
-        typedef cc::SkipListSet< cds::gc::DHP, key_val, traits_SkipListSet_less_pascal > SkipListSet_dhp_less_pascal;
-        typedef cc::SkipListSet< rcu_gpi, key_val, traits_SkipListSet_less_pascal > SkipListSet_rcu_gpi_less_pascal;
-        typedef cc::SkipListSet< rcu_gpb, key_val, traits_SkipListSet_less_pascal > SkipListSet_rcu_gpb_less_pascal;
-        typedef cc::SkipListSet< rcu_gpt, key_val, traits_SkipListSet_less_pascal > SkipListSet_rcu_gpt_less_pascal;
-#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
-        typedef cc::SkipListSet< rcu_shb, key_val, traits_SkipListSet_less_pascal > SkipListSet_rcu_shb_less_pascal;
-        typedef cc::SkipListSet< rcu_sht, key_val, traits_SkipListSet_less_pascal > SkipListSet_rcu_sht_less_pascal;
-#endif
-
-        class traits_SkipListSet_less_pascal_seqcst: public cc::skip_list::make_traits <
-                co::less< less >
-                ,cc::skip_list::random_level_generator< cc::skip_list::turbo_pascal >
-                ,co::memory_model< co::v::sequential_consistent >
-                ,co::item_counter< cds::atomicity::item_counter >
-            >::type
-        {};
-        typedef cc::SkipListSet< cds::gc::HP, key_val, traits_SkipListSet_less_pascal_seqcst > SkipListSet_hp_less_pascal_seqcst;
-        typedef cc::SkipListSet< cds::gc::DHP, key_val, traits_SkipListSet_less_pascal_seqcst > SkipListSet_dhp_less_pascal_seqcst;
-        typedef cc::SkipListSet< rcu_gpi, key_val, traits_SkipListSet_less_pascal_seqcst > SkipListSet_rcu_gpi_less_pascal_seqcst;
-        typedef cc::SkipListSet< rcu_gpb, key_val, traits_SkipListSet_less_pascal_seqcst > SkipListSet_rcu_gpb_less_pascal_seqcst;
-        typedef cc::SkipListSet< rcu_gpt, key_val, traits_SkipListSet_less_pascal_seqcst > SkipListSet_rcu_gpt_less_pascal_seqcst;
-#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
-        typedef cc::SkipListSet< rcu_shb, key_val, traits_SkipListSet_less_pascal_seqcst > SkipListSet_rcu_shb_less_pascal_seqcst;
-        typedef cc::SkipListSet< rcu_sht, key_val, traits_SkipListSet_less_pascal_seqcst > SkipListSet_rcu_sht_less_pascal_seqcst;
-#endif
-
-        class traits_SkipListSet_less_pascal_stat: public cc::skip_list::make_traits <
-                co::less< less >
-                ,cc::skip_list::random_level_generator< cc::skip_list::turbo_pascal >
-                ,co::stat< cc::skip_list::stat<> >
-                ,co::item_counter< cds::atomicity::item_counter >
-            >::type
-        {};
-        typedef cc::SkipListSet< cds::gc::HP, key_val, traits_SkipListSet_less_pascal_stat > SkipListSet_hp_less_pascal_stat;
-        typedef cc::SkipListSet< cds::gc::DHP, key_val, traits_SkipListSet_less_pascal_stat > SkipListSet_dhp_less_pascal_stat;
-        typedef cc::SkipListSet< rcu_gpi, key_val, traits_SkipListSet_less_pascal_stat > SkipListSet_rcu_gpi_less_pascal_stat;
-        typedef cc::SkipListSet< rcu_gpb, key_val, traits_SkipListSet_less_pascal_stat > SkipListSet_rcu_gpb_less_pascal_stat;
-        typedef cc::SkipListSet< rcu_gpt, key_val, traits_SkipListSet_less_pascal_stat > SkipListSet_rcu_gpt_less_pascal_stat;
-#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
-        typedef cc::SkipListSet< rcu_shb, key_val, traits_SkipListSet_less_pascal_stat > SkipListSet_rcu_shb_less_pascal_stat;
-        typedef cc::SkipListSet< rcu_sht, key_val, traits_SkipListSet_less_pascal_stat > SkipListSet_rcu_sht_less_pascal_stat;
-#endif
-
-        class traits_SkipListSet_cmp_pascal: public cc::skip_list::make_traits <
-            co::compare< compare >
-            ,cc::skip_list::random_level_generator< cc::skip_list::turbo_pascal >
-            ,co::item_counter< cds::atomicity::item_counter >
-        >::type
-        {};
-        typedef cc::SkipListSet< cds::gc::HP, key_val, traits_SkipListSet_cmp_pascal > SkipListSet_hp_cmp_pascal;
-        typedef cc::SkipListSet< cds::gc::DHP, key_val, traits_SkipListSet_cmp_pascal > SkipListSet_dhp_cmp_pascal;
-        typedef cc::SkipListSet< rcu_gpi, key_val, traits_SkipListSet_cmp_pascal > SkipListSet_rcu_gpi_cmp_pascal;
-        typedef cc::SkipListSet< rcu_gpb, key_val, traits_SkipListSet_cmp_pascal > SkipListSet_rcu_gpb_cmp_pascal;
-        typedef cc::SkipListSet< rcu_gpt, key_val, traits_SkipListSet_cmp_pascal > SkipListSet_rcu_gpt_cmp_pascal;
-#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
-        typedef cc::SkipListSet< rcu_shb, key_val, traits_SkipListSet_cmp_pascal > SkipListSet_rcu_shb_cmp_pascal;
-        typedef cc::SkipListSet< rcu_sht, key_val, traits_SkipListSet_cmp_pascal > SkipListSet_rcu_sht_cmp_pascal;
-#endif
-
-        class traits_SkipListSet_cmp_pascal_stat: public cc::skip_list::make_traits <
-            co::compare< compare >
-            ,cc::skip_list::random_level_generator< cc::skip_list::turbo_pascal >
-            ,co::stat< cc::skip_list::stat<> >
-            ,co::item_counter< cds::atomicity::item_counter >
-        >::type
-        {};
-        typedef cc::SkipListSet< cds::gc::HP, key_val, traits_SkipListSet_cmp_pascal_stat > SkipListSet_hp_cmp_pascal_stat;
-        typedef cc::SkipListSet< cds::gc::DHP, key_val, traits_SkipListSet_cmp_pascal_stat > SkipListSet_dhp_cmp_pascal_stat;
-        typedef cc::SkipListSet< rcu_gpi, key_val, traits_SkipListSet_cmp_pascal_stat > SkipListSet_rcu_gpi_cmp_pascal_stat;
-        typedef cc::SkipListSet< rcu_gpb, key_val, traits_SkipListSet_cmp_pascal_stat > SkipListSet_rcu_gpb_cmp_pascal_stat;
-        typedef cc::SkipListSet< rcu_gpt, key_val, traits_SkipListSet_cmp_pascal_stat > SkipListSet_rcu_gpt_cmp_pascal_stat;
-#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
-        typedef cc::SkipListSet< rcu_shb, key_val, traits_SkipListSet_cmp_pascal_stat > SkipListSet_rcu_shb_cmp_pascal_stat;
-        typedef cc::SkipListSet< rcu_sht, key_val, traits_SkipListSet_cmp_pascal_stat > SkipListSet_rcu_sht_cmp_pascal_stat;
-#endif
-
-        class traits_SkipListSet_less_xorshift: public cc::skip_list::make_traits <
-            co::less< less >
-            ,cc::skip_list::random_level_generator< cc::skip_list::xorshift >
-            ,co::item_counter< cds::atomicity::item_counter >
-        >::type
-        {};
-        typedef cc::SkipListSet< cds::gc::HP, key_val, traits_SkipListSet_less_xorshift > SkipListSet_hp_less_xorshift;
-        typedef cc::SkipListSet< cds::gc::DHP, key_val, traits_SkipListSet_less_xorshift > SkipListSet_dhp_less_xorshift;
-        typedef cc::SkipListSet< rcu_gpi, key_val, traits_SkipListSet_less_xorshift > SkipListSet_rcu_gpi_less_xorshift;
-        typedef cc::SkipListSet< rcu_gpb, key_val, traits_SkipListSet_less_xorshift > SkipListSet_rcu_gpb_less_xorshift;
-        typedef cc::SkipListSet< rcu_gpt, key_val, traits_SkipListSet_less_xorshift > SkipListSet_rcu_gpt_less_xorshift;
-#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
-        typedef cc::SkipListSet< rcu_shb, key_val, traits_SkipListSet_less_xorshift > SkipListSet_rcu_shb_less_xorshift;
-        typedef cc::SkipListSet< rcu_sht, key_val, traits_SkipListSet_less_xorshift > SkipListSet_rcu_sht_less_xorshift;
-#endif
-
-        class traits_SkipListSet_less_xorshift_stat: public cc::skip_list::make_traits <
-            co::less< less >
-            ,cc::skip_list::random_level_generator< cc::skip_list::xorshift >
-            ,co::stat< cc::skip_list::stat<> >
-            ,co::item_counter< cds::atomicity::item_counter >
-        >::type
-        {};
-        typedef cc::SkipListSet< cds::gc::HP, key_val, traits_SkipListSet_less_xorshift_stat > SkipListSet_hp_less_xorshift_stat;
-        typedef cc::SkipListSet< cds::gc::DHP, key_val, traits_SkipListSet_less_xorshift_stat > SkipListSet_dhp_less_xorshift_stat;
-        typedef cc::SkipListSet< rcu_gpi, key_val, traits_SkipListSet_less_xorshift_stat > SkipListSet_rcu_gpi_less_xorshift_stat;
-        typedef cc::SkipListSet< rcu_gpb, key_val, traits_SkipListSet_less_xorshift_stat > SkipListSet_rcu_gpb_less_xorshift_stat;
-        typedef cc::SkipListSet< rcu_gpt, key_val, traits_SkipListSet_less_xorshift_stat > SkipListSet_rcu_gpt_less_xorshift_stat;
-#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
-        typedef cc::SkipListSet< rcu_shb, key_val, traits_SkipListSet_less_xorshift_stat > SkipListSet_rcu_shb_less_xorshift_stat;
-        typedef cc::SkipListSet< rcu_sht, key_val, traits_SkipListSet_less_xorshift_stat > SkipListSet_rcu_sht_less_xorshift_stat;
-#endif
-
-        class traits_SkipListSet_cmp_xorshift: public cc::skip_list::make_traits <
-            co::compare< compare >
-            ,cc::skip_list::random_level_generator< cc::skip_list::xorshift >
-            ,co::item_counter< cds::atomicity::item_counter >
-        >::type
-        {};
-        typedef cc::SkipListSet< cds::gc::HP, key_val, traits_SkipListSet_cmp_xorshift > SkipListSet_hp_cmp_xorshift;
-        typedef cc::SkipListSet< cds::gc::DHP, key_val, traits_SkipListSet_cmp_xorshift > SkipListSet_dhp_cmp_xorshift;
-        typedef cc::SkipListSet< rcu_gpi, key_val, traits_SkipListSet_cmp_xorshift > SkipListSet_rcu_gpi_cmp_xorshift;
-        typedef cc::SkipListSet< rcu_gpb, key_val, traits_SkipListSet_cmp_xorshift > SkipListSet_rcu_gpb_cmp_xorshift;
-        typedef cc::SkipListSet< rcu_gpt, key_val, traits_SkipListSet_cmp_xorshift > SkipListSet_rcu_gpt_cmp_xorshift;
-#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
-        typedef cc::SkipListSet< rcu_shb, key_val, traits_SkipListSet_cmp_xorshift > SkipListSet_rcu_shb_cmp_xorshift;
-        typedef cc::SkipListSet< rcu_sht, key_val, traits_SkipListSet_cmp_xorshift > SkipListSet_rcu_sht_cmp_xorshift;
-#endif
-
-        class traits_SkipListSet_cmp_xorshift_stat: public cc::skip_list::make_traits <
-            co::compare< compare >
-            ,cc::skip_list::random_level_generator< cc::skip_list::xorshift >
-            ,co::stat< cc::skip_list::stat<> >
-            ,co::item_counter< cds::atomicity::item_counter >
-        >::type
-        {};
-        typedef cc::SkipListSet< cds::gc::HP, key_val, traits_SkipListSet_cmp_xorshift_stat > SkipListSet_hp_cmp_xorshift_stat;
-        typedef cc::SkipListSet< cds::gc::DHP, key_val, traits_SkipListSet_cmp_xorshift_stat > SkipListSet_dhp_cmp_xorshift_stat;
-        typedef cc::SkipListSet< rcu_gpi, key_val, traits_SkipListSet_cmp_xorshift_stat > SkipListSet_rcu_gpi_cmp_xorshift_stat;
-        typedef cc::SkipListSet< rcu_gpb, key_val, traits_SkipListSet_cmp_xorshift_stat > SkipListSet_rcu_gpb_cmp_xorshift_stat;
-        typedef cc::SkipListSet< rcu_gpt, key_val, traits_SkipListSet_cmp_xorshift_stat > SkipListSet_rcu_gpt_cmp_xorshift_stat;
-#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
-        typedef cc::SkipListSet< rcu_shb, key_val, traits_SkipListSet_cmp_xorshift_stat > SkipListSet_rcu_shb_cmp_xorshift_stat;
-        typedef cc::SkipListSet< rcu_sht, key_val, traits_SkipListSet_cmp_xorshift_stat > SkipListSet_rcu_sht_cmp_xorshift_stat;
-#endif
-
-
-        // ***************************************************************************
-        // EllenBinTreeSet
-        struct ellen_bintree_props {
-            struct key_extractor {
-                void operator()( key_type& dest, key_val const& src ) const
-                {
-                    dest = src.key;
-                }
-            };
-
-            struct less {
-                bool operator()( key_val const& v1, key_val const& v2 ) const
-                {
-                    return key_less()( v1.key, v2.key );
-                }
-                bool operator()( key_type const& k, key_val const& v ) const
-                {
-                    return key_less()( k, v.key );
-                }
-                bool operator()( key_val const& v, key_type const& k ) const
-                {
-                    return key_less()( v.key, k );
-                }
-                bool operator()( key_type const& k1, key_type const& k2 ) const
-                {
-                    return key_less()( k1, k2 );
-                }
-            };
-
-            struct hp_gc {
-                typedef cc::ellen_bintree::node<cds::gc::HP, key_val>               leaf_node;
-                typedef cc::ellen_bintree::internal_node< key_type, leaf_node >     internal_node;
-                typedef cc::ellen_bintree::update_desc< leaf_node, internal_node >  update_desc;
-            };
-
-            struct dhp_gc {
-                typedef cc::ellen_bintree::node<cds::gc::DHP, key_val>              leaf_node;
-                typedef cc::ellen_bintree::internal_node< key_type, leaf_node >     internal_node;
-                typedef cc::ellen_bintree::update_desc< leaf_node, internal_node >  update_desc;
-            };
-
-            struct gpi {
-                typedef cc::ellen_bintree::node<rcu_gpi, key_val>                   leaf_node;
-                typedef cc::ellen_bintree::internal_node< key_type, leaf_node >     internal_node;
-                typedef cc::ellen_bintree::update_desc< leaf_node, internal_node >  update_desc;
-            };
-            struct gpb {
-                typedef cc::ellen_bintree::node<rcu_gpb, key_val>                   leaf_node;
-                typedef cc::ellen_bintree::internal_node< key_type, leaf_node >     internal_node;
-                typedef cc::ellen_bintree::update_desc< leaf_node, internal_node >  update_desc;
-            };
-            struct gpt {
-                typedef cc::ellen_bintree::node<rcu_gpt, key_val>                   leaf_node;
-                typedef cc::ellen_bintree::internal_node< key_type, leaf_node >     internal_node;
-                typedef cc::ellen_bintree::update_desc< leaf_node, internal_node >  update_desc;
-            };
-#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
-            struct shb {
-                typedef cc::ellen_bintree::node<rcu_shb, key_val>                   leaf_node;
-                typedef cc::ellen_bintree::internal_node< key_type, leaf_node >     internal_node;
-                typedef cc::ellen_bintree::update_desc< leaf_node, internal_node >  update_desc;
-            };
-            struct sht {
-                typedef cc::ellen_bintree::node<rcu_sht, key_val>                   leaf_node;
-                typedef cc::ellen_bintree::internal_node< key_type, leaf_node >     internal_node;
-                typedef cc::ellen_bintree::update_desc< leaf_node, internal_node >  update_desc;
-            };
-#endif
-        };
-
-        struct traits_EllenBinTreeSet: public cc::ellen_bintree::make_set_traits<
-            cc::ellen_bintree::key_extractor< typename ellen_bintree_props::key_extractor >
-            ,co::less< typename ellen_bintree_props::less >
-            ,co::node_allocator< ellen_bintree_pool::internal_node_allocator< int > >
-        >::type
-        {};
-
-        struct traits_EllenBinTreeSet_hp : public traits_EllenBinTreeSet
-        {
-            typedef cds::memory::pool_allocator< typename ellen_bintree_props::hp_gc::update_desc, ellen_bintree_pool::update_desc_pool_accessor > update_desc_allocator;
-        };
-        typedef cc::EllenBinTreeSet< cds::gc::HP, key_type, key_val, traits_EllenBinTreeSet_hp > EllenBinTreeSet_hp;
-
-        struct traits_EllenBinTreeSet_dhp : public traits_EllenBinTreeSet
-        {
-            typedef cds::memory::pool_allocator< typename ellen_bintree_props::dhp_gc::update_desc, ellen_bintree_pool::update_desc_pool_accessor > update_desc_allocator;
-        };
-        typedef cc::EllenBinTreeSet< cds::gc::DHP, key_type, key_val, traits_EllenBinTreeSet_dhp > EllenBinTreeSet_dhp;
-
-        struct traits_EllenBinTreeSet_gpi : public traits_EllenBinTreeSet
-        {
-            typedef cds::memory::pool_allocator< typename ellen_bintree_props::gpi::update_desc, ellen_bintree_pool::update_desc_pool_accessor > update_desc_allocator;
-        };
-        typedef cc::EllenBinTreeSet< rcu_gpi, key_type, key_val, traits_EllenBinTreeSet_gpi > EllenBinTreeSet_rcu_gpi;
-
-        struct traits_EllenBinTreeSet_gpb : public traits_EllenBinTreeSet
-        {
-            typedef cds::memory::pool_allocator< typename ellen_bintree_props::gpb::update_desc, ellen_bintree_pool::update_desc_pool_accessor > update_desc_allocator;
-        };
-        typedef cc::EllenBinTreeSet< rcu_gpb, key_type, key_val, traits_EllenBinTreeSet_gpb > EllenBinTreeSet_rcu_gpb;
-
-        struct traits_EllenBinTreeSet_gpt : public traits_EllenBinTreeSet
-        {
-            typedef cds::memory::pool_allocator< typename ellen_bintree_props::gpt::update_desc, ellen_bintree_pool::update_desc_pool_accessor > update_desc_allocator;
-        };
-        typedef cc::EllenBinTreeSet< rcu_gpt, key_type, key_val, traits_EllenBinTreeSet_gpt > EllenBinTreeSet_rcu_gpt;
-
-#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
-        struct traits_EllenBinTreeSet_shb : public traits_EllenBinTreeSet
-        {
-            typedef cds::memory::pool_allocator< typename ellen_bintree_props::shb::update_desc, ellen_bintree_pool::update_desc_pool_accessor > update_desc_allocator;
-        };
-        typedef cc::EllenBinTreeSet< rcu_shb, key_type, key_val, traits_EllenBinTreeSet_shb > EllenBinTreeSet_rcu_shb;
-
-        struct traits_EllenBinTreeSet_sht : public traits_EllenBinTreeSet
-        {
-            typedef cds::memory::pool_allocator< typename ellen_bintree_props::sht::update_desc, ellen_bintree_pool::update_desc_pool_accessor > update_desc_allocator;
-        };
-        typedef cc::EllenBinTreeSet< rcu_sht, key_type, key_val, traits_EllenBinTreeSet_sht > EllenBinTreeSet_rcu_sht;
-#endif
-
-        //
-        struct traits_EllenBinTreeSet_yield : public traits_EllenBinTreeSet
-        {
-            typedef cds::backoff::yield back_off;
-        };
-
-        struct traits_EllenBinTreeSet_yield_hp : public traits_EllenBinTreeSet_yield
-        {
-            typedef cds::memory::pool_allocator< typename ellen_bintree_props::hp_gc::update_desc, ellen_bintree_pool::update_desc_pool_accessor > update_desc_allocator;
-        };
-        typedef cc::EllenBinTreeSet< cds::gc::HP, key_type, key_val, traits_EllenBinTreeSet_yield_hp > EllenBinTreeSet_yield_hp;
-
-        struct traits_EllenBinTreeSet_yield_dhp : public traits_EllenBinTreeSet_yield
-        {
-            typedef cds::memory::pool_allocator< typename ellen_bintree_props::dhp_gc::update_desc, ellen_bintree_pool::update_desc_pool_accessor > update_desc_allocator;
-        };
-        typedef cc::EllenBinTreeSet< cds::gc::DHP, key_type, key_val, traits_EllenBinTreeSet_yield_dhp > EllenBinTreeSet_yield_dhp;
-
-
-        struct traits_EllenBinTreeSet_yield_gpb : public traits_EllenBinTreeSet_yield
-        {
-            typedef cds::memory::pool_allocator< typename ellen_bintree_props::gpb::update_desc, ellen_bintree_pool::update_desc_pool_accessor > update_desc_allocator;
-        };
-        typedef cc::EllenBinTreeSet< rcu_gpb, key_type, key_val, traits_EllenBinTreeSet_yield_gpb > EllenBinTreeSet_yield_rcu_gpb;
-
-
-        struct traits_EllenBinTreeSet_stat: public cc::ellen_bintree::make_set_traits<
-            cc::ellen_bintree::key_extractor< typename ellen_bintree_props::key_extractor >
-            ,co::less< typename ellen_bintree_props::less >
-            ,co::node_allocator< ellen_bintree_pool::internal_node_allocator< int > >
-            ,co::stat< cc::ellen_bintree::stat<> >
-        >::type
-        {};
-
-        struct traits_EllenBinTreeSet_stat_hp : public traits_EllenBinTreeSet_stat
-        {
-            typedef cds::memory::pool_allocator< typename ellen_bintree_props::hp_gc::update_desc, ellen_bintree_pool::update_desc_pool_accessor > update_desc_allocator;
-        };
-        typedef cc::EllenBinTreeSet< cds::gc::HP, key_type, key_val, traits_EllenBinTreeSet_stat_hp > EllenBinTreeSet_hp_stat;
-
-        struct traits_EllenBinTreeSet_stat_dhp : public traits_EllenBinTreeSet_stat
-        {
-            typedef cds::memory::pool_allocator< typename ellen_bintree_props::dhp_gc::update_desc, ellen_bintree_pool::update_desc_pool_accessor > update_desc_allocator;
-        };
-        typedef cc::EllenBinTreeSet< cds::gc::DHP, key_type, key_val, traits_EllenBinTreeSet_stat_dhp > EllenBinTreeSet_dhp_stat;
-
-        struct traits_EllenBinTreeSet_stat_gpi : public traits_EllenBinTreeSet_stat
-        {
-            typedef cds::memory::pool_allocator< typename ellen_bintree_props::gpi::update_desc, ellen_bintree_pool::update_desc_pool_accessor > update_desc_allocator;
-        };
-        typedef cc::EllenBinTreeSet< rcu_gpi, key_type, key_val, traits_EllenBinTreeSet_stat_gpi > EllenBinTreeSet_rcu_gpi_stat;
-
-        struct traits_EllenBinTreeSet_stat_gpb : public traits_EllenBinTreeSet_stat
-        {
-            typedef cds::memory::pool_allocator< typename ellen_bintree_props::gpb::update_desc, ellen_bintree_pool::update_desc_pool_accessor > update_desc_allocator;
-        };
-        typedef cc::EllenBinTreeSet< rcu_gpb, key_type, key_val, traits_EllenBinTreeSet_stat_gpb > EllenBinTreeSet_rcu_gpb_stat;
-
-        struct traits_EllenBinTreeSet_stat_gpt : public traits_EllenBinTreeSet_stat
-        {
-            typedef cds::memory::pool_allocator< typename ellen_bintree_props::gpt::update_desc, ellen_bintree_pool::update_desc_pool_accessor > update_desc_allocator;
-        };
-        typedef cc::EllenBinTreeSet< rcu_gpt, key_type, key_val, traits_EllenBinTreeSet_stat_gpt > EllenBinTreeSet_rcu_gpt_stat;
-
-#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
-        struct traits_EllenBinTreeSet_stat_shb : public traits_EllenBinTreeSet_stat
-        {
-            typedef cds::memory::pool_allocator< typename ellen_bintree_props::shb::update_desc, ellen_bintree_pool::update_desc_pool_accessor > update_desc_allocator;
-        };
-        typedef cc::EllenBinTreeSet< rcu_shb, key_type, key_val, traits_EllenBinTreeSet_stat_shb > EllenBinTreeSet_rcu_shb_stat;
-
-        struct traits_EllenBinTreeSet_stat_sht : public traits_EllenBinTreeSet_stat
-        {
-            typedef cds::memory::pool_allocator< typename ellen_bintree_props::sht::update_desc, ellen_bintree_pool::update_desc_pool_accessor > update_desc_allocator;
-        };
-        typedef cc::EllenBinTreeSet< rcu_sht, key_type, key_val, traits_EllenBinTreeSet_stat_sht > EllenBinTreeSet_rcu_sht_stat;
-#endif
-
-        // ***************************************************************************
-        // Standard implementations
-
-        typedef StdSet< key_val, less, cds::sync::spin > StdSet_Spin;
-        typedef StdSet< key_val, less, lock::NoLock>     StdSet_NoLock;
-
-        typedef StdHashSet< key_val, hash, less, equal_to, cds::sync::spin > StdHashSet_Spin;
-        typedef StdHashSet< key_val, hash, less, equal_to, lock::NoLock >    StdHashSet_NoLock;
-
-    };
-
-
-    // *************************************************
-    // print_stat
-    // *************************************************
-
-    template <typename Set>
-    static inline void print_stat( Set const& /*s*/ )
-    {}
-
-    template <typename GC, typename T, typename Traits>
-    static inline void print_stat( cc::SplitListSet<GC, T, Traits> const& s )
-    {
-        CPPUNIT_MSG( s.statistics() );
-    }
-
-    template <typename GC, typename T, typename Traits>
-    static inline void print_stat( cc::SkipListSet<GC, T, Traits> const& s )
-    {
-        CPPUNIT_MSG( s.statistics() );
-    }
-
-    template <typename GC, typename Key, typename T, typename Traits>
-    static inline void print_stat( cc::EllenBinTreeSet<GC, Key, T, Traits> const& s )
-    {
-        CPPUNIT_MSG( s.statistics() );
-    }
-
-    template <typename T, typename Traits >
-    static inline void print_stat( cc::CuckooSet< T, Traits > const& s )
-    {
-        CPPUNIT_MSG( s.statistics() << s.mutex_policy_statistics() );
-    }
-
-    template <typename V, typename Traits>
-    static inline void print_stat( CuckooSet< V, Traits > const& s )
-    {
-        typedef CuckooSet< V, Traits > set_type;
-        print_stat( static_cast<typename set_type::cuckoo_base_class const&>(s) );
-    }
-
-
-    //*******************************************************
-    // additional_check
-    //*******************************************************
-
-    template <typename Set>
-    static inline void additional_check( Set& /*set*/ )
-    {}
-
-    template <typename Set>
-    static inline void additional_cleanup( Set& /*set*/ )
-    {}
-
-    namespace ellen_bintree_check {
-        static inline void check_stat( cds::intrusive::ellen_bintree::empty_stat const& /*s*/ )
-        {
-            // Not true for threaded RCU
-            /*
-            CPPUNIT_CHECK_CURRENT_EX( ellen_bintree_pool::internal_node_counter::m_nAlloc.get() == ellen_bintree_pool::internal_node_counter::m_nFree.get(),
-                "m_nAlloc=" << ellen_bintree_pool::internal_node_counter::m_nAlloc.get()
-                << ", m_nFree=" << ellen_bintree_pool::internal_node_counter::m_nFree.get()
-                );
-            */
-        }
-
-        static inline void check_stat( cds::intrusive::ellen_bintree::stat<> const& stat )
-        {
-            CPPUNIT_CHECK_CURRENT( stat.m_nInternalNodeCreated == stat.m_nInternalNodeDeleted );
-            CPPUNIT_CHECK_CURRENT( stat.m_nUpdateDescCreated == stat.m_nUpdateDescDeleted );
-            //CPPUNIT_CHECK_CURRENT( ellen_bintree_pool::internal_node_counter::m_nAlloc.get() == ellen_bintree_pool::internal_node_counter::m_nFree.get() );
-            CPPUNIT_CHECK_CURRENT( ellen_bintree_pool::internal_node_counter::m_nAlloc.get() == stat.m_nInternalNodeCreated );
-            // true if RCU is not threaded
-            //CPPUNIT_CHECK_CURRENT( stat.m_nInternalNodeDeleted == ellen_bintree_pool::internal_node_counter::m_nFree.get() );
-        }
-    }   // namespace ellen_bintree_check
-
-    template <typename GC, typename Key, typename T, typename Traits>
-    static inline void additional_check( cc::EllenBinTreeSet<GC, Key, T, Traits>& s )
-    {
-        GC::force_dispose();
-        ellen_bintree_check::check_stat( s.statistics() );
-    }
-
-    template <typename GC, typename Key, typename T, typename Traits>
-    static inline void additional_cleanup( cc::EllenBinTreeSet<GC, Key, T, Traits>& /*s*/ )
-    {
-        ellen_bintree_pool::internal_node_counter::reset();
-    }
-
-    //*******************************************************
-    // check_before_clear
-    //*******************************************************
-
-    template <typename Set>
-    static inline void check_before_clear( Set& /*s*/ )
-    {}
-
-    template <typename GC, typename Key, typename T, typename Traits>
-    static inline void check_before_clear( cds::container::EllenBinTreeSet<GC, Key, T, Traits>& s )
-    {
-        CPPUNIT_CHECK_CURRENT( s.check_consistency() );
-    }
-
-}   // namespace set2
-
-#endif // ifndef CDSUNIT_SET_TYPES_H
diff --git a/tests/unit/set2/std_hash_set.h b/tests/unit/set2/std_hash_set.h
deleted file mode 100644 (file)
index 5338c13..0000000
+++ /dev/null
@@ -1,102 +0,0 @@
-//$$CDS-header$$
-
-#ifndef CDSUNIT_STD_HASH_SET_H
-#define CDSUNIT_STD_HASH_SET_H
-
-#include <unordered_set>
-#include <mutex>    //unique_lock
-
-namespace set2 {
-
-    template <typename Value, typename Hash, typename Less, typename EqualTo, typename Lock,
-        class Alloc = typename CDS_DEFAULT_ALLOCATOR::template rebind<Value>::other
-    >
-    class StdHashSet
-        : public std::unordered_set<
-            Value
-            , Hash
-            , EqualTo
-            , Alloc
-        >
-    {
-    public:
-        Lock m_lock;
-        typedef std::unique_lock<Lock> scoped_lock;
-        typedef std::unordered_set<
-            Value
-            , Hash
-            , EqualTo
-            , Alloc
-        >   base_class;
-    public:
-        typedef typename base_class::value_type value_type;
-
-        StdHashSet( size_t /*nSetSize*/, size_t /*nLoadFactor*/ )
-        {}
-
-        template <typename Key>
-        bool find( const Key& key )
-        {
-            scoped_lock al( m_lock );
-            return base_class::find( value_type(key) ) != base_class::end();
-        }
-
-        template <typename Key>
-        bool insert( Key const& key )
-        {
-            scoped_lock al( m_lock );
-            std::pair<typename base_class::iterator, bool> pRet = base_class::insert( value_type( key ));
-            return pRet.second;
-        }
-
-        template <typename Key, typename Func>
-        bool insert( Key const& key, Func func )
-        {
-            scoped_lock al( m_lock );
-            std::pair<typename base_class::iterator, bool> pRet = base_class::insert( value_type( key ));
-            if ( pRet.second ) {
-                func( *pRet.first );
-                return true;
-            }
-            return false;
-        }
-
-        template <typename T, typename Func>
-        std::pair<bool, bool> ensure( const T& key, Func func )
-        {
-            scoped_lock al( m_lock );
-            std::pair<typename base_class::iterator, bool> pRet = base_class::insert( value_type( key ));
-            if ( pRet.second ) {
-                func( true, *pRet.first, key );
-                return std::make_pair( true, true );
-            }
-            else {
-                func( false, *pRet.first, key );
-                return std::make_pair( true, false );
-            }
-        }
-
-        template <typename Key>
-        bool erase( const Key& key )
-        {
-            scoped_lock al( m_lock );
-            return base_class::erase( value_type(key) ) != 0;
-        }
-
-        template <typename T, typename Func>
-        bool erase( const T& key, Func func )
-        {
-            scoped_lock al( m_lock );
-            typename base_class::iterator it = base_class::find( value_type(key) );
-            if ( it != base_class::end() ) {
-                func( *it );
-                return base_class::erase( it ) != base_class::end();
-            }
-            return false;
-        }
-
-        std::ostream& dump( std::ostream& stm ) { return stm; }
-    };
-}   // namespace set2
-
-#endif  // #ifndef CDSUNIT_STD_HASH_SET_H
diff --git a/tests/unit/set2/std_set.h b/tests/unit/set2/std_set.h
deleted file mode 100644 (file)
index 3ad196e..0000000
+++ /dev/null
@@ -1,90 +0,0 @@
-//$$CDS-header$$
-
-#ifndef CDSUNIT_STD_SET_H
-#define CDSUNIT_STD_SET_H
-
-#include <set>
-#include <mutex>    //unique_lock
-
-namespace set2 {
-    template <typename Value, typename Less, typename Lock,
-        class Alloc = typename CDS_DEFAULT_ALLOCATOR::template rebind<Value>::other
-    >
-    class StdSet: public std::set<Value, Less, Alloc>
-    {
-        Lock m_lock;
-        typedef std::unique_lock<Lock> scoped_lock;
-        typedef std::set<Value, Less, Alloc> base_class;
-    public:
-        typedef typename base_class::key_type value_type;
-
-        StdSet( size_t /*nMapSize*/, size_t /*nLoadFactor*/ )
-        {}
-
-        template <typename Key>
-        bool find( const Key& key )
-        {
-            value_type v( key );
-            scoped_lock al( m_lock );
-            return base_class::find( v ) != base_class::end();
-        }
-
-        bool insert( value_type const& v )
-        {
-            scoped_lock al( m_lock );
-            return base_class::insert( v ).second;
-        }
-
-        template <typename Key, typename Func>
-        bool insert( Key const& key, Func func )
-        {
-            scoped_lock al( m_lock );
-            std::pair<typename base_class::iterator, bool> pRet = base_class::insert( value_type( key ));
-            if ( pRet.second ) {
-                func( *pRet.first );
-                return true;
-            }
-            return false;
-        }
-
-        template <typename T, typename Func>
-        std::pair<bool, bool> ensure( const T& key, Func func )
-        {
-            scoped_lock al( m_lock );
-            std::pair<typename base_class::iterator, bool> pRet = base_class::insert( value_type( key ));
-            if ( pRet.second ) {
-                func( true, *pRet.first, key );
-                return std::make_pair( true, true );
-            }
-            else {
-                func( false, *pRet.first, key );
-                return std::make_pair( true, false );
-            }
-        }
-
-        template <typename Key>
-        bool erase( const Key& key )
-        {
-            scoped_lock al( m_lock );
-            return base_class::erase( value_type(key) ) != 0;
-        }
-
-        template <typename T, typename Func>
-        bool erase( const T& key, Func func )
-        {
-            scoped_lock al( m_lock );
-            typename base_class::iterator it = base_class::find( value_type(key) );
-            if ( it != base_class::end() ) {
-                func( *it );
-
-                base_class::erase( it );
-                return true;
-            }
-            return false;
-        }
-
-        std::ostream& dump( std::ostream& stm ) { return stm; }
-    };
-} // namespace set2
-
-#endif  // #ifndef CDSUNIT_STD_MAP_H