intrusive::SplitListSet refactoring
authorkhizmax <libcds.dev@gmail.com>
Tue, 28 Oct 2014 19:51:39 +0000 (22:51 +0300)
committerkhizmax <libcds.dev@gmail.com>
Tue, 28 Oct 2014 19:51:39 +0000 (22:51 +0300)
12 files changed:
cds/intrusive/lazy_list_rcu.h
tests/test-hdr/set/hdr_intrusive_set.h
tests/test-hdr/set/hdr_intrusive_splitlist_set_rcu_gpb.cpp
tests/test-hdr/set/hdr_intrusive_splitlist_set_rcu_gpb_lazy.cpp
tests/test-hdr/set/hdr_intrusive_splitlist_set_rcu_gpi.cpp
tests/test-hdr/set/hdr_intrusive_splitlist_set_rcu_gpi_lazy.cpp
tests/test-hdr/set/hdr_intrusive_splitlist_set_rcu_gpt.cpp
tests/test-hdr/set/hdr_intrusive_splitlist_set_rcu_gpt_lazy.cpp
tests/test-hdr/set/hdr_intrusive_splitlist_set_rcu_shb.cpp
tests/test-hdr/set/hdr_intrusive_splitlist_set_rcu_shb_lazy.cpp
tests/test-hdr/set/hdr_intrusive_splitlist_set_rcu_sht.cpp
tests/test-hdr/set/hdr_intrusive_splitlist_set_rcu_sht_lazy.cpp

index 2d947162eaa37430e9fb88111170ebcd372456bd..1790d2a77b47392a41b3e25e024faf4dcd013944 100644 (file)
@@ -128,7 +128,7 @@ namespace cds { namespace intrusive {
         //@cond
         // Rebind traits (split-list support)
         template <typename... Options>
         //@cond
         // Rebind traits (split-list support)
         template <typename... Options>
-        struct rebind_options {
+        struct rebind_traits {
             typedef LazyList<
                 gc
                 , value_type
             typedef LazyList<
                 gc
                 , value_type
index 8e087d5d92044eff229320e51789483f7964bc75..a6345126370ed3c7713137bee640676a3b611e5f 100644 (file)
@@ -1202,15 +1202,19 @@ namespace set {
         void split_dyn_RCU_GPI_base_cmp();
         void split_dyn_RCU_GPI_base_less();
         void split_dyn_RCU_GPI_base_cmpmix();
         void split_dyn_RCU_GPI_base_cmp();
         void split_dyn_RCU_GPI_base_less();
         void split_dyn_RCU_GPI_base_cmpmix();
+        void split_dyn_RCU_GPI_base_cmpmix_stat();
         void split_dyn_RCU_GPI_member_cmp();
         void split_dyn_RCU_GPI_member_less();
         void split_dyn_RCU_GPI_member_cmpmix();
         void split_dyn_RCU_GPI_member_cmp();
         void split_dyn_RCU_GPI_member_less();
         void split_dyn_RCU_GPI_member_cmpmix();
+        void split_dyn_RCU_GPI_member_cmpmix_stat();
         void split_st_RCU_GPI_base_cmp();
         void split_st_RCU_GPI_base_less();
         void split_st_RCU_GPI_base_cmpmix();
         void split_st_RCU_GPI_base_cmp();
         void split_st_RCU_GPI_base_less();
         void split_st_RCU_GPI_base_cmpmix();
+        void split_st_RCU_GPI_base_cmpmix_stat();
         void split_st_RCU_GPI_member_cmp();
         void split_st_RCU_GPI_member_less();
         void split_st_RCU_GPI_member_cmpmix();
         void split_st_RCU_GPI_member_cmp();
         void split_st_RCU_GPI_member_less();
         void split_st_RCU_GPI_member_cmpmix();
+        void split_st_RCU_GPI_member_cmpmix_stat();
 
         void split_dyn_RCU_GPB_base_cmp();
         void split_dyn_RCU_GPB_base_less();
 
         void split_dyn_RCU_GPB_base_cmp();
         void split_dyn_RCU_GPB_base_less();
@@ -1232,41 +1236,53 @@ namespace set {
         void split_dyn_RCU_GPT_base_cmp();
         void split_dyn_RCU_GPT_base_less();
         void split_dyn_RCU_GPT_base_cmpmix();
         void split_dyn_RCU_GPT_base_cmp();
         void split_dyn_RCU_GPT_base_less();
         void split_dyn_RCU_GPT_base_cmpmix();
+        void split_dyn_RCU_GPT_base_cmpmix_stat();
         void split_dyn_RCU_GPT_member_cmp();
         void split_dyn_RCU_GPT_member_less();
         void split_dyn_RCU_GPT_member_cmpmix();
         void split_dyn_RCU_GPT_member_cmp();
         void split_dyn_RCU_GPT_member_less();
         void split_dyn_RCU_GPT_member_cmpmix();
+        void split_dyn_RCU_GPT_member_cmpmix_stat();
         void split_st_RCU_GPT_base_cmp();
         void split_st_RCU_GPT_base_less();
         void split_st_RCU_GPT_base_cmpmix();
         void split_st_RCU_GPT_base_cmp();
         void split_st_RCU_GPT_base_less();
         void split_st_RCU_GPT_base_cmpmix();
+        void split_st_RCU_GPT_base_cmpmix_stat();
         void split_st_RCU_GPT_member_cmp();
         void split_st_RCU_GPT_member_less();
         void split_st_RCU_GPT_member_cmpmix();
         void split_st_RCU_GPT_member_cmp();
         void split_st_RCU_GPT_member_less();
         void split_st_RCU_GPT_member_cmpmix();
+        void split_st_RCU_GPT_member_cmpmix_stat();
 
         void split_dyn_RCU_SHB_base_cmp();
         void split_dyn_RCU_SHB_base_less();
         void split_dyn_RCU_SHB_base_cmpmix();
 
         void split_dyn_RCU_SHB_base_cmp();
         void split_dyn_RCU_SHB_base_less();
         void split_dyn_RCU_SHB_base_cmpmix();
+        void split_dyn_RCU_SHB_base_cmpmix_stat();
         void split_dyn_RCU_SHB_member_cmp();
         void split_dyn_RCU_SHB_member_less();
         void split_dyn_RCU_SHB_member_cmpmix();
         void split_dyn_RCU_SHB_member_cmp();
         void split_dyn_RCU_SHB_member_less();
         void split_dyn_RCU_SHB_member_cmpmix();
+        void split_dyn_RCU_SHB_member_cmpmix_stat();
         void split_st_RCU_SHB_base_cmp();
         void split_st_RCU_SHB_base_less();
         void split_st_RCU_SHB_base_cmpmix();
         void split_st_RCU_SHB_base_cmp();
         void split_st_RCU_SHB_base_less();
         void split_st_RCU_SHB_base_cmpmix();
+        void split_st_RCU_SHB_base_cmpmix_stat();
         void split_st_RCU_SHB_member_cmp();
         void split_st_RCU_SHB_member_less();
         void split_st_RCU_SHB_member_cmpmix();
         void split_st_RCU_SHB_member_cmp();
         void split_st_RCU_SHB_member_less();
         void split_st_RCU_SHB_member_cmpmix();
+        void split_st_RCU_SHB_member_cmpmix_stat();
 
         void split_dyn_RCU_SHT_base_cmp();
         void split_dyn_RCU_SHT_base_less();
         void split_dyn_RCU_SHT_base_cmpmix();
 
         void split_dyn_RCU_SHT_base_cmp();
         void split_dyn_RCU_SHT_base_less();
         void split_dyn_RCU_SHT_base_cmpmix();
+        void split_dyn_RCU_SHT_base_cmpmix_stat();
         void split_dyn_RCU_SHT_member_cmp();
         void split_dyn_RCU_SHT_member_less();
         void split_dyn_RCU_SHT_member_cmpmix();
         void split_dyn_RCU_SHT_member_cmp();
         void split_dyn_RCU_SHT_member_less();
         void split_dyn_RCU_SHT_member_cmpmix();
+        void split_dyn_RCU_SHT_member_cmpmix_stat();
         void split_st_RCU_SHT_base_cmp();
         void split_st_RCU_SHT_base_less();
         void split_st_RCU_SHT_base_cmpmix();
         void split_st_RCU_SHT_base_cmp();
         void split_st_RCU_SHT_base_less();
         void split_st_RCU_SHT_base_cmpmix();
+        void split_st_RCU_SHT_base_cmpmix_stat();
         void split_st_RCU_SHT_member_cmp();
         void split_st_RCU_SHT_member_less();
         void split_st_RCU_SHT_member_cmpmix();
         void split_st_RCU_SHT_member_cmp();
         void split_st_RCU_SHT_member_less();
         void split_st_RCU_SHT_member_cmpmix();
+        void split_st_RCU_SHT_member_cmpmix_stat();
 
         void split_dyn_nogc_base_cmp();
         void split_dyn_nogc_base_less();
 
         void split_dyn_nogc_base_cmp();
         void split_dyn_nogc_base_less();
@@ -1324,15 +1340,19 @@ namespace set {
         void split_dyn_RCU_GPI_base_cmp_lazy();
         void split_dyn_RCU_GPI_base_less_lazy();
         void split_dyn_RCU_GPI_base_cmpmix_lazy();
         void split_dyn_RCU_GPI_base_cmp_lazy();
         void split_dyn_RCU_GPI_base_less_lazy();
         void split_dyn_RCU_GPI_base_cmpmix_lazy();
+        void split_dyn_RCU_GPI_base_cmpmix_stat_lazy();
         void split_dyn_RCU_GPI_member_cmp_lazy();
         void split_dyn_RCU_GPI_member_less_lazy();
         void split_dyn_RCU_GPI_member_cmpmix_lazy();
         void split_dyn_RCU_GPI_member_cmp_lazy();
         void split_dyn_RCU_GPI_member_less_lazy();
         void split_dyn_RCU_GPI_member_cmpmix_lazy();
+        void split_dyn_RCU_GPI_member_cmpmix_stat_lazy();
         void split_st_RCU_GPI_base_cmp_lazy();
         void split_st_RCU_GPI_base_less_lazy();
         void split_st_RCU_GPI_base_cmpmix_lazy();
         void split_st_RCU_GPI_base_cmp_lazy();
         void split_st_RCU_GPI_base_less_lazy();
         void split_st_RCU_GPI_base_cmpmix_lazy();
+        void split_st_RCU_GPI_base_cmpmix_stat_lazy();
         void split_st_RCU_GPI_member_cmp_lazy();
         void split_st_RCU_GPI_member_less_lazy();
         void split_st_RCU_GPI_member_cmpmix_lazy();
         void split_st_RCU_GPI_member_cmp_lazy();
         void split_st_RCU_GPI_member_less_lazy();
         void split_st_RCU_GPI_member_cmpmix_lazy();
+        void split_st_RCU_GPI_member_cmpmix_stat_lazy();
 
         void split_dyn_RCU_GPB_base_cmp_lazy();
         void split_dyn_RCU_GPB_base_less_lazy();
 
         void split_dyn_RCU_GPB_base_cmp_lazy();
         void split_dyn_RCU_GPB_base_less_lazy();
@@ -1354,41 +1374,53 @@ namespace set {
         void split_dyn_RCU_GPT_base_cmp_lazy();
         void split_dyn_RCU_GPT_base_less_lazy();
         void split_dyn_RCU_GPT_base_cmpmix_lazy();
         void split_dyn_RCU_GPT_base_cmp_lazy();
         void split_dyn_RCU_GPT_base_less_lazy();
         void split_dyn_RCU_GPT_base_cmpmix_lazy();
+        void split_dyn_RCU_GPT_base_cmpmix_stat_lazy();
         void split_dyn_RCU_GPT_member_cmp_lazy();
         void split_dyn_RCU_GPT_member_less_lazy();
         void split_dyn_RCU_GPT_member_cmpmix_lazy();
         void split_dyn_RCU_GPT_member_cmp_lazy();
         void split_dyn_RCU_GPT_member_less_lazy();
         void split_dyn_RCU_GPT_member_cmpmix_lazy();
+        void split_dyn_RCU_GPT_member_cmpmix_stat_lazy();
         void split_st_RCU_GPT_base_cmp_lazy();
         void split_st_RCU_GPT_base_less_lazy();
         void split_st_RCU_GPT_base_cmpmix_lazy();
         void split_st_RCU_GPT_base_cmp_lazy();
         void split_st_RCU_GPT_base_less_lazy();
         void split_st_RCU_GPT_base_cmpmix_lazy();
+        void split_st_RCU_GPT_base_cmpmix_stat_lazy();
         void split_st_RCU_GPT_member_cmp_lazy();
         void split_st_RCU_GPT_member_less_lazy();
         void split_st_RCU_GPT_member_cmpmix_lazy();
         void split_st_RCU_GPT_member_cmp_lazy();
         void split_st_RCU_GPT_member_less_lazy();
         void split_st_RCU_GPT_member_cmpmix_lazy();
+        void split_st_RCU_GPT_member_cmpmix_stat_lazy();
 
         void split_dyn_RCU_SHB_base_cmp_lazy();
         void split_dyn_RCU_SHB_base_less_lazy();
         void split_dyn_RCU_SHB_base_cmpmix_lazy();
 
         void split_dyn_RCU_SHB_base_cmp_lazy();
         void split_dyn_RCU_SHB_base_less_lazy();
         void split_dyn_RCU_SHB_base_cmpmix_lazy();
+        void split_dyn_RCU_SHB_base_cmpmix_stat_lazy();
         void split_dyn_RCU_SHB_member_cmp_lazy();
         void split_dyn_RCU_SHB_member_less_lazy();
         void split_dyn_RCU_SHB_member_cmpmix_lazy();
         void split_dyn_RCU_SHB_member_cmp_lazy();
         void split_dyn_RCU_SHB_member_less_lazy();
         void split_dyn_RCU_SHB_member_cmpmix_lazy();
+        void split_dyn_RCU_SHB_member_cmpmix_stat_lazy();
         void split_st_RCU_SHB_base_cmp_lazy();
         void split_st_RCU_SHB_base_less_lazy();
         void split_st_RCU_SHB_base_cmpmix_lazy();
         void split_st_RCU_SHB_base_cmp_lazy();
         void split_st_RCU_SHB_base_less_lazy();
         void split_st_RCU_SHB_base_cmpmix_lazy();
+        void split_st_RCU_SHB_base_cmpmix_stat_lazy();
         void split_st_RCU_SHB_member_cmp_lazy();
         void split_st_RCU_SHB_member_less_lazy();
         void split_st_RCU_SHB_member_cmpmix_lazy();
         void split_st_RCU_SHB_member_cmp_lazy();
         void split_st_RCU_SHB_member_less_lazy();
         void split_st_RCU_SHB_member_cmpmix_lazy();
+        void split_st_RCU_SHB_member_cmpmix_stat_lazy();
 
         void split_dyn_RCU_SHT_base_cmp_lazy();
         void split_dyn_RCU_SHT_base_less_lazy();
         void split_dyn_RCU_SHT_base_cmpmix_lazy();
 
         void split_dyn_RCU_SHT_base_cmp_lazy();
         void split_dyn_RCU_SHT_base_less_lazy();
         void split_dyn_RCU_SHT_base_cmpmix_lazy();
+        void split_dyn_RCU_SHT_base_cmpmix_stat_lazy();
         void split_dyn_RCU_SHT_member_cmp_lazy();
         void split_dyn_RCU_SHT_member_less_lazy();
         void split_dyn_RCU_SHT_member_cmpmix_lazy();
         void split_dyn_RCU_SHT_member_cmp_lazy();
         void split_dyn_RCU_SHT_member_less_lazy();
         void split_dyn_RCU_SHT_member_cmpmix_lazy();
+        void split_dyn_RCU_SHT_member_cmpmix_stat_lazy();
         void split_st_RCU_SHT_base_cmp_lazy();
         void split_st_RCU_SHT_base_less_lazy();
         void split_st_RCU_SHT_base_cmpmix_lazy();
         void split_st_RCU_SHT_base_cmp_lazy();
         void split_st_RCU_SHT_base_less_lazy();
         void split_st_RCU_SHT_base_cmpmix_lazy();
+        void split_st_RCU_SHT_base_cmpmix_stat_lazy();
         void split_st_RCU_SHT_member_cmp_lazy();
         void split_st_RCU_SHT_member_less_lazy();
         void split_st_RCU_SHT_member_cmpmix_lazy();
         void split_st_RCU_SHT_member_cmp_lazy();
         void split_st_RCU_SHT_member_less_lazy();
         void split_st_RCU_SHT_member_cmpmix_lazy();
+        void split_st_RCU_SHT_member_cmpmix_stat_lazy();
 
         void split_dyn_nogc_base_cmp_lazy();
         void split_dyn_nogc_base_less_lazy();
 
         void split_dyn_nogc_base_cmp_lazy();
         void split_dyn_nogc_base_less_lazy();
@@ -1557,15 +1589,19 @@ namespace set {
             CPPUNIT_TEST(split_dyn_RCU_GPI_base_cmp)
             CPPUNIT_TEST(split_dyn_RCU_GPI_base_less)
             CPPUNIT_TEST(split_dyn_RCU_GPI_base_cmpmix)
             CPPUNIT_TEST(split_dyn_RCU_GPI_base_cmp)
             CPPUNIT_TEST(split_dyn_RCU_GPI_base_less)
             CPPUNIT_TEST(split_dyn_RCU_GPI_base_cmpmix)
-            CPPUNIT_TEST(split_dyn_RCU_GPI_member_cmp)
+            CPPUNIT_TEST( split_dyn_RCU_GPI_base_cmpmix_stat )
+            CPPUNIT_TEST( split_dyn_RCU_GPI_member_cmp )
             CPPUNIT_TEST(split_dyn_RCU_GPI_member_less)
             CPPUNIT_TEST(split_dyn_RCU_GPI_member_cmpmix)
             CPPUNIT_TEST(split_dyn_RCU_GPI_member_less)
             CPPUNIT_TEST(split_dyn_RCU_GPI_member_cmpmix)
-            CPPUNIT_TEST(split_st_RCU_GPI_base_cmp)
+            CPPUNIT_TEST( split_dyn_RCU_GPI_member_cmpmix_stat )
+            CPPUNIT_TEST( split_st_RCU_GPI_base_cmp )
             CPPUNIT_TEST(split_st_RCU_GPI_base_less)
             CPPUNIT_TEST(split_st_RCU_GPI_base_cmpmix)
             CPPUNIT_TEST(split_st_RCU_GPI_base_less)
             CPPUNIT_TEST(split_st_RCU_GPI_base_cmpmix)
-            CPPUNIT_TEST(split_st_RCU_GPI_member_cmp)
+            CPPUNIT_TEST( split_st_RCU_GPI_base_cmpmix_stat )
+            CPPUNIT_TEST( split_st_RCU_GPI_member_cmp )
             CPPUNIT_TEST(split_st_RCU_GPI_member_less)
             CPPUNIT_TEST(split_st_RCU_GPI_member_cmpmix)
             CPPUNIT_TEST(split_st_RCU_GPI_member_less)
             CPPUNIT_TEST(split_st_RCU_GPI_member_cmpmix)
+            CPPUNIT_TEST( split_st_RCU_GPI_member_cmpmix_stat )
 
             CPPUNIT_TEST(split_dyn_RCU_GPB_base_cmp)
             CPPUNIT_TEST(split_dyn_RCU_GPB_base_less)
 
             CPPUNIT_TEST(split_dyn_RCU_GPB_base_cmp)
             CPPUNIT_TEST(split_dyn_RCU_GPB_base_less)
@@ -1587,41 +1623,53 @@ namespace set {
             CPPUNIT_TEST(split_dyn_RCU_GPT_base_cmp)
             CPPUNIT_TEST(split_dyn_RCU_GPT_base_less)
             CPPUNIT_TEST(split_dyn_RCU_GPT_base_cmpmix)
             CPPUNIT_TEST(split_dyn_RCU_GPT_base_cmp)
             CPPUNIT_TEST(split_dyn_RCU_GPT_base_less)
             CPPUNIT_TEST(split_dyn_RCU_GPT_base_cmpmix)
-            CPPUNIT_TEST(split_dyn_RCU_GPT_member_cmp)
+            CPPUNIT_TEST( split_dyn_RCU_GPT_base_cmpmix_stat )
+            CPPUNIT_TEST( split_dyn_RCU_GPT_member_cmp )
             CPPUNIT_TEST(split_dyn_RCU_GPT_member_less)
             CPPUNIT_TEST(split_dyn_RCU_GPT_member_cmpmix)
             CPPUNIT_TEST(split_dyn_RCU_GPT_member_less)
             CPPUNIT_TEST(split_dyn_RCU_GPT_member_cmpmix)
-            CPPUNIT_TEST(split_st_RCU_GPT_base_cmp)
+            CPPUNIT_TEST( split_dyn_RCU_GPT_member_cmpmix_stat )
+            CPPUNIT_TEST( split_st_RCU_GPT_base_cmp )
             CPPUNIT_TEST(split_st_RCU_GPT_base_less)
             CPPUNIT_TEST(split_st_RCU_GPT_base_cmpmix)
             CPPUNIT_TEST(split_st_RCU_GPT_base_less)
             CPPUNIT_TEST(split_st_RCU_GPT_base_cmpmix)
-            CPPUNIT_TEST(split_st_RCU_GPT_member_cmp)
+            CPPUNIT_TEST( split_st_RCU_GPT_base_cmpmix_stat )
+            CPPUNIT_TEST( split_st_RCU_GPT_member_cmp )
             CPPUNIT_TEST(split_st_RCU_GPT_member_less)
             CPPUNIT_TEST(split_st_RCU_GPT_member_cmpmix)
             CPPUNIT_TEST(split_st_RCU_GPT_member_less)
             CPPUNIT_TEST(split_st_RCU_GPT_member_cmpmix)
+            CPPUNIT_TEST( split_st_RCU_GPT_member_cmpmix_stat )
 
             CPPUNIT_TEST(split_dyn_RCU_SHB_base_cmp)
             CPPUNIT_TEST(split_dyn_RCU_SHB_base_less)
             CPPUNIT_TEST(split_dyn_RCU_SHB_base_cmpmix)
 
             CPPUNIT_TEST(split_dyn_RCU_SHB_base_cmp)
             CPPUNIT_TEST(split_dyn_RCU_SHB_base_less)
             CPPUNIT_TEST(split_dyn_RCU_SHB_base_cmpmix)
-            CPPUNIT_TEST(split_dyn_RCU_SHB_member_cmp)
+            CPPUNIT_TEST( split_dyn_RCU_SHB_base_cmpmix_stat )
+            CPPUNIT_TEST( split_dyn_RCU_SHB_member_cmp )
             CPPUNIT_TEST(split_dyn_RCU_SHB_member_less)
             CPPUNIT_TEST(split_dyn_RCU_SHB_member_cmpmix)
             CPPUNIT_TEST(split_dyn_RCU_SHB_member_less)
             CPPUNIT_TEST(split_dyn_RCU_SHB_member_cmpmix)
-            CPPUNIT_TEST(split_st_RCU_SHB_base_cmp)
+            CPPUNIT_TEST( split_dyn_RCU_SHB_member_cmpmix_stat )
+            CPPUNIT_TEST( split_st_RCU_SHB_base_cmp )
             CPPUNIT_TEST(split_st_RCU_SHB_base_less)
             CPPUNIT_TEST(split_st_RCU_SHB_base_cmpmix)
             CPPUNIT_TEST(split_st_RCU_SHB_base_less)
             CPPUNIT_TEST(split_st_RCU_SHB_base_cmpmix)
-            CPPUNIT_TEST(split_st_RCU_SHB_member_cmp)
+            CPPUNIT_TEST( split_st_RCU_SHB_base_cmpmix_stat )
+            CPPUNIT_TEST( split_st_RCU_SHB_member_cmp )
             CPPUNIT_TEST(split_st_RCU_SHB_member_less)
             CPPUNIT_TEST(split_st_RCU_SHB_member_cmpmix)
             CPPUNIT_TEST(split_st_RCU_SHB_member_less)
             CPPUNIT_TEST(split_st_RCU_SHB_member_cmpmix)
+            CPPUNIT_TEST( split_st_RCU_SHB_member_cmpmix_stat )
 
             CPPUNIT_TEST(split_dyn_RCU_SHT_base_cmp)
             CPPUNIT_TEST(split_dyn_RCU_SHT_base_less)
             CPPUNIT_TEST(split_dyn_RCU_SHT_base_cmpmix)
 
             CPPUNIT_TEST(split_dyn_RCU_SHT_base_cmp)
             CPPUNIT_TEST(split_dyn_RCU_SHT_base_less)
             CPPUNIT_TEST(split_dyn_RCU_SHT_base_cmpmix)
-            CPPUNIT_TEST(split_dyn_RCU_SHT_member_cmp)
+            CPPUNIT_TEST( split_dyn_RCU_SHT_base_cmpmix_stat )
+            CPPUNIT_TEST( split_dyn_RCU_SHT_member_cmp )
             CPPUNIT_TEST(split_dyn_RCU_SHT_member_less)
             CPPUNIT_TEST(split_dyn_RCU_SHT_member_cmpmix)
             CPPUNIT_TEST(split_dyn_RCU_SHT_member_less)
             CPPUNIT_TEST(split_dyn_RCU_SHT_member_cmpmix)
-            CPPUNIT_TEST(split_st_RCU_SHT_base_cmp)
+            CPPUNIT_TEST( split_dyn_RCU_SHT_member_cmpmix_stat )
+            CPPUNIT_TEST( split_st_RCU_SHT_base_cmp )
             CPPUNIT_TEST(split_st_RCU_SHT_base_less)
             CPPUNIT_TEST(split_st_RCU_SHT_base_cmpmix)
             CPPUNIT_TEST(split_st_RCU_SHT_base_less)
             CPPUNIT_TEST(split_st_RCU_SHT_base_cmpmix)
-            CPPUNIT_TEST(split_st_RCU_SHT_member_cmp)
+            CPPUNIT_TEST( split_st_RCU_SHT_base_cmpmix_stat )
+            CPPUNIT_TEST( split_st_RCU_SHT_member_cmp )
             CPPUNIT_TEST(split_st_RCU_SHT_member_less)
             CPPUNIT_TEST(split_st_RCU_SHT_member_cmpmix)
             CPPUNIT_TEST(split_st_RCU_SHT_member_less)
             CPPUNIT_TEST(split_st_RCU_SHT_member_cmpmix)
+            CPPUNIT_TEST( split_st_RCU_SHT_member_cmpmix_stat )
 
             CPPUNIT_TEST(split_dyn_nogc_base_cmp)
             CPPUNIT_TEST(split_dyn_nogc_base_less)
 
             CPPUNIT_TEST(split_dyn_nogc_base_cmp)
             CPPUNIT_TEST(split_dyn_nogc_base_less)
@@ -1677,15 +1725,19 @@ namespace set {
             CPPUNIT_TEST(split_dyn_RCU_GPI_base_cmp_lazy)
             CPPUNIT_TEST(split_dyn_RCU_GPI_base_less_lazy)
             CPPUNIT_TEST(split_dyn_RCU_GPI_base_cmpmix_lazy)
             CPPUNIT_TEST(split_dyn_RCU_GPI_base_cmp_lazy)
             CPPUNIT_TEST(split_dyn_RCU_GPI_base_less_lazy)
             CPPUNIT_TEST(split_dyn_RCU_GPI_base_cmpmix_lazy)
-            CPPUNIT_TEST(split_dyn_RCU_GPI_member_cmp_lazy)
+            CPPUNIT_TEST( split_dyn_RCU_GPI_base_cmpmix_stat_lazy )
+            CPPUNIT_TEST( split_dyn_RCU_GPI_member_cmp_lazy )
             CPPUNIT_TEST(split_dyn_RCU_GPI_member_less_lazy)
             CPPUNIT_TEST(split_dyn_RCU_GPI_member_cmpmix_lazy)
             CPPUNIT_TEST(split_dyn_RCU_GPI_member_less_lazy)
             CPPUNIT_TEST(split_dyn_RCU_GPI_member_cmpmix_lazy)
-            CPPUNIT_TEST(split_st_RCU_GPI_base_cmp_lazy)
+            CPPUNIT_TEST( split_dyn_RCU_GPI_member_cmpmix_stat_lazy )
+            CPPUNIT_TEST( split_st_RCU_GPI_base_cmp_lazy )
             CPPUNIT_TEST(split_st_RCU_GPI_base_less_lazy)
             CPPUNIT_TEST(split_st_RCU_GPI_base_cmpmix_lazy)
             CPPUNIT_TEST(split_st_RCU_GPI_base_less_lazy)
             CPPUNIT_TEST(split_st_RCU_GPI_base_cmpmix_lazy)
-            CPPUNIT_TEST(split_st_RCU_GPI_member_cmp_lazy)
+            CPPUNIT_TEST( split_st_RCU_GPI_base_cmpmix_stat_lazy )
+            CPPUNIT_TEST( split_st_RCU_GPI_member_cmp_lazy )
             CPPUNIT_TEST(split_st_RCU_GPI_member_less_lazy)
             CPPUNIT_TEST(split_st_RCU_GPI_member_cmpmix_lazy)
             CPPUNIT_TEST(split_st_RCU_GPI_member_less_lazy)
             CPPUNIT_TEST(split_st_RCU_GPI_member_cmpmix_lazy)
+            CPPUNIT_TEST( split_st_RCU_GPI_member_cmpmix_stat_lazy )
 
             CPPUNIT_TEST(split_dyn_RCU_GPB_base_cmp_lazy)
             CPPUNIT_TEST(split_dyn_RCU_GPB_base_less_lazy)
 
             CPPUNIT_TEST(split_dyn_RCU_GPB_base_cmp_lazy)
             CPPUNIT_TEST(split_dyn_RCU_GPB_base_less_lazy)
@@ -1707,41 +1759,53 @@ namespace set {
             CPPUNIT_TEST(split_dyn_RCU_GPT_base_cmp_lazy)
             CPPUNIT_TEST(split_dyn_RCU_GPT_base_less_lazy)
             CPPUNIT_TEST(split_dyn_RCU_GPT_base_cmpmix_lazy)
             CPPUNIT_TEST(split_dyn_RCU_GPT_base_cmp_lazy)
             CPPUNIT_TEST(split_dyn_RCU_GPT_base_less_lazy)
             CPPUNIT_TEST(split_dyn_RCU_GPT_base_cmpmix_lazy)
-            CPPUNIT_TEST(split_dyn_RCU_GPT_member_cmp_lazy)
+            CPPUNIT_TEST( split_dyn_RCU_GPT_base_cmpmix_stat_lazy )
+            CPPUNIT_TEST( split_dyn_RCU_GPT_member_cmp_lazy )
             CPPUNIT_TEST(split_dyn_RCU_GPT_member_less_lazy)
             CPPUNIT_TEST(split_dyn_RCU_GPT_member_cmpmix_lazy)
             CPPUNIT_TEST(split_dyn_RCU_GPT_member_less_lazy)
             CPPUNIT_TEST(split_dyn_RCU_GPT_member_cmpmix_lazy)
-            CPPUNIT_TEST(split_st_RCU_GPT_base_cmp_lazy)
+            CPPUNIT_TEST( split_dyn_RCU_GPT_member_cmpmix_stat_lazy )
+            CPPUNIT_TEST( split_st_RCU_GPT_base_cmp_lazy )
             CPPUNIT_TEST(split_st_RCU_GPT_base_less_lazy)
             CPPUNIT_TEST(split_st_RCU_GPT_base_cmpmix_lazy)
             CPPUNIT_TEST(split_st_RCU_GPT_base_less_lazy)
             CPPUNIT_TEST(split_st_RCU_GPT_base_cmpmix_lazy)
-            CPPUNIT_TEST(split_st_RCU_GPT_member_cmp_lazy)
+            CPPUNIT_TEST( split_st_RCU_GPT_base_cmpmix_stat_lazy )
+            CPPUNIT_TEST( split_st_RCU_GPT_member_cmp_lazy )
             CPPUNIT_TEST(split_st_RCU_GPT_member_less_lazy)
             CPPUNIT_TEST(split_st_RCU_GPT_member_cmpmix_lazy)
             CPPUNIT_TEST(split_st_RCU_GPT_member_less_lazy)
             CPPUNIT_TEST(split_st_RCU_GPT_member_cmpmix_lazy)
+            CPPUNIT_TEST( split_st_RCU_GPT_member_cmpmix_stat_lazy )
 
             CPPUNIT_TEST(split_dyn_RCU_SHB_base_cmp_lazy)
             CPPUNIT_TEST(split_dyn_RCU_SHB_base_less_lazy)
             CPPUNIT_TEST(split_dyn_RCU_SHB_base_cmpmix_lazy)
 
             CPPUNIT_TEST(split_dyn_RCU_SHB_base_cmp_lazy)
             CPPUNIT_TEST(split_dyn_RCU_SHB_base_less_lazy)
             CPPUNIT_TEST(split_dyn_RCU_SHB_base_cmpmix_lazy)
-            CPPUNIT_TEST(split_dyn_RCU_SHB_member_cmp_lazy)
+            CPPUNIT_TEST( split_dyn_RCU_SHB_base_cmpmix_stat_lazy )
+            CPPUNIT_TEST( split_dyn_RCU_SHB_member_cmp_lazy )
             CPPUNIT_TEST(split_dyn_RCU_SHB_member_less_lazy)
             CPPUNIT_TEST(split_dyn_RCU_SHB_member_cmpmix_lazy)
             CPPUNIT_TEST(split_dyn_RCU_SHB_member_less_lazy)
             CPPUNIT_TEST(split_dyn_RCU_SHB_member_cmpmix_lazy)
-            CPPUNIT_TEST(split_st_RCU_SHB_base_cmp_lazy)
+            CPPUNIT_TEST( split_dyn_RCU_SHB_member_cmpmix_stat_lazy )
+            CPPUNIT_TEST( split_st_RCU_SHB_base_cmp_lazy )
             CPPUNIT_TEST(split_st_RCU_SHB_base_less_lazy)
             CPPUNIT_TEST(split_st_RCU_SHB_base_cmpmix_lazy)
             CPPUNIT_TEST(split_st_RCU_SHB_base_less_lazy)
             CPPUNIT_TEST(split_st_RCU_SHB_base_cmpmix_lazy)
-            CPPUNIT_TEST(split_st_RCU_SHB_member_cmp_lazy)
+            CPPUNIT_TEST( split_st_RCU_SHB_base_cmpmix_stat_lazy )
+            CPPUNIT_TEST( split_st_RCU_SHB_member_cmp_lazy )
             CPPUNIT_TEST(split_st_RCU_SHB_member_less_lazy)
             CPPUNIT_TEST(split_st_RCU_SHB_member_cmpmix_lazy)
             CPPUNIT_TEST(split_st_RCU_SHB_member_less_lazy)
             CPPUNIT_TEST(split_st_RCU_SHB_member_cmpmix_lazy)
+            CPPUNIT_TEST( split_st_RCU_SHB_member_cmpmix_stat_lazy )
 
             CPPUNIT_TEST(split_dyn_RCU_SHT_base_cmp_lazy)
             CPPUNIT_TEST(split_dyn_RCU_SHT_base_less_lazy)
             CPPUNIT_TEST(split_dyn_RCU_SHT_base_cmpmix_lazy)
 
             CPPUNIT_TEST(split_dyn_RCU_SHT_base_cmp_lazy)
             CPPUNIT_TEST(split_dyn_RCU_SHT_base_less_lazy)
             CPPUNIT_TEST(split_dyn_RCU_SHT_base_cmpmix_lazy)
-            CPPUNIT_TEST(split_dyn_RCU_SHT_member_cmp_lazy)
+            CPPUNIT_TEST( split_dyn_RCU_SHT_base_cmpmix_stat_lazy )
+            CPPUNIT_TEST( split_dyn_RCU_SHT_member_cmp_lazy )
             CPPUNIT_TEST(split_dyn_RCU_SHT_member_less_lazy)
             CPPUNIT_TEST(split_dyn_RCU_SHT_member_cmpmix_lazy)
             CPPUNIT_TEST(split_dyn_RCU_SHT_member_less_lazy)
             CPPUNIT_TEST(split_dyn_RCU_SHT_member_cmpmix_lazy)
-            CPPUNIT_TEST(split_st_RCU_SHT_base_cmp_lazy)
+            CPPUNIT_TEST( split_dyn_RCU_SHT_member_cmpmix_stat_lazy )
+            CPPUNIT_TEST( split_st_RCU_SHT_base_cmp_lazy )
             CPPUNIT_TEST(split_st_RCU_SHT_base_less_lazy)
             CPPUNIT_TEST(split_st_RCU_SHT_base_cmpmix_lazy)
             CPPUNIT_TEST(split_st_RCU_SHT_base_less_lazy)
             CPPUNIT_TEST(split_st_RCU_SHT_base_cmpmix_lazy)
-            CPPUNIT_TEST(split_st_RCU_SHT_member_cmp_lazy)
+            CPPUNIT_TEST( split_st_RCU_SHT_base_cmpmix_stat_lazy )
+            CPPUNIT_TEST( split_st_RCU_SHT_member_cmp_lazy )
             CPPUNIT_TEST(split_st_RCU_SHT_member_less_lazy)
             CPPUNIT_TEST(split_st_RCU_SHT_member_cmpmix_lazy)
             CPPUNIT_TEST(split_st_RCU_SHT_member_less_lazy)
             CPPUNIT_TEST(split_st_RCU_SHT_member_cmpmix_lazy)
+            CPPUNIT_TEST( split_st_RCU_SHT_member_cmpmix_stat_lazy )
 
             CPPUNIT_TEST(split_dyn_nogc_base_cmp_lazy)
             CPPUNIT_TEST(split_dyn_nogc_base_less_lazy)
 
             CPPUNIT_TEST(split_dyn_nogc_base_cmp_lazy)
             CPPUNIT_TEST(split_dyn_nogc_base_less_lazy)
@@ -1759,7 +1823,6 @@ namespace set {
             CPPUNIT_TEST(split_st_nogc_member_less_lazy)
             CPPUNIT_TEST(split_st_nogc_member_cmpmix_lazy)
             CPPUNIT_TEST( split_st_nogc_member_cmpmix_stat_lazy )
             CPPUNIT_TEST(split_st_nogc_member_less_lazy)
             CPPUNIT_TEST(split_st_nogc_member_cmpmix_lazy)
             CPPUNIT_TEST( split_st_nogc_member_cmpmix_stat_lazy )
-
         CPPUNIT_TEST_SUITE_END()
 
     };
         CPPUNIT_TEST_SUITE_END()
 
     };
index 25a46ea5e119d7c84e09130362465ebc0acdb20a..5dcb67c46d0094272c3615c792e79dd1e85d0505 100644 (file)
@@ -13,23 +13,23 @@ namespace set {
     void IntrusiveHashSetHdrTest::split_dyn_RCU_GPB_base_cmp()
     {
         typedef base_int_item< ci::split_list::node< ci::michael_list::node<rcu_type> > > item;
     void IntrusiveHashSetHdrTest::split_dyn_RCU_GPB_base_cmp()
     {
         typedef base_int_item< ci::split_list::node< ci::michael_list::node<rcu_type> > > item;
-        typedef ci::MichaelList< rcu_type
-            ,item
-            ,ci::michael_list::make_traits<
-                ci::opt::hook< ci::michael_list::base_hook< co::gc<rcu_type> > >
-                ,co::compare< cmp<item> >
-                ,ci::opt::disposer< faked_disposer >
-            >::type
-        >    ord_list;
-
-        typedef ci::SplitListSet< rcu_type, ord_list,
-            ci::split_list::make_traits<
-                co::hash< hash_int >
-                ,ci::split_list::dynamic_bucket_table<true>
-                ,co::memory_model<co::v::relaxed_ordering>
-            >::type
+        typedef ci::MichaelList < rcu_type
+            , item
+            , ci::michael_list::make_traits <
+            ci::opt::hook< ci::michael_list::base_hook< co::gc<rcu_type> > >
+            co::compare< cmp<item> >
+            , ci::opt::disposer < faked_disposer >
+            > ::type
+        > ord_list;
+
+        typedef ci::SplitListSet < rcu_type, ord_list,
+            ci::split_list::make_traits <
+            co::hash< hash_int >
+            ci::split_list::dynamic_bucket_table<true>
+            , co::memory_model < co::v::relaxed_ordering >
+            > ::type
         > set;
         > set;
-        static_assert( set::options::dynamic_bucket_table, "Set has static bucket table" );
+        static_assert(set::traits::dynamic_bucket_table, "Set has static bucket table");
 
         test_rcu_int<set>();
     }
 
         test_rcu_int<set>();
     }
@@ -37,22 +37,22 @@ namespace set {
     void IntrusiveHashSetHdrTest::split_dyn_RCU_GPB_base_less()
     {
         typedef base_int_item< ci::split_list::node< ci::michael_list::node<rcu_type> > > item;
     void IntrusiveHashSetHdrTest::split_dyn_RCU_GPB_base_less()
     {
         typedef base_int_item< ci::split_list::node< ci::michael_list::node<rcu_type> > > item;
-        typedef ci::MichaelList< rcu_type
-            ,item
-            ,ci::michael_list::make_traits<
-                ci::opt::hook< ci::michael_list::base_hook< co::gc<rcu_type> > >
-                ,co::less< less<item> >
-                ,ci::opt::disposer< faked_disposer >
-            >::type
-        >    ord_list;
-
-        typedef ci::SplitListSet< rcu_type, ord_list,
-            ci::split_list::make_traits<
-                co::hash< hash_int >
-                ,co::memory_model<co::v::sequential_consistent>
-            >::type
+        typedef ci::MichaelList < rcu_type
+            , item
+            , ci::michael_list::make_traits <
+            ci::opt::hook< ci::michael_list::base_hook< co::gc<rcu_type> > >
+            co::less< less<item> >
+            , ci::opt::disposer < faked_disposer >
+            > ::type
+        > ord_list;
+
+        typedef ci::SplitListSet < rcu_type, ord_list,
+            ci::split_list::make_traits <
+            co::hash< hash_int >
+            , co::memory_model < co::v::sequential_consistent >
+            > ::type
         > set;
         > set;
-        static_assert( set::options::dynamic_bucket_table, "Set has static bucket table" );
+        static_assert(set::traits::dynamic_bucket_table, "Set has static bucket table");
 
         test_rcu_int<set>();
     }
 
         test_rcu_int<set>();
     }
@@ -60,24 +60,49 @@ namespace set {
     void IntrusiveHashSetHdrTest::split_dyn_RCU_GPB_base_cmpmix()
     {
         typedef base_int_item< ci::split_list::node<ci::michael_list::node<rcu_type> > > item;
     void IntrusiveHashSetHdrTest::split_dyn_RCU_GPB_base_cmpmix()
     {
         typedef base_int_item< ci::split_list::node<ci::michael_list::node<rcu_type> > > item;
-        typedef ci::MichaelList< rcu_type
-            ,item
-            ,ci::michael_list::make_traits<
-                ci::opt::hook< ci::michael_list::base_hook< co::gc<rcu_type> > >
-                ,co::less< less<item> >
-                ,co::compare< cmp<item> >
-                ,ci::opt::disposer< faked_disposer >
-            >::type
-        >    ord_list;
-
-        typedef ci::SplitListSet< rcu_type, ord_list,
-            ci::split_list::make_traits<
-                co::hash< hash_int >
-                ,co::item_counter< simple_item_counter >
-                ,ci::split_list::dynamic_bucket_table<true>
-            >::type
+        typedef ci::MichaelList < rcu_type
+            , item
+            , ci::michael_list::make_traits <
+            ci::opt::hook< ci::michael_list::base_hook< co::gc<rcu_type> > >
+            co::less< less<item> >
+            co::compare< cmp<item> >
+            , ci::opt::disposer < faked_disposer >
+            > ::type
+        > ord_list;
+
+        typedef ci::SplitListSet < rcu_type, ord_list,
+            ci::split_list::make_traits <
+            co::hash< hash_int >
+            co::item_counter< simple_item_counter >
+            , ci::split_list::dynamic_bucket_table < true >
+            > ::type
         > set;
         > set;
-        static_assert( set::options::dynamic_bucket_table, "Set has static bucket table" );
+        static_assert(set::traits::dynamic_bucket_table, "Set has static bucket table");
+
+        test_rcu_int<set>();
+    }
+
+    void IntrusiveHashSetHdrTest::split_dyn_RCU_GPB_base_cmpmix_stat()
+    {
+        typedef base_int_item< ci::split_list::node<ci::michael_list::node<rcu_type> > > item;
+        struct list_traits : public ci::michael_list::traits
+        {
+            typedef ci::michael_list::base_hook< co::gc<rcu_type> > hook;
+            typedef IntrusiveHashSetHdrTest::less<item> less;
+            typedef cmp<item> compare;
+            typedef faked_disposer disposer;
+        };
+        typedef ci::MichaelList< rcu_type, item, list_traits > ord_list;
+
+        struct set_traits : public ci::split_list::make_traits<ci::split_list::dynamic_bucket_table<true> >::type
+        {
+            typedef hash_int hash;
+            typedef simple_item_counter item_counter;
+            typedef ci::split_list::stat<> stat;
+        };
+        typedef ci::SplitListSet< rcu_type, ord_list, set_traits > set;
+
+        static_assert(set::traits::dynamic_bucket_table, "Set has static bucket table");
 
         test_rcu_int<set>();
     }
 
         test_rcu_int<set>();
     }
@@ -85,24 +110,24 @@ namespace set {
     void IntrusiveHashSetHdrTest::split_dyn_RCU_GPB_member_cmp()
     {
         typedef member_int_item< ci::split_list::node< ci::michael_list::node<rcu_type> > > item;
     void IntrusiveHashSetHdrTest::split_dyn_RCU_GPB_member_cmp()
     {
         typedef member_int_item< ci::split_list::node< ci::michael_list::node<rcu_type> > > item;
-        typedef ci::MichaelList< rcu_type
-            ,item
-            ,ci::michael_list::make_traits<
-                ci::opt::hook< ci::michael_list::member_hook<
-                    offsetof( item, hMember ),
-                    co::gc<rcu_type>
-                > >
-                ,co::compare< cmp<item> >
-                ,ci::opt::disposer< faked_disposer >
-            >::type
-        >    ord_list;
-
-        typedef ci::SplitListSet< rcu_type, ord_list,
-            ci::split_list::make_traits<
-                co::hash< hash_int >
-            >::type
+        typedef ci::MichaelList < rcu_type
+            , item
+            , ci::michael_list::make_traits <
+            ci::opt::hook< ci::michael_list::member_hook <
+            offsetof( item, hMember ),
+            co::gc<rcu_type>
+            > >
+            co::compare< cmp<item> >
+            , ci::opt::disposer < faked_disposer >
+            > ::type
+        > ord_list;
+
+        typedef ci::SplitListSet < rcu_type, ord_list,
+            ci::split_list::make_traits <
+            co::hash < hash_int >
+            > ::type
         > set;
         > set;
-        static_assert( set::options::dynamic_bucket_table, "Set has static bucket table" );
+        static_assert(set::traits::dynamic_bucket_table, "Set has static bucket table");
 
         test_rcu_int<set>();
     }
 
         test_rcu_int<set>();
     }
@@ -110,25 +135,25 @@ namespace set {
     void IntrusiveHashSetHdrTest::split_dyn_RCU_GPB_member_less()
     {
         typedef member_int_item< ci::split_list::node< ci::michael_list::node<rcu_type> > > item;
     void IntrusiveHashSetHdrTest::split_dyn_RCU_GPB_member_less()
     {
         typedef member_int_item< ci::split_list::node< ci::michael_list::node<rcu_type> > > item;
-        typedef ci::MichaelList< rcu_type
-            ,item
-            ,ci::michael_list::make_traits<
-                ci::opt::hook< ci::michael_list::member_hook<
-                    offsetof( item, hMember ),
-                    co::gc<rcu_type>
-                > >
-                ,co::less< less<item> >
-                ,ci::opt::disposer< faked_disposer >
-            >::type
-        >    ord_list;
-
-        typedef ci::SplitListSet< rcu_type, ord_list,
-            ci::split_list::make_traits<
-                co::hash< hash_int >
-                ,co::memory_model<co::v::relaxed_ordering>
-            >::type
+        typedef ci::MichaelList < rcu_type
+            , item
+            , ci::michael_list::make_traits <
+            ci::opt::hook< ci::michael_list::member_hook <
+            offsetof( item, hMember ),
+            co::gc<rcu_type>
+            > >
+            co::less< less<item> >
+            , ci::opt::disposer < faked_disposer >
+            > ::type
+        > ord_list;
+
+        typedef ci::SplitListSet < rcu_type, ord_list,
+            ci::split_list::make_traits <
+            co::hash< hash_int >
+            , co::memory_model < co::v::relaxed_ordering >
+            > ::type
         > set;
         > set;
-        static_assert( set::options::dynamic_bucket_table, "Set has static bucket table" );
+        static_assert(set::traits::dynamic_bucket_table, "Set has static bucket table");
 
         test_rcu_int<set>();
     }
 
         test_rcu_int<set>();
     }
@@ -136,53 +161,82 @@ namespace set {
     void IntrusiveHashSetHdrTest::split_dyn_RCU_GPB_member_cmpmix()
     {
         typedef member_int_item< ci::split_list::node< ci::michael_list::node<rcu_type> > > item;
     void IntrusiveHashSetHdrTest::split_dyn_RCU_GPB_member_cmpmix()
     {
         typedef member_int_item< ci::split_list::node< ci::michael_list::node<rcu_type> > > item;
-        typedef ci::MichaelList< rcu_type
-            ,item
-            ,ci::michael_list::make_traits<
-                ci::opt::hook< ci::michael_list::member_hook<
-                    offsetof( item, hMember ),
-                    co::gc<rcu_type>
-                > >
-                ,co::compare< cmp<item> >
-                ,co::less< less<item> >
-                ,ci::opt::disposer< faked_disposer >
-            >::type
-        >    ord_list;
-
-        typedef ci::SplitListSet< rcu_type, ord_list,
-            ci::split_list::make_traits<
-                co::hash< hash_int >
-                ,co::item_counter< simple_item_counter >
-                ,co::memory_model<co::v::sequential_consistent>
-            >::type
+        typedef ci::MichaelList < rcu_type
+            , item
+            , ci::michael_list::make_traits <
+            ci::opt::hook< ci::michael_list::member_hook <
+            offsetof( item, hMember ),
+            co::gc<rcu_type>
+            > >
+            co::compare< cmp<item> >
+            co::less< less<item> >
+            , ci::opt::disposer < faked_disposer >
+            > ::type
+        > ord_list;
+
+        typedef ci::SplitListSet < rcu_type, ord_list,
+            ci::split_list::make_traits <
+            co::hash< hash_int >
+            co::item_counter< simple_item_counter >
+            , co::memory_model < co::v::sequential_consistent >
+            > ::type
         > set;
         > set;
-        static_assert( set::options::dynamic_bucket_table, "Set has static bucket table" );
+        static_assert(set::traits::dynamic_bucket_table, "Set has static bucket table");
 
         test_rcu_int<set>();
     }
 
 
         test_rcu_int<set>();
     }
 
+    void IntrusiveHashSetHdrTest::split_dyn_RCU_GPB_member_cmpmix_stat()
+    {
+        typedef member_int_item< ci::split_list::node< ci::michael_list::node<rcu_type> > > item;
+        struct list_traits :
+            public ci::michael_list::make_traits <
+            ci::opt::hook< ci::michael_list::member_hook <
+            offsetof( item, hMember ),
+            co::gc<rcu_type>
+            > >
+            , co::compare< cmp<item> >
+            , co::less< less<item> >
+            , ci::opt::disposer < faked_disposer >
+            > ::type
+        {};
+        typedef ci::MichaelList< rcu_type, item, list_traits > ord_list;
+
+        struct set_traits :
+            public ci::split_list::make_traits <
+            co::hash< hash_int >
+            , co::item_counter< simple_item_counter >
+            , co::memory_model<co::v::sequential_consistent>
+            , co::stat < ci::split_list::stat<> >
+            > ::type
+        {};
+        typedef ci::SplitListSet< rcu_type, ord_list, set_traits > set;
+        static_assert(set::traits::dynamic_bucket_table, "Set has static bucket table");
+
+        test_rcu_int<set>();
+    }
 
     // Static bucket table
     void IntrusiveHashSetHdrTest::split_st_RCU_GPB_base_cmp()
     {
         typedef base_int_item< ci::split_list::node< ci::michael_list::node<rcu_type> > > item;
 
     // Static bucket table
     void IntrusiveHashSetHdrTest::split_st_RCU_GPB_base_cmp()
     {
         typedef base_int_item< ci::split_list::node< ci::michael_list::node<rcu_type> > > item;
-        typedef ci::MichaelList< rcu_type
-            ,item
-            ,ci::michael_list::make_traits<
-                ci::opt::hook< ci::michael_list::base_hook< co::gc<rcu_type> > >
-                ,co::compare< cmp<item> >
-                ,ci::opt::disposer< faked_disposer >
-            >::type
-        >    ord_list;
-
-        typedef ci::SplitListSet< rcu_type, ord_list,
-            ci::split_list::make_traits<
-                co::hash< hash_int >
-                ,ci::split_list::dynamic_bucket_table<false>
-                ,co::memory_model<co::v::relaxed_ordering>
-            >::type
+        typedef ci::MichaelList < rcu_type
+            , item
+            , ci::michael_list::make_traits <
+            ci::opt::hook< ci::michael_list::base_hook< co::gc<rcu_type> > >
+            co::compare< cmp<item> >
+            , ci::opt::disposer < faked_disposer >
+            > ::type
+        > ord_list;
+
+        typedef ci::SplitListSet < rcu_type, ord_list,
+            ci::split_list::make_traits <
+            co::hash< hash_int >
+            ci::split_list::dynamic_bucket_table<false>
+            , co::memory_model < co::v::relaxed_ordering >
+            > ::type
         > set;
         > set;
-        static_assert( !set::options::dynamic_bucket_table, "Set has dynamic bucket table" );
+        static_assert(!set::traits::dynamic_bucket_table, "Set has dynamic bucket table");
 
         test_rcu_int<set>();
     }
 
         test_rcu_int<set>();
     }
@@ -190,23 +244,23 @@ namespace set {
     void IntrusiveHashSetHdrTest::split_st_RCU_GPB_base_less()
     {
         typedef base_int_item< ci::split_list::node< ci::michael_list::node<rcu_type> > > item;
     void IntrusiveHashSetHdrTest::split_st_RCU_GPB_base_less()
     {
         typedef base_int_item< ci::split_list::node< ci::michael_list::node<rcu_type> > > item;
-        typedef ci::MichaelList< rcu_type
-            ,item
-            ,ci::michael_list::make_traits<
-                ci::opt::hook< ci::michael_list::base_hook< co::gc<rcu_type> > >
-                ,co::less< less<item> >
-                ,ci::opt::disposer< faked_disposer >
-            >::type
-        >    ord_list;
-
-        typedef ci::SplitListSet< rcu_type, ord_list,
-            ci::split_list::make_traits<
-                co::hash< hash_int >
-                ,ci::split_list::dynamic_bucket_table<false>
-                ,co::memory_model<co::v::sequential_consistent>
-            >::type
+        typedef ci::MichaelList < rcu_type
+            , item
+            , ci::michael_list::make_traits <
+            ci::opt::hook< ci::michael_list::base_hook< co::gc<rcu_type> > >
+            co::less< less<item> >
+            , ci::opt::disposer < faked_disposer >
+            > ::type
+        > ord_list;
+
+        typedef ci::SplitListSet < rcu_type, ord_list,
+            ci::split_list::make_traits <
+            co::hash< hash_int >
+            ci::split_list::dynamic_bucket_table<false>
+            , co::memory_model < co::v::sequential_consistent >
+            > ::type
         > set;
         > set;
-        static_assert( !set::options::dynamic_bucket_table, "Set has dynamic bucket table" );
+        static_assert(!set::traits::dynamic_bucket_table, "Set has dynamic bucket table");
 
         test_rcu_int<set>();
     }
 
         test_rcu_int<set>();
     }
@@ -214,24 +268,50 @@ namespace set {
     void IntrusiveHashSetHdrTest::split_st_RCU_GPB_base_cmpmix()
     {
         typedef base_int_item< ci::split_list::node<ci::michael_list::node<rcu_type> > > item;
     void IntrusiveHashSetHdrTest::split_st_RCU_GPB_base_cmpmix()
     {
         typedef base_int_item< ci::split_list::node<ci::michael_list::node<rcu_type> > > item;
-        typedef ci::MichaelList< rcu_type
-            ,item
-            ,ci::michael_list::make_traits<
-                ci::opt::hook< ci::michael_list::base_hook< co::gc<rcu_type> > >
-                ,co::less< less<item> >
-                ,co::compare< cmp<item> >
-                ,ci::opt::disposer< faked_disposer >
-            >::type
-        >    ord_list;
-
-        typedef ci::SplitListSet< rcu_type, ord_list,
-            ci::split_list::make_traits<
-                co::hash< hash_int >
-                ,co::item_counter< simple_item_counter >
-                ,ci::split_list::dynamic_bucket_table<false>
-            >::type
+        typedef ci::MichaelList < rcu_type
+            , item
+            , ci::michael_list::make_traits <
+            ci::opt::hook< ci::michael_list::base_hook< co::gc<rcu_type> > >
+            co::less< less<item> >
+            co::compare< cmp<item> >
+            , ci::opt::disposer < faked_disposer >
+            > ::type
+        > ord_list;
+
+        typedef ci::SplitListSet < rcu_type, ord_list,
+            ci::split_list::make_traits <
+            co::hash< hash_int >
+            co::item_counter< simple_item_counter >
+            , ci::split_list::dynamic_bucket_table < false >
+            > ::type
         > set;
         > set;
-        static_assert( !set::options::dynamic_bucket_table, "Set has dynamic bucket table" );
+        static_assert(!set::traits::dynamic_bucket_table, "Set has dynamic bucket table");
+
+        test_rcu_int<set>();
+    }
+
+    void IntrusiveHashSetHdrTest::split_st_RCU_GPB_base_cmpmix_stat()
+    {
+        typedef base_int_item< ci::split_list::node<ci::michael_list::node<rcu_type> > > item;
+        typedef ci::MichaelList < rcu_type
+            , item
+            , ci::michael_list::make_traits <
+            ci::opt::hook< ci::michael_list::base_hook< co::gc<rcu_type> > >
+            , co::less< less<item> >
+            , co::compare< cmp<item> >
+            , ci::opt::disposer < faked_disposer >
+            > ::type
+        > ord_list;
+
+        typedef ci::SplitListSet < rcu_type, ord_list,
+            ci::split_list::make_traits <
+            co::hash< hash_int >
+            , co::item_counter< simple_item_counter >
+            , ci::split_list::dynamic_bucket_table<false>
+            , co::stat < ci::split_list::stat<> >
+            > ::type
+        > set;
+        static_assert(!set::traits::dynamic_bucket_table, "Set has dynamic bucket table");
 
         test_rcu_int<set>();
     }
 
         test_rcu_int<set>();
     }
@@ -239,26 +319,26 @@ namespace set {
     void IntrusiveHashSetHdrTest::split_st_RCU_GPB_member_cmp()
     {
         typedef member_int_item< ci::split_list::node< ci::michael_list::node<rcu_type> > > item;
     void IntrusiveHashSetHdrTest::split_st_RCU_GPB_member_cmp()
     {
         typedef member_int_item< ci::split_list::node< ci::michael_list::node<rcu_type> > > item;
-        typedef ci::MichaelList< rcu_type
-            ,item
-            ,ci::michael_list::make_traits<
-                ci::opt::hook< ci::michael_list::member_hook<
-                    offsetof( item, hMember ),
-                    co::gc<rcu_type>
-                > >
-                ,co::compare< cmp<item> >
-                ,ci::opt::disposer< faked_disposer >
-            >::type
-        >    ord_list;
-
-        typedef ci::SplitListSet< rcu_type, ord_list,
-            ci::split_list::make_traits<
-                co::hash< hash_int >
-                ,ci::split_list::dynamic_bucket_table<false>
-                ,co::memory_model<co::v::relaxed_ordering>
-            >::type
+        typedef ci::MichaelList < rcu_type
+            , item
+            , ci::michael_list::make_traits <
+            ci::opt::hook< ci::michael_list::member_hook <
+            offsetof( item, hMember ),
+            co::gc<rcu_type>
+            > >
+            co::compare< cmp<item> >
+            , ci::opt::disposer < faked_disposer >
+            > ::type
+        > ord_list;
+
+        typedef ci::SplitListSet < rcu_type, ord_list,
+            ci::split_list::make_traits <
+            co::hash< hash_int >
+            ci::split_list::dynamic_bucket_table<false>
+            , co::memory_model < co::v::relaxed_ordering >
+            > ::type
         > set;
         > set;
-        static_assert( !set::options::dynamic_bucket_table, "Set has dynamic bucket table" );
+        static_assert(!set::traits::dynamic_bucket_table, "Set has dynamic bucket table");
 
         test_rcu_int<set>();
     }
 
         test_rcu_int<set>();
     }
@@ -266,26 +346,26 @@ namespace set {
     void IntrusiveHashSetHdrTest::split_st_RCU_GPB_member_less()
     {
         typedef member_int_item< ci::split_list::node< ci::michael_list::node<rcu_type> > > item;
     void IntrusiveHashSetHdrTest::split_st_RCU_GPB_member_less()
     {
         typedef member_int_item< ci::split_list::node< ci::michael_list::node<rcu_type> > > item;
-        typedef ci::MichaelList< rcu_type
-            ,item
-            ,ci::michael_list::make_traits<
-                ci::opt::hook< ci::michael_list::member_hook<
-                    offsetof( item, hMember ),
-                    co::gc<rcu_type>
-                > >
-                ,co::less< less<item> >
-                ,ci::opt::disposer< faked_disposer >
-            >::type
-        >    ord_list;
-
-        typedef ci::SplitListSet< rcu_type, ord_list,
-            ci::split_list::make_traits<
-                ci::split_list::dynamic_bucket_table<false>
-                ,co::hash< hash_int >
-                ,co::memory_model<co::v::sequential_consistent>
-            >::type
+        typedef ci::MichaelList < rcu_type
+            , item
+            , ci::michael_list::make_traits <
+            ci::opt::hook< ci::michael_list::member_hook <
+            offsetof( item, hMember ),
+            co::gc<rcu_type>
+            > >
+            co::less< less<item> >
+            , ci::opt::disposer < faked_disposer >
+            > ::type
+        > ord_list;
+
+        typedef ci::SplitListSet < rcu_type, ord_list,
+            ci::split_list::make_traits <
+            ci::split_list::dynamic_bucket_table<false>
+            co::hash< hash_int >
+            , co::memory_model < co::v::sequential_consistent >
+            > ::type
         > set;
         > set;
-        static_assert( !set::options::dynamic_bucket_table, "Set has dynamic bucket table" );
+        static_assert(!set::traits::dynamic_bucket_table, "Set has dynamic bucket table");
 
         test_rcu_int<set>();
     }
 
         test_rcu_int<set>();
     }
@@ -293,30 +373,57 @@ namespace set {
     void IntrusiveHashSetHdrTest::split_st_RCU_GPB_member_cmpmix()
     {
         typedef member_int_item< ci::split_list::node< ci::michael_list::node<rcu_type> > > item;
     void IntrusiveHashSetHdrTest::split_st_RCU_GPB_member_cmpmix()
     {
         typedef member_int_item< ci::split_list::node< ci::michael_list::node<rcu_type> > > item;
-        typedef ci::MichaelList< rcu_type
-            ,item
-            ,ci::michael_list::make_traits<
-                ci::opt::hook< ci::michael_list::member_hook<
-                    offsetof( item, hMember ),
-                    co::gc<rcu_type>
-                > >
-                ,co::compare< cmp<item> >
-                ,co::less< less<item> >
-                ,ci::opt::disposer< faked_disposer >
-            >::type
-        >    ord_list;
-
-        typedef ci::SplitListSet< rcu_type, ord_list,
-            ci::split_list::make_traits<
-                co::hash< hash_int >
-                ,co::item_counter< simple_item_counter >
-                ,ci::split_list::dynamic_bucket_table<false>
-            >::type
+        typedef ci::MichaelList < rcu_type
+            , item
+            , ci::michael_list::make_traits <
+            ci::opt::hook< ci::michael_list::member_hook <
+            offsetof( item, hMember ),
+            co::gc<rcu_type>
+            > >
+            co::compare< cmp<item> >
+            co::less< less<item> >
+            , ci::opt::disposer < faked_disposer >
+            > ::type
+        > ord_list;
+
+        typedef ci::SplitListSet < rcu_type, ord_list,
+            ci::split_list::make_traits <
+            co::hash< hash_int >
+            co::item_counter< simple_item_counter >
+            , ci::split_list::dynamic_bucket_table < false >
+            > ::type
         > set;
         > set;
-        static_assert( !set::options::dynamic_bucket_table, "Set has dynamic bucket table" );
+        static_assert(!set::traits::dynamic_bucket_table, "Set has dynamic bucket table");
 
         test_rcu_int<set>();
     }
 
 
         test_rcu_int<set>();
     }
 
+    void IntrusiveHashSetHdrTest::split_st_RCU_GPB_member_cmpmix_stat()
+    {
+        typedef member_int_item< ci::split_list::node< ci::michael_list::node<rcu_type> > > item;
+        typedef ci::MichaelList < rcu_type
+            , item
+            , ci::michael_list::make_traits <
+            ci::opt::hook< ci::michael_list::member_hook <
+            offsetof( item, hMember ),
+            co::gc<rcu_type>
+            > >
+            , co::compare< cmp<item> >
+            , co::less< less<item> >
+            , ci::opt::disposer < faked_disposer >
+            > ::type
+        > ord_list;
+
+        typedef ci::SplitListSet < rcu_type, ord_list,
+            ci::split_list::make_traits <
+            co::hash< hash_int >
+            , co::item_counter< simple_item_counter >
+            , ci::split_list::dynamic_bucket_table<false>
+            , co::stat < ci::split_list::stat<> >
+            > ::type
+        > set;
+        static_assert(!set::traits::dynamic_bucket_table, "Set has dynamic bucket table");
 
 
+        test_rcu_int<set>();
+    }
 } // namespace set
 } // namespace set
index 76de301fb26daac98b0d7bf00ed86e221c69790f..a3cafcfb5e49c43360e6c1f3a8e792d2b888fd90 100644 (file)
@@ -29,7 +29,7 @@ namespace set {
                 ,co::memory_model<co::v::relaxed_ordering>
             >::type
         > set;
                 ,co::memory_model<co::v::relaxed_ordering>
             >::type
         > set;
-        static_assert( set::options::dynamic_bucket_table, "Set has static bucket table" );
+        static_assert( set::traits::dynamic_bucket_table, "Set has static bucket table" );
 
         test_rcu_int<set>();
     }
 
         test_rcu_int<set>();
     }
@@ -52,7 +52,7 @@ namespace set {
                 ,co::memory_model<co::v::sequential_consistent>
             >::type
         > set;
                 ,co::memory_model<co::v::sequential_consistent>
             >::type
         > set;
-        static_assert( set::options::dynamic_bucket_table, "Set has static bucket table" );
+        static_assert( set::traits::dynamic_bucket_table, "Set has static bucket table" );
 
         test_rcu_int<set>();
     }
 
         test_rcu_int<set>();
     }
@@ -77,7 +77,31 @@ namespace set {
                 ,ci::split_list::dynamic_bucket_table<true>
             >::type
         > set;
                 ,ci::split_list::dynamic_bucket_table<true>
             >::type
         > set;
-        static_assert( set::options::dynamic_bucket_table, "Set has static bucket table" );
+        static_assert( set::traits::dynamic_bucket_table, "Set has static bucket table" );
+
+        test_rcu_int<set>();
+    }
+
+    void IntrusiveHashSetHdrTest::split_dyn_RCU_GPB_base_cmpmix_stat_lazy()
+    {
+        typedef base_int_item< ci::split_list::node<ci::lazy_list::node<rcu_type> > > item;
+        struct list_traits : public ci::lazy_list::traits
+        {
+            typedef ci::lazy_list::base_hook< co::gc<rcu_type> > hook;
+            typedef IntrusiveHashSetHdrTest::less< item > less;
+            typedef cmp<item> compare;
+            typedef faked_disposer disposer;
+        };
+        typedef ci::LazyList< rcu_type, item, list_traits > ord_list;
+
+        struct set_traits : public ci::split_list::make_traits<ci::split_list::dynamic_bucket_table<true>>::type
+        {
+            typedef hash_int hash;
+            typedef simple_item_counter item_counter;
+            typedef ci::split_list::stat<> stat;
+        };
+        typedef ci::SplitListSet< rcu_type, ord_list, set_traits > set;
+        static_assert( set::traits::dynamic_bucket_table, "Set has static bucket table" );
 
         test_rcu_int<set>();
     }
 
         test_rcu_int<set>();
     }
@@ -103,7 +127,7 @@ namespace set {
                 ,co::memory_model<co::v::relaxed_ordering>
             >::type
         > set;
                 ,co::memory_model<co::v::relaxed_ordering>
             >::type
         > set;
-        static_assert( set::options::dynamic_bucket_table, "Set has static bucket table" );
+        static_assert( set::traits::dynamic_bucket_table, "Set has static bucket table" );
 
         test_rcu_int<set>();
     }
 
         test_rcu_int<set>();
     }
@@ -129,7 +153,7 @@ namespace set {
                 ,co::memory_model<co::v::sequential_consistent>
             >::type
         > set;
                 ,co::memory_model<co::v::sequential_consistent>
             >::type
         > set;
-        static_assert( set::options::dynamic_bucket_table, "Set has static bucket table" );
+        static_assert( set::traits::dynamic_bucket_table, "Set has static bucket table" );
 
         test_rcu_int<set>();
     }
 
         test_rcu_int<set>();
     }
@@ -156,11 +180,39 @@ namespace set {
                 ,co::item_counter< simple_item_counter >
             >::type
         > set;
                 ,co::item_counter< simple_item_counter >
             >::type
         > set;
-        static_assert( set::options::dynamic_bucket_table, "Set has static bucket table" );
+        static_assert( set::traits::dynamic_bucket_table, "Set has static bucket table" );
 
         test_rcu_int<set>();
     }
 
 
         test_rcu_int<set>();
     }
 
+    void IntrusiveHashSetHdrTest::split_dyn_RCU_GPB_member_cmpmix_stat_lazy()
+    {
+        typedef member_int_item< ci::split_list::node< ci::lazy_list::node<rcu_type> > > item;
+        struct list_traits :
+            public ci::lazy_list::make_traits<
+                ci::opt::hook< ci::lazy_list::member_hook<
+                    offsetof( item, hMember ),
+                    co::gc<rcu_type>
+                > >
+                ,co::compare< cmp<item> >
+                ,co::less< less<item> >
+                ,ci::opt::disposer< faked_disposer >
+            >::type
+        {};
+        typedef ci::LazyList< rcu_type, item, list_traits > ord_list;
+
+        struct set_traits :
+            public ci::split_list::make_traits<
+                co::hash< hash_int >
+                ,co::item_counter< simple_item_counter >
+                ,co::stat< ci::split_list::stat<> >
+            >::type
+        {};
+        typedef ci::SplitListSet< rcu_type, ord_list, set_traits > set;
+        static_assert( set::traits::dynamic_bucket_table, "Set has static bucket table" );
+
+        test_rcu_int<set>();
+    }
 
     // Static bucket table
     void IntrusiveHashSetHdrTest::split_st_RCU_GPB_base_cmp_lazy()
 
     // Static bucket table
     void IntrusiveHashSetHdrTest::split_st_RCU_GPB_base_cmp_lazy()
@@ -182,7 +234,7 @@ namespace set {
                 ,co::memory_model<co::v::relaxed_ordering>
             >::type
         > set;
                 ,co::memory_model<co::v::relaxed_ordering>
             >::type
         > set;
-        static_assert( !set::options::dynamic_bucket_table, "Set has dynamic bucket table" );
+        static_assert( !set::traits::dynamic_bucket_table, "Set has dynamic bucket table" );
 
         test_rcu_int<set>();
     }
 
         test_rcu_int<set>();
     }
@@ -206,7 +258,7 @@ namespace set {
                 ,co::memory_model<co::v::sequential_consistent>
             >::type
         > set;
                 ,co::memory_model<co::v::sequential_consistent>
             >::type
         > set;
-        static_assert( !set::options::dynamic_bucket_table, "Set has dynamic bucket table" );
+        static_assert( !set::traits::dynamic_bucket_table, "Set has dynamic bucket table" );
 
         test_rcu_int<set>();
     }
 
         test_rcu_int<set>();
     }
@@ -231,7 +283,33 @@ namespace set {
                 ,ci::split_list::dynamic_bucket_table<false>
             >::type
         > set;
                 ,ci::split_list::dynamic_bucket_table<false>
             >::type
         > set;
-        static_assert( !set::options::dynamic_bucket_table, "Set has dynamic bucket table" );
+        static_assert( !set::traits::dynamic_bucket_table, "Set has dynamic bucket table" );
+
+        test_rcu_int<set>();
+    }
+
+    void IntrusiveHashSetHdrTest::split_st_RCU_GPB_base_cmpmix_stat_lazy()
+    {
+        typedef base_int_item< ci::split_list::node<ci::lazy_list::node<rcu_type> > > item;
+        typedef ci::LazyList< rcu_type
+            ,item
+            ,ci::lazy_list::make_traits<
+                ci::opt::hook< ci::lazy_list::base_hook< co::gc<rcu_type> > >
+                ,co::less< less<item> >
+                ,co::compare< cmp<item> >
+                ,ci::opt::disposer< faked_disposer >
+            >::type
+        >    ord_list;
+
+        typedef ci::SplitListSet< rcu_type, ord_list,
+            ci::split_list::make_traits<
+                co::hash< hash_int >
+                ,co::item_counter< simple_item_counter >
+                ,ci::split_list::dynamic_bucket_table<false>
+                ,co::stat< ci::split_list::stat<>>
+            >::type
+        > set;
+        static_assert( !set::traits::dynamic_bucket_table, "Set has dynamic bucket table" );
 
         test_rcu_int<set>();
     }
 
         test_rcu_int<set>();
     }
@@ -258,7 +336,7 @@ namespace set {
                 ,co::memory_model<co::v::relaxed_ordering>
             >::type
         > set;
                 ,co::memory_model<co::v::relaxed_ordering>
             >::type
         > set;
-        static_assert( !set::options::dynamic_bucket_table, "Set has dynamic bucket table" );
+        static_assert( !set::traits::dynamic_bucket_table, "Set has dynamic bucket table" );
 
         test_rcu_int<set>();
     }
 
         test_rcu_int<set>();
     }
@@ -285,7 +363,7 @@ namespace set {
                 ,co::memory_model<co::v::sequential_consistent>
             >::type
         > set;
                 ,co::memory_model<co::v::sequential_consistent>
             >::type
         > set;
-        static_assert( !set::options::dynamic_bucket_table, "Set has dynamic bucket table" );
+        static_assert( !set::traits::dynamic_bucket_table, "Set has dynamic bucket table" );
 
         test_rcu_int<set>();
     }
 
         test_rcu_int<set>();
     }
@@ -313,10 +391,38 @@ namespace set {
                 ,ci::split_list::dynamic_bucket_table<false>
             >::type
         > set;
                 ,ci::split_list::dynamic_bucket_table<false>
             >::type
         > set;
-        static_assert( !set::options::dynamic_bucket_table, "Set has dynamic bucket table" );
+        static_assert( !set::traits::dynamic_bucket_table, "Set has dynamic bucket table" );
 
         test_rcu_int<set>();
     }
 
 
         test_rcu_int<set>();
     }
 
+    void IntrusiveHashSetHdrTest::split_st_RCU_GPB_member_cmpmix_stat_lazy()
+    {
+        typedef member_int_item< ci::split_list::node< ci::lazy_list::node<rcu_type> > > item;
+        typedef ci::LazyList< rcu_type
+            ,item
+            ,ci::lazy_list::make_traits<
+                ci::opt::hook< ci::lazy_list::member_hook<
+                    offsetof( item, hMember ),
+                    co::gc<rcu_type>
+                > >
+                ,co::compare< cmp<item> >
+                ,co::less< less<item> >
+                ,ci::opt::disposer< faked_disposer >
+            >::type
+        >    ord_list;
+
+        typedef ci::SplitListSet< rcu_type, ord_list,
+            ci::split_list::make_traits<
+                co::hash< hash_int >
+                ,co::item_counter< simple_item_counter >
+                ,ci::split_list::dynamic_bucket_table<false>
+                ,co::stat< ci::split_list::stat<>>
+            >::type
+        > set;
+        static_assert( !set::traits::dynamic_bucket_table, "Set has dynamic bucket table" );
+
+        test_rcu_int<set>();
+    }
 
 } // namespace set
 
 } // namespace set
index 5de7a4d91ed40e45c4870a7c37d685266cdcb2f0..36d7415bd9bfc905b5cad713c665bbfe4b38e11d 100644 (file)
@@ -29,7 +29,7 @@ namespace set {
                 ,co::memory_model<co::v::relaxed_ordering>
             >::type
         > set;
                 ,co::memory_model<co::v::relaxed_ordering>
             >::type
         > set;
-        static_assert( set::options::dynamic_bucket_table, "Set has static bucket table" );
+        static_assert( set::traits::dynamic_bucket_table, "Set has static bucket table" );
 
         test_rcu_int<set>();
     }
 
         test_rcu_int<set>();
     }
@@ -52,7 +52,7 @@ namespace set {
                 ,co::memory_model<co::v::sequential_consistent>
             >::type
         > set;
                 ,co::memory_model<co::v::sequential_consistent>
             >::type
         > set;
-        static_assert( set::options::dynamic_bucket_table, "Set has static bucket table" );
+        static_assert( set::traits::dynamic_bucket_table, "Set has static bucket table" );
 
         test_rcu_int<set>();
     }
 
         test_rcu_int<set>();
     }
@@ -77,7 +77,7 @@ namespace set {
                 ,ci::split_list::dynamic_bucket_table<true>
             >::type
         > set;
                 ,ci::split_list::dynamic_bucket_table<true>
             >::type
         > set;
-        static_assert( set::options::dynamic_bucket_table, "Set has static bucket table" );
+        static_assert( set::traits::dynamic_bucket_table, "Set has static bucket table" );
 
         test_rcu_int<set>();
     }
 
         test_rcu_int<set>();
     }
@@ -102,7 +102,7 @@ namespace set {
                 co::hash< hash_int >
             >::type
         > set;
                 co::hash< hash_int >
             >::type
         > set;
-        static_assert( set::options::dynamic_bucket_table, "Set has static bucket table" );
+        static_assert( set::traits::dynamic_bucket_table, "Set has static bucket table" );
 
         test_rcu_int<set>();
     }
 
         test_rcu_int<set>();
     }
@@ -128,7 +128,7 @@ namespace set {
                 ,co::memory_model<co::v::relaxed_ordering>
             >::type
         > set;
                 ,co::memory_model<co::v::relaxed_ordering>
             >::type
         > set;
-        static_assert( set::options::dynamic_bucket_table, "Set has static bucket table" );
+        static_assert( set::traits::dynamic_bucket_table, "Set has static bucket table" );
 
         test_rcu_int<set>();
     }
 
         test_rcu_int<set>();
     }
@@ -156,7 +156,7 @@ namespace set {
                 ,co::memory_model<co::v::sequential_consistent>
             >::type
         > set;
                 ,co::memory_model<co::v::sequential_consistent>
             >::type
         > set;
-        static_assert( set::options::dynamic_bucket_table, "Set has static bucket table" );
+        static_assert( set::traits::dynamic_bucket_table, "Set has static bucket table" );
 
         test_rcu_int<set>();
     }
 
         test_rcu_int<set>();
     }
@@ -182,7 +182,7 @@ namespace set {
                 ,co::memory_model<co::v::relaxed_ordering>
             >::type
         > set;
                 ,co::memory_model<co::v::relaxed_ordering>
             >::type
         > set;
-        static_assert( !set::options::dynamic_bucket_table, "Set has dynamic bucket table" );
+        static_assert( !set::traits::dynamic_bucket_table, "Set has dynamic bucket table" );
 
         test_rcu_int<set>();
     }
 
         test_rcu_int<set>();
     }
@@ -206,7 +206,7 @@ namespace set {
                 ,co::memory_model<co::v::sequential_consistent>
             >::type
         > set;
                 ,co::memory_model<co::v::sequential_consistent>
             >::type
         > set;
-        static_assert( !set::options::dynamic_bucket_table, "Set has dynamic bucket table" );
+        static_assert( !set::traits::dynamic_bucket_table, "Set has dynamic bucket table" );
 
         test_rcu_int<set>();
     }
 
         test_rcu_int<set>();
     }
@@ -231,7 +231,7 @@ namespace set {
                 ,ci::split_list::dynamic_bucket_table<false>
             >::type
         > set;
                 ,ci::split_list::dynamic_bucket_table<false>
             >::type
         > set;
-        static_assert( !set::options::dynamic_bucket_table, "Set has dynamic bucket table" );
+        static_assert( !set::traits::dynamic_bucket_table, "Set has dynamic bucket table" );
 
         test_rcu_int<set>();
     }
 
         test_rcu_int<set>();
     }
@@ -258,7 +258,7 @@ namespace set {
                 ,co::memory_model<co::v::relaxed_ordering>
             >::type
         > set;
                 ,co::memory_model<co::v::relaxed_ordering>
             >::type
         > set;
-        static_assert( !set::options::dynamic_bucket_table, "Set has dynamic bucket table" );
+        static_assert( !set::traits::dynamic_bucket_table, "Set has dynamic bucket table" );
 
         test_rcu_int<set>();
     }
 
         test_rcu_int<set>();
     }
@@ -285,7 +285,7 @@ namespace set {
                 ,co::memory_model<co::v::sequential_consistent>
             >::type
         > set;
                 ,co::memory_model<co::v::sequential_consistent>
             >::type
         > set;
-        static_assert( !set::options::dynamic_bucket_table, "Set has dynamic bucket table" );
+        static_assert( !set::traits::dynamic_bucket_table, "Set has dynamic bucket table" );
 
         test_rcu_int<set>();
     }
 
         test_rcu_int<set>();
     }
@@ -313,7 +313,117 @@ namespace set {
                 ,ci::split_list::dynamic_bucket_table<false>
             >::type
         > set;
                 ,ci::split_list::dynamic_bucket_table<false>
             >::type
         > set;
-        static_assert( !set::options::dynamic_bucket_table, "Set has dynamic bucket table" );
+        static_assert( !set::traits::dynamic_bucket_table, "Set has dynamic bucket table" );
+
+        test_rcu_int<set>();
+    }
+
+    void IntrusiveHashSetHdrTest::split_dyn_RCU_GPI_base_cmpmix_stat()
+    {
+        typedef base_int_item< ci::split_list::node<ci::michael_list::node<rcu_type> > > item;
+        struct list_traits : public ci::michael_list::traits
+        {
+            typedef ci::michael_list::base_hook< co::gc<rcu_type> > hook;
+            typedef IntrusiveHashSetHdrTest::less<item> less;
+            typedef cmp<item> compare;
+            typedef faked_disposer disposer;
+        };
+        typedef ci::MichaelList< rcu_type, item, list_traits > ord_list;
+
+        struct set_traits : public ci::split_list::make_traits<ci::split_list::dynamic_bucket_table<true> >::type
+        {
+            typedef hash_int hash;
+            typedef simple_item_counter item_counter;
+            typedef ci::split_list::stat<> stat;
+        };
+        typedef ci::SplitListSet< rcu_type, ord_list, set_traits > set;
+
+        static_assert( set::traits::dynamic_bucket_table, "Set has static bucket table" );
+
+        test_rcu_int<set>();
+    }
+
+    void IntrusiveHashSetHdrTest::split_dyn_RCU_GPI_member_cmpmix_stat()
+    {
+        typedef member_int_item< ci::split_list::node< ci::michael_list::node<rcu_type> > > item;
+        struct list_traits :
+            public ci::michael_list::make_traits<
+                ci::opt::hook< ci::michael_list::member_hook<
+                    offsetof( item, hMember ),
+                    co::gc<rcu_type>
+                > >
+                ,co::compare< cmp<item> >
+                ,co::less< less<item> >
+                ,ci::opt::disposer< faked_disposer >
+            >::type
+        {};
+        typedef ci::MichaelList< rcu_type, item, list_traits > ord_list;
+
+        struct set_traits :
+            public ci::split_list::make_traits<
+                co::hash< hash_int >
+                ,co::item_counter< simple_item_counter >
+                ,co::memory_model<co::v::sequential_consistent>
+                ,co::stat< ci::split_list::stat<>>
+            >::type
+        {};
+        typedef ci::SplitListSet< rcu_type, ord_list, set_traits > set;
+        static_assert( set::traits::dynamic_bucket_table, "Set has static bucket table" );
+
+        test_rcu_int<set>();
+    }
+
+    void IntrusiveHashSetHdrTest::split_st_RCU_GPI_base_cmpmix_stat()
+    {
+        typedef base_int_item< ci::split_list::node<ci::michael_list::node<rcu_type> > > item;
+        typedef ci::MichaelList< rcu_type
+            ,item
+            ,ci::michael_list::make_traits<
+                ci::opt::hook< ci::michael_list::base_hook< co::gc<rcu_type> > >
+                ,co::less< less<item> >
+                ,co::compare< cmp<item> >
+                ,ci::opt::disposer< faked_disposer >
+            >::type
+        >    ord_list;
+
+        typedef ci::SplitListSet< rcu_type, ord_list,
+            ci::split_list::make_traits<
+                co::hash< hash_int >
+                ,co::item_counter< simple_item_counter >
+                ,ci::split_list::dynamic_bucket_table<false>
+                ,co::stat< ci::split_list::stat<>>
+            >::type
+        > set;
+        static_assert( !set::traits::dynamic_bucket_table, "Set has dynamic bucket table" );
+
+        test_rcu_int<set>();
+    }
+
+    void IntrusiveHashSetHdrTest::split_st_RCU_GPI_member_cmpmix_stat()
+    {
+        typedef member_int_item< ci::split_list::node< ci::michael_list::node<rcu_type> > > item;
+        typedef ci::MichaelList< rcu_type
+            ,item
+            ,ci::michael_list::make_traits<
+                ci::opt::hook< ci::michael_list::member_hook<
+                    offsetof( item, hMember ),
+                    co::gc<rcu_type>
+                > >
+                ,co::compare< cmp<item> >
+                ,co::less< less<item> >
+                ,ci::opt::disposer< faked_disposer >
+            >::type
+        >    ord_list;
+
+        typedef ci::SplitListSet< rcu_type, ord_list,
+            ci::split_list::make_traits<
+                co::hash< hash_int >
+                ,co::item_counter< simple_item_counter >
+                ,ci::split_list::dynamic_bucket_table<false>
+                ,co::stat< ci::split_list::stat<> >
+            >::type
+        > set;
+        static_assert( !set::traits::dynamic_bucket_table, "Set has dynamic bucket table" );
 
         test_rcu_int<set>();
     }
 
         test_rcu_int<set>();
     }
index d3641a246d157e8c832ae0d9e0d8a51b6b986186..186f4290cdd817eb823f03b854256104afbfef54 100644 (file)
@@ -29,7 +29,7 @@ namespace set {
                 ,co::memory_model<co::v::relaxed_ordering>
             >::type
         > set;
                 ,co::memory_model<co::v::relaxed_ordering>
             >::type
         > set;
-        static_assert( set::options::dynamic_bucket_table, "Set has static bucket table" );
+        static_assert( set::traits::dynamic_bucket_table, "Set has static bucket table" );
 
         test_rcu_int<set>();
     }
 
         test_rcu_int<set>();
     }
@@ -52,7 +52,7 @@ namespace set {
                 ,co::memory_model<co::v::sequential_consistent>
             >::type
         > set;
                 ,co::memory_model<co::v::sequential_consistent>
             >::type
         > set;
-        static_assert( set::options::dynamic_bucket_table, "Set has static bucket table" );
+        static_assert( set::traits::dynamic_bucket_table, "Set has static bucket table" );
 
         test_rcu_int<set>();
     }
 
         test_rcu_int<set>();
     }
@@ -77,7 +77,7 @@ namespace set {
                 ,ci::split_list::dynamic_bucket_table<true>
             >::type
         > set;
                 ,ci::split_list::dynamic_bucket_table<true>
             >::type
         > set;
-        static_assert( set::options::dynamic_bucket_table, "Set has static bucket table" );
+        static_assert( set::traits::dynamic_bucket_table, "Set has static bucket table" );
 
         test_rcu_int<set>();
     }
 
         test_rcu_int<set>();
     }
@@ -103,7 +103,7 @@ namespace set {
                 ,co::memory_model<co::v::relaxed_ordering>
             >::type
         > set;
                 ,co::memory_model<co::v::relaxed_ordering>
             >::type
         > set;
-        static_assert( set::options::dynamic_bucket_table, "Set has static bucket table" );
+        static_assert( set::traits::dynamic_bucket_table, "Set has static bucket table" );
 
         test_rcu_int<set>();
     }
 
         test_rcu_int<set>();
     }
@@ -129,7 +129,7 @@ namespace set {
                 ,co::memory_model<co::v::sequential_consistent>
             >::type
         > set;
                 ,co::memory_model<co::v::sequential_consistent>
             >::type
         > set;
-        static_assert( set::options::dynamic_bucket_table, "Set has static bucket table" );
+        static_assert( set::traits::dynamic_bucket_table, "Set has static bucket table" );
 
         test_rcu_int<set>();
     }
 
         test_rcu_int<set>();
     }
@@ -156,7 +156,7 @@ namespace set {
                 ,co::item_counter< simple_item_counter >
             >::type
         > set;
                 ,co::item_counter< simple_item_counter >
             >::type
         > set;
-        static_assert( set::options::dynamic_bucket_table, "Set has static bucket table" );
+        static_assert( set::traits::dynamic_bucket_table, "Set has static bucket table" );
 
         test_rcu_int<set>();
     }
 
         test_rcu_int<set>();
     }
@@ -182,7 +182,7 @@ namespace set {
                 ,co::memory_model<co::v::relaxed_ordering>
             >::type
         > set;
                 ,co::memory_model<co::v::relaxed_ordering>
             >::type
         > set;
-        static_assert( !set::options::dynamic_bucket_table, "Set has dynamic bucket table" );
+        static_assert( !set::traits::dynamic_bucket_table, "Set has dynamic bucket table" );
 
         test_rcu_int<set>();
     }
 
         test_rcu_int<set>();
     }
@@ -206,7 +206,7 @@ namespace set {
                 ,co::memory_model<co::v::sequential_consistent>
             >::type
         > set;
                 ,co::memory_model<co::v::sequential_consistent>
             >::type
         > set;
-        static_assert( !set::options::dynamic_bucket_table, "Set has dynamic bucket table" );
+        static_assert( !set::traits::dynamic_bucket_table, "Set has dynamic bucket table" );
 
         test_rcu_int<set>();
     }
 
         test_rcu_int<set>();
     }
@@ -231,7 +231,7 @@ namespace set {
                 ,ci::split_list::dynamic_bucket_table<false>
             >::type
         > set;
                 ,ci::split_list::dynamic_bucket_table<false>
             >::type
         > set;
-        static_assert( !set::options::dynamic_bucket_table, "Set has dynamic bucket table" );
+        static_assert( !set::traits::dynamic_bucket_table, "Set has dynamic bucket table" );
 
         test_rcu_int<set>();
     }
 
         test_rcu_int<set>();
     }
@@ -258,7 +258,7 @@ namespace set {
                 ,co::memory_model<co::v::relaxed_ordering>
             >::type
         > set;
                 ,co::memory_model<co::v::relaxed_ordering>
             >::type
         > set;
-        static_assert( !set::options::dynamic_bucket_table, "Set has dynamic bucket table" );
+        static_assert( !set::traits::dynamic_bucket_table, "Set has dynamic bucket table" );
 
         test_rcu_int<set>();
     }
 
         test_rcu_int<set>();
     }
@@ -285,7 +285,7 @@ namespace set {
                 ,co::memory_model<co::v::sequential_consistent>
             >::type
         > set;
                 ,co::memory_model<co::v::sequential_consistent>
             >::type
         > set;
-        static_assert( !set::options::dynamic_bucket_table, "Set has dynamic bucket table" );
+        static_assert( !set::traits::dynamic_bucket_table, "Set has dynamic bucket table" );
 
         test_rcu_int<set>();
     }
 
         test_rcu_int<set>();
     }
@@ -313,10 +313,119 @@ namespace set {
                 ,ci::split_list::dynamic_bucket_table<false>
             >::type
         > set;
                 ,ci::split_list::dynamic_bucket_table<false>
             >::type
         > set;
-        static_assert( !set::options::dynamic_bucket_table, "Set has dynamic bucket table" );
+        static_assert( !set::traits::dynamic_bucket_table, "Set has dynamic bucket table" );
 
         test_rcu_int<set>();
     }
 
 
         test_rcu_int<set>();
     }
 
+    void IntrusiveHashSetHdrTest::split_dyn_RCU_GPI_base_cmpmix_stat_lazy()
+    {
+        typedef base_int_item< ci::split_list::node<ci::lazy_list::node<rcu_type> > > item;
+        struct list_traits : public ci::lazy_list::traits
+        {
+            typedef ci::lazy_list::base_hook< co::gc<rcu_type> > hook;
+            typedef IntrusiveHashSetHdrTest::less< item > less;
+            typedef cmp<item> compare;
+            typedef faked_disposer disposer;
+        };
+        typedef ci::LazyList< rcu_type, item, list_traits > ord_list;
+
+        struct set_traits : public ci::split_list::make_traits<ci::split_list::dynamic_bucket_table<true>>::type
+        {
+            typedef hash_int hash;
+            typedef simple_item_counter item_counter;
+            typedef ci::split_list::stat<> stat;
+        };
+        typedef ci::SplitListSet< rcu_type, ord_list, set_traits > set;
+        static_assert( set::traits::dynamic_bucket_table, "Set has static bucket table" );
+
+        test_rcu_int<set>();
+    }
+
+    void IntrusiveHashSetHdrTest::split_dyn_RCU_GPI_member_cmpmix_stat_lazy()
+    {
+        typedef member_int_item< ci::split_list::node< ci::lazy_list::node<rcu_type> > > item;
+        struct list_traits :
+            public ci::lazy_list::make_traits<
+                ci::opt::hook< ci::lazy_list::member_hook<
+                    offsetof( item, hMember ),
+                    co::gc<rcu_type>
+                > >
+                ,co::compare< cmp<item> >
+                ,co::less< less<item> >
+                ,ci::opt::disposer< faked_disposer >
+            >::type
+        {};
+        typedef ci::LazyList< rcu_type, item, list_traits > ord_list;
+
+        struct set_traits :
+            public ci::split_list::make_traits<
+                co::hash< hash_int >
+                ,co::item_counter< simple_item_counter >
+                ,co::stat< ci::split_list::stat<> >
+            >::type
+        {};
+        typedef ci::SplitListSet< rcu_type, ord_list, set_traits > set;
+        static_assert( set::traits::dynamic_bucket_table, "Set has static bucket table" );
+
+        test_rcu_int<set>();
+    }
+
+    void IntrusiveHashSetHdrTest::split_st_RCU_GPI_base_cmpmix_stat_lazy()
+    {
+        typedef base_int_item< ci::split_list::node<ci::lazy_list::node<rcu_type> > > item;
+        typedef ci::LazyList< rcu_type
+            ,item
+            ,ci::lazy_list::make_traits<
+                ci::opt::hook< ci::lazy_list::base_hook< co::gc<rcu_type> > >
+                ,co::less< less<item> >
+                ,co::compare< cmp<item> >
+                ,ci::opt::disposer< faked_disposer >
+            >::type
+        >    ord_list;
+
+        typedef ci::SplitListSet< rcu_type, ord_list,
+            ci::split_list::make_traits<
+                co::hash< hash_int >
+                ,co::item_counter< simple_item_counter >
+                ,ci::split_list::dynamic_bucket_table<false>
+                ,co::stat< ci::split_list::stat<>>
+            >::type
+        > set;
+        static_assert( !set::traits::dynamic_bucket_table, "Set has dynamic bucket table" );
+
+        test_rcu_int<set>();
+    }
+
+    void IntrusiveHashSetHdrTest::split_st_RCU_GPI_member_cmpmix_stat_lazy()
+    {
+        typedef member_int_item< ci::split_list::node< ci::lazy_list::node<rcu_type> > > item;
+        typedef ci::LazyList< rcu_type
+            ,item
+            ,ci::lazy_list::make_traits<
+                ci::opt::hook< ci::lazy_list::member_hook<
+                    offsetof( item, hMember ),
+                    co::gc<rcu_type>
+                > >
+                ,co::compare< cmp<item> >
+                ,co::less< less<item> >
+                ,ci::opt::disposer< faked_disposer >
+            >::type
+        >    ord_list;
+
+        typedef ci::SplitListSet< rcu_type, ord_list,
+            ci::split_list::make_traits<
+                co::hash< hash_int >
+                ,co::item_counter< simple_item_counter >
+                ,ci::split_list::dynamic_bucket_table<false>
+                ,co::stat< ci::split_list::stat<>>
+            >::type
+        > set;
+        static_assert( !set::traits::dynamic_bucket_table, "Set has dynamic bucket table" );
+
+        test_rcu_int<set>();
+    }
+
+
 
 } // namespace set
 
 } // namespace set
index 28b580300c86dec083177712032c0b26a82dcc6b..75e9dac4aa9fa249e16a5b87d0e986ea2c4c8ae2 100644 (file)
@@ -29,7 +29,7 @@ namespace set {
                 ,co::memory_model<co::v::relaxed_ordering>
             >::type
         > set;
                 ,co::memory_model<co::v::relaxed_ordering>
             >::type
         > set;
-        static_assert( set::options::dynamic_bucket_table, "Set has static bucket table" );
+        static_assert( set::traits::dynamic_bucket_table, "Set has static bucket table" );
 
         test_rcu_int<set>();
     }
 
         test_rcu_int<set>();
     }
@@ -52,7 +52,7 @@ namespace set {
                 ,co::memory_model<co::v::sequential_consistent>
             >::type
         > set;
                 ,co::memory_model<co::v::sequential_consistent>
             >::type
         > set;
-        static_assert( set::options::dynamic_bucket_table, "Set has static bucket table" );
+        static_assert( set::traits::dynamic_bucket_table, "Set has static bucket table" );
 
         test_rcu_int<set>();
     }
 
         test_rcu_int<set>();
     }
@@ -77,7 +77,7 @@ namespace set {
                 ,ci::split_list::dynamic_bucket_table<true>
             >::type
         > set;
                 ,ci::split_list::dynamic_bucket_table<true>
             >::type
         > set;
-        static_assert( set::options::dynamic_bucket_table, "Set has static bucket table" );
+        static_assert( set::traits::dynamic_bucket_table, "Set has static bucket table" );
 
         test_rcu_int<set>();
     }
 
         test_rcu_int<set>();
     }
@@ -102,7 +102,7 @@ namespace set {
                 co::hash< hash_int >
             >::type
         > set;
                 co::hash< hash_int >
             >::type
         > set;
-        static_assert( set::options::dynamic_bucket_table, "Set has static bucket table" );
+        static_assert( set::traits::dynamic_bucket_table, "Set has static bucket table" );
 
         test_rcu_int<set>();
     }
 
         test_rcu_int<set>();
     }
@@ -128,7 +128,7 @@ namespace set {
                 ,co::memory_model<co::v::relaxed_ordering>
             >::type
         > set;
                 ,co::memory_model<co::v::relaxed_ordering>
             >::type
         > set;
-        static_assert( set::options::dynamic_bucket_table, "Set has static bucket table" );
+        static_assert( set::traits::dynamic_bucket_table, "Set has static bucket table" );
 
         test_rcu_int<set>();
     }
 
         test_rcu_int<set>();
     }
@@ -156,7 +156,7 @@ namespace set {
                 ,co::memory_model<co::v::sequential_consistent>
             >::type
         > set;
                 ,co::memory_model<co::v::sequential_consistent>
             >::type
         > set;
-        static_assert( set::options::dynamic_bucket_table, "Set has static bucket table" );
+        static_assert( set::traits::dynamic_bucket_table, "Set has static bucket table" );
 
         test_rcu_int<set>();
     }
 
         test_rcu_int<set>();
     }
@@ -182,7 +182,7 @@ namespace set {
                 ,co::memory_model<co::v::relaxed_ordering>
             >::type
         > set;
                 ,co::memory_model<co::v::relaxed_ordering>
             >::type
         > set;
-        static_assert( !set::options::dynamic_bucket_table, "Set has dynamic bucket table" );
+        static_assert( !set::traits::dynamic_bucket_table, "Set has dynamic bucket table" );
 
         test_rcu_int<set>();
     }
 
         test_rcu_int<set>();
     }
@@ -206,7 +206,7 @@ namespace set {
                 ,co::memory_model<co::v::sequential_consistent>
             >::type
         > set;
                 ,co::memory_model<co::v::sequential_consistent>
             >::type
         > set;
-        static_assert( !set::options::dynamic_bucket_table, "Set has dynamic bucket table" );
+        static_assert( !set::traits::dynamic_bucket_table, "Set has dynamic bucket table" );
 
         test_rcu_int<set>();
     }
 
         test_rcu_int<set>();
     }
@@ -231,7 +231,7 @@ namespace set {
                 ,ci::split_list::dynamic_bucket_table<false>
             >::type
         > set;
                 ,ci::split_list::dynamic_bucket_table<false>
             >::type
         > set;
-        static_assert( !set::options::dynamic_bucket_table, "Set has dynamic bucket table" );
+        static_assert( !set::traits::dynamic_bucket_table, "Set has dynamic bucket table" );
 
         test_rcu_int<set>();
     }
 
         test_rcu_int<set>();
     }
@@ -258,7 +258,7 @@ namespace set {
                 ,co::memory_model<co::v::relaxed_ordering>
             >::type
         > set;
                 ,co::memory_model<co::v::relaxed_ordering>
             >::type
         > set;
-        static_assert( !set::options::dynamic_bucket_table, "Set has dynamic bucket table" );
+        static_assert( !set::traits::dynamic_bucket_table, "Set has dynamic bucket table" );
 
         test_rcu_int<set>();
     }
 
         test_rcu_int<set>();
     }
@@ -285,7 +285,7 @@ namespace set {
                 ,co::memory_model<co::v::sequential_consistent>
             >::type
         > set;
                 ,co::memory_model<co::v::sequential_consistent>
             >::type
         > set;
-        static_assert( !set::options::dynamic_bucket_table, "Set has dynamic bucket table" );
+        static_assert( !set::traits::dynamic_bucket_table, "Set has dynamic bucket table" );
 
         test_rcu_int<set>();
     }
 
         test_rcu_int<set>();
     }
@@ -313,7 +313,117 @@ namespace set {
                 ,ci::split_list::dynamic_bucket_table<false>
             >::type
         > set;
                 ,ci::split_list::dynamic_bucket_table<false>
             >::type
         > set;
-        static_assert( !set::options::dynamic_bucket_table, "Set has dynamic bucket table" );
+        static_assert( !set::traits::dynamic_bucket_table, "Set has dynamic bucket table" );
+
+        test_rcu_int<set>();
+    }
+
+    void IntrusiveHashSetHdrTest::split_dyn_RCU_GPT_base_cmpmix_stat()
+    {
+        typedef base_int_item< ci::split_list::node<ci::michael_list::node<rcu_type> > > item;
+        struct list_traits : public ci::michael_list::traits
+        {
+            typedef ci::michael_list::base_hook< co::gc<rcu_type> > hook;
+            typedef IntrusiveHashSetHdrTest::less<item> less;
+            typedef cmp<item> compare;
+            typedef faked_disposer disposer;
+        };
+        typedef ci::MichaelList< rcu_type, item, list_traits > ord_list;
+
+        struct set_traits : public ci::split_list::make_traits<ci::split_list::dynamic_bucket_table<true> >::type
+        {
+            typedef hash_int hash;
+            typedef simple_item_counter item_counter;
+            typedef ci::split_list::stat<> stat;
+        };
+        typedef ci::SplitListSet< rcu_type, ord_list, set_traits > set;
+
+        static_assert( set::traits::dynamic_bucket_table, "Set has static bucket table" );
+
+        test_rcu_int<set>();
+    }
+
+    void IntrusiveHashSetHdrTest::split_dyn_RCU_GPT_member_cmpmix_stat()
+    {
+        typedef member_int_item< ci::split_list::node< ci::michael_list::node<rcu_type> > > item;
+        struct list_traits :
+            public ci::michael_list::make_traits<
+                ci::opt::hook< ci::michael_list::member_hook<
+                    offsetof( item, hMember ),
+                    co::gc<rcu_type>
+                > >
+                ,co::compare< cmp<item> >
+                ,co::less< less<item> >
+                ,ci::opt::disposer< faked_disposer >
+            >::type
+        {};
+        typedef ci::MichaelList< rcu_type, item, list_traits > ord_list;
+
+        struct set_traits :
+            public ci::split_list::make_traits<
+                co::hash< hash_int >
+                ,co::item_counter< simple_item_counter >
+                ,co::memory_model<co::v::sequential_consistent>
+                ,co::stat< ci::split_list::stat<>>
+            >::type
+        {};
+        typedef ci::SplitListSet< rcu_type, ord_list, set_traits > set;
+        static_assert( set::traits::dynamic_bucket_table, "Set has static bucket table" );
+
+        test_rcu_int<set>();
+    }
+
+    void IntrusiveHashSetHdrTest::split_st_RCU_GPT_base_cmpmix_stat()
+    {
+        typedef base_int_item< ci::split_list::node<ci::michael_list::node<rcu_type> > > item;
+        typedef ci::MichaelList< rcu_type
+            ,item
+            ,ci::michael_list::make_traits<
+                ci::opt::hook< ci::michael_list::base_hook< co::gc<rcu_type> > >
+                ,co::less< less<item> >
+                ,co::compare< cmp<item> >
+                ,ci::opt::disposer< faked_disposer >
+            >::type
+        >    ord_list;
+
+        typedef ci::SplitListSet< rcu_type, ord_list,
+            ci::split_list::make_traits<
+                co::hash< hash_int >
+                ,co::item_counter< simple_item_counter >
+                ,ci::split_list::dynamic_bucket_table<false>
+                ,co::stat< ci::split_list::stat<>>
+            >::type
+        > set;
+        static_assert( !set::traits::dynamic_bucket_table, "Set has dynamic bucket table" );
+
+        test_rcu_int<set>();
+    }
+
+    void IntrusiveHashSetHdrTest::split_st_RCU_GPT_member_cmpmix_stat()
+    {
+        typedef member_int_item< ci::split_list::node< ci::michael_list::node<rcu_type> > > item;
+        typedef ci::MichaelList< rcu_type
+            ,item
+            ,ci::michael_list::make_traits<
+                ci::opt::hook< ci::michael_list::member_hook<
+                    offsetof( item, hMember ),
+                    co::gc<rcu_type>
+                > >
+                ,co::compare< cmp<item> >
+                ,co::less< less<item> >
+                ,ci::opt::disposer< faked_disposer >
+            >::type
+        >    ord_list;
+
+        typedef ci::SplitListSet< rcu_type, ord_list,
+            ci::split_list::make_traits<
+                co::hash< hash_int >
+                ,co::item_counter< simple_item_counter >
+                ,ci::split_list::dynamic_bucket_table<false>
+                ,co::stat< ci::split_list::stat<> >
+            >::type
+        > set;
+        static_assert( !set::traits::dynamic_bucket_table, "Set has dynamic bucket table" );
 
         test_rcu_int<set>();
     }
 
         test_rcu_int<set>();
     }
index c26f7a57128fd5771dc265d267a1eeb3b41ae0d0..4d081c6eb9199a377bec770b8d0043aa10391723 100644 (file)
@@ -29,7 +29,7 @@ namespace set {
                 ,co::memory_model<co::v::relaxed_ordering>
             >::type
         > set;
                 ,co::memory_model<co::v::relaxed_ordering>
             >::type
         > set;
-        static_assert( set::options::dynamic_bucket_table, "Set has static bucket table" );
+        static_assert( set::traits::dynamic_bucket_table, "Set has static bucket table" );
 
         test_rcu_int<set>();
     }
 
         test_rcu_int<set>();
     }
@@ -52,7 +52,7 @@ namespace set {
                 ,co::memory_model<co::v::sequential_consistent>
             >::type
         > set;
                 ,co::memory_model<co::v::sequential_consistent>
             >::type
         > set;
-        static_assert( set::options::dynamic_bucket_table, "Set has static bucket table" );
+        static_assert( set::traits::dynamic_bucket_table, "Set has static bucket table" );
 
         test_rcu_int<set>();
     }
 
         test_rcu_int<set>();
     }
@@ -77,7 +77,7 @@ namespace set {
                 ,ci::split_list::dynamic_bucket_table<true>
             >::type
         > set;
                 ,ci::split_list::dynamic_bucket_table<true>
             >::type
         > set;
-        static_assert( set::options::dynamic_bucket_table, "Set has static bucket table" );
+        static_assert( set::traits::dynamic_bucket_table, "Set has static bucket table" );
 
         test_rcu_int<set>();
     }
 
         test_rcu_int<set>();
     }
@@ -103,7 +103,7 @@ namespace set {
                 ,co::memory_model<co::v::relaxed_ordering>
             >::type
         > set;
                 ,co::memory_model<co::v::relaxed_ordering>
             >::type
         > set;
-        static_assert( set::options::dynamic_bucket_table, "Set has static bucket table" );
+        static_assert( set::traits::dynamic_bucket_table, "Set has static bucket table" );
 
         test_rcu_int<set>();
     }
 
         test_rcu_int<set>();
     }
@@ -129,7 +129,7 @@ namespace set {
                 ,co::memory_model<co::v::sequential_consistent>
             >::type
         > set;
                 ,co::memory_model<co::v::sequential_consistent>
             >::type
         > set;
-        static_assert( set::options::dynamic_bucket_table, "Set has static bucket table" );
+        static_assert( set::traits::dynamic_bucket_table, "Set has static bucket table" );
 
         test_rcu_int<set>();
     }
 
         test_rcu_int<set>();
     }
@@ -156,7 +156,7 @@ namespace set {
                 ,co::item_counter< simple_item_counter >
             >::type
         > set;
                 ,co::item_counter< simple_item_counter >
             >::type
         > set;
-        static_assert( set::options::dynamic_bucket_table, "Set has static bucket table" );
+        static_assert( set::traits::dynamic_bucket_table, "Set has static bucket table" );
 
         test_rcu_int<set>();
     }
 
         test_rcu_int<set>();
     }
@@ -182,7 +182,7 @@ namespace set {
                 ,co::memory_model<co::v::relaxed_ordering>
             >::type
         > set;
                 ,co::memory_model<co::v::relaxed_ordering>
             >::type
         > set;
-        static_assert( !set::options::dynamic_bucket_table, "Set has dynamic bucket table" );
+        static_assert( !set::traits::dynamic_bucket_table, "Set has dynamic bucket table" );
 
         test_rcu_int<set>();
     }
 
         test_rcu_int<set>();
     }
@@ -206,7 +206,7 @@ namespace set {
                 ,co::memory_model<co::v::sequential_consistent>
             >::type
         > set;
                 ,co::memory_model<co::v::sequential_consistent>
             >::type
         > set;
-        static_assert( !set::options::dynamic_bucket_table, "Set has dynamic bucket table" );
+        static_assert( !set::traits::dynamic_bucket_table, "Set has dynamic bucket table" );
 
         test_rcu_int<set>();
     }
 
         test_rcu_int<set>();
     }
@@ -231,7 +231,7 @@ namespace set {
                 ,ci::split_list::dynamic_bucket_table<false>
             >::type
         > set;
                 ,ci::split_list::dynamic_bucket_table<false>
             >::type
         > set;
-        static_assert( !set::options::dynamic_bucket_table, "Set has dynamic bucket table" );
+        static_assert( !set::traits::dynamic_bucket_table, "Set has dynamic bucket table" );
 
         test_rcu_int<set>();
     }
 
         test_rcu_int<set>();
     }
@@ -258,7 +258,7 @@ namespace set {
                 ,co::memory_model<co::v::relaxed_ordering>
             >::type
         > set;
                 ,co::memory_model<co::v::relaxed_ordering>
             >::type
         > set;
-        static_assert( !set::options::dynamic_bucket_table, "Set has dynamic bucket table" );
+        static_assert( !set::traits::dynamic_bucket_table, "Set has dynamic bucket table" );
 
         test_rcu_int<set>();
     }
 
         test_rcu_int<set>();
     }
@@ -285,7 +285,7 @@ namespace set {
                 ,co::memory_model<co::v::sequential_consistent>
             >::type
         > set;
                 ,co::memory_model<co::v::sequential_consistent>
             >::type
         > set;
-        static_assert( !set::options::dynamic_bucket_table, "Set has dynamic bucket table" );
+        static_assert( !set::traits::dynamic_bucket_table, "Set has dynamic bucket table" );
 
         test_rcu_int<set>();
     }
 
         test_rcu_int<set>();
     }
@@ -313,7 +313,115 @@ namespace set {
                 ,ci::split_list::dynamic_bucket_table<false>
             >::type
         > set;
                 ,ci::split_list::dynamic_bucket_table<false>
             >::type
         > set;
-        static_assert( !set::options::dynamic_bucket_table, "Set has dynamic bucket table" );
+        static_assert( !set::traits::dynamic_bucket_table, "Set has dynamic bucket table" );
+
+        test_rcu_int<set>();
+    }
+
+    void IntrusiveHashSetHdrTest::split_dyn_RCU_GPT_base_cmpmix_stat_lazy()
+    {
+        typedef base_int_item< ci::split_list::node<ci::lazy_list::node<rcu_type> > > item;
+        struct list_traits : public ci::lazy_list::traits
+        {
+            typedef ci::lazy_list::base_hook< co::gc<rcu_type> > hook;
+            typedef IntrusiveHashSetHdrTest::less< item > less;
+            typedef cmp<item> compare;
+            typedef faked_disposer disposer;
+        };
+        typedef ci::LazyList< rcu_type, item, list_traits > ord_list;
+
+        struct set_traits : public ci::split_list::make_traits<ci::split_list::dynamic_bucket_table<true>>::type
+        {
+            typedef hash_int hash;
+            typedef simple_item_counter item_counter;
+            typedef ci::split_list::stat<> stat;
+        };
+        typedef ci::SplitListSet< rcu_type, ord_list, set_traits > set;
+        static_assert( set::traits::dynamic_bucket_table, "Set has static bucket table" );
+
+        test_rcu_int<set>();
+    }
+
+    void IntrusiveHashSetHdrTest::split_dyn_RCU_GPT_member_cmpmix_stat_lazy()
+    {
+        typedef member_int_item< ci::split_list::node< ci::lazy_list::node<rcu_type> > > item;
+        struct list_traits :
+            public ci::lazy_list::make_traits<
+                ci::opt::hook< ci::lazy_list::member_hook<
+                    offsetof( item, hMember ),
+                    co::gc<rcu_type>
+                > >
+                ,co::compare< cmp<item> >
+                ,co::less< less<item> >
+                ,ci::opt::disposer< faked_disposer >
+            >::type
+        {};
+        typedef ci::LazyList< rcu_type, item, list_traits > ord_list;
+
+        struct set_traits :
+            public ci::split_list::make_traits<
+                co::hash< hash_int >
+                ,co::item_counter< simple_item_counter >
+                ,co::stat< ci::split_list::stat<> >
+            >::type
+        {};
+        typedef ci::SplitListSet< rcu_type, ord_list, set_traits > set;
+        static_assert( set::traits::dynamic_bucket_table, "Set has static bucket table" );
+
+        test_rcu_int<set>();
+    }
+
+    void IntrusiveHashSetHdrTest::split_st_RCU_GPT_base_cmpmix_stat_lazy()
+    {
+        typedef base_int_item< ci::split_list::node<ci::lazy_list::node<rcu_type> > > item;
+        typedef ci::LazyList< rcu_type
+            ,item
+            ,ci::lazy_list::make_traits<
+                ci::opt::hook< ci::lazy_list::base_hook< co::gc<rcu_type> > >
+                ,co::less< less<item> >
+                ,co::compare< cmp<item> >
+                ,ci::opt::disposer< faked_disposer >
+            >::type
+        >    ord_list;
+
+        typedef ci::SplitListSet< rcu_type, ord_list,
+            ci::split_list::make_traits<
+                co::hash< hash_int >
+                ,co::item_counter< simple_item_counter >
+                ,ci::split_list::dynamic_bucket_table<false>
+                ,co::stat< ci::split_list::stat<>>
+            >::type
+        > set;
+        static_assert( !set::traits::dynamic_bucket_table, "Set has dynamic bucket table" );
+
+        test_rcu_int<set>();
+    }
+
+    void IntrusiveHashSetHdrTest::split_st_RCU_GPT_member_cmpmix_stat_lazy()
+    {
+        typedef member_int_item< ci::split_list::node< ci::lazy_list::node<rcu_type> > > item;
+        typedef ci::LazyList< rcu_type
+            ,item
+            ,ci::lazy_list::make_traits<
+                ci::opt::hook< ci::lazy_list::member_hook<
+                    offsetof( item, hMember ),
+                    co::gc<rcu_type>
+                > >
+                ,co::compare< cmp<item> >
+                ,co::less< less<item> >
+                ,ci::opt::disposer< faked_disposer >
+            >::type
+        >    ord_list;
+
+        typedef ci::SplitListSet< rcu_type, ord_list,
+            ci::split_list::make_traits<
+                co::hash< hash_int >
+                ,co::item_counter< simple_item_counter >
+                ,ci::split_list::dynamic_bucket_table<false>
+                ,co::stat< ci::split_list::stat<>>
+            >::type
+        > set;
+        static_assert( !set::traits::dynamic_bucket_table, "Set has dynamic bucket table" );
 
         test_rcu_int<set>();
     }
 
         test_rcu_int<set>();
     }
index 1731368e32d0ccf46f9f99e325dbe744ca8c9c0b..8701d2737d6869c609f4724a55683538aa8510fc 100644 (file)
@@ -32,7 +32,7 @@ namespace set {
                 ,co::memory_model<co::v::relaxed_ordering>
             >::type
         > set;
                 ,co::memory_model<co::v::relaxed_ordering>
             >::type
         > set;
-        static_assert( set::options::dynamic_bucket_table, "Set has static bucket table" );
+        static_assert( set::traits::dynamic_bucket_table, "Set has static bucket table" );
 
         test_rcu_int<set>();
 #endif
 
         test_rcu_int<set>();
 #endif
@@ -57,7 +57,7 @@ namespace set {
                 ,co::memory_model<co::v::sequential_consistent>
             >::type
         > set;
                 ,co::memory_model<co::v::sequential_consistent>
             >::type
         > set;
-        static_assert( set::options::dynamic_bucket_table, "Set has static bucket table" );
+        static_assert( set::traits::dynamic_bucket_table, "Set has static bucket table" );
 
         test_rcu_int<set>();
 #endif
 
         test_rcu_int<set>();
 #endif
@@ -84,7 +84,7 @@ namespace set {
                 ,ci::split_list::dynamic_bucket_table<true>
             >::type
         > set;
                 ,ci::split_list::dynamic_bucket_table<true>
             >::type
         > set;
-        static_assert( set::options::dynamic_bucket_table, "Set has static bucket table" );
+        static_assert( set::traits::dynamic_bucket_table, "Set has static bucket table" );
 
         test_rcu_int<set>();
 #endif
 
         test_rcu_int<set>();
 #endif
@@ -111,7 +111,7 @@ namespace set {
                 co::hash< hash_int >
             >::type
         > set;
                 co::hash< hash_int >
             >::type
         > set;
-        static_assert( set::options::dynamic_bucket_table, "Set has static bucket table" );
+        static_assert( set::traits::dynamic_bucket_table, "Set has static bucket table" );
 
         test_rcu_int<set>();
 #endif
 
         test_rcu_int<set>();
 #endif
@@ -139,7 +139,7 @@ namespace set {
                 ,co::memory_model<co::v::relaxed_ordering>
             >::type
         > set;
                 ,co::memory_model<co::v::relaxed_ordering>
             >::type
         > set;
-        static_assert( set::options::dynamic_bucket_table, "Set has static bucket table" );
+        static_assert( set::traits::dynamic_bucket_table, "Set has static bucket table" );
 
         test_rcu_int<set>();
 #endif
 
         test_rcu_int<set>();
 #endif
@@ -169,7 +169,7 @@ namespace set {
                 ,co::memory_model<co::v::sequential_consistent>
             >::type
         > set;
                 ,co::memory_model<co::v::sequential_consistent>
             >::type
         > set;
-        static_assert( set::options::dynamic_bucket_table, "Set has static bucket table" );
+        static_assert( set::traits::dynamic_bucket_table, "Set has static bucket table" );
 
         test_rcu_int<set>();
 #endif
 
         test_rcu_int<set>();
 #endif
@@ -197,7 +197,7 @@ namespace set {
                 ,co::memory_model<co::v::relaxed_ordering>
             >::type
         > set;
                 ,co::memory_model<co::v::relaxed_ordering>
             >::type
         > set;
-        static_assert( !set::options::dynamic_bucket_table, "Set has dynamic bucket table" );
+        static_assert( !set::traits::dynamic_bucket_table, "Set has dynamic bucket table" );
 
         test_rcu_int<set>();
 #endif
 
         test_rcu_int<set>();
 #endif
@@ -223,7 +223,7 @@ namespace set {
                 ,co::memory_model<co::v::sequential_consistent>
             >::type
         > set;
                 ,co::memory_model<co::v::sequential_consistent>
             >::type
         > set;
-        static_assert( !set::options::dynamic_bucket_table, "Set has dynamic bucket table" );
+        static_assert( !set::traits::dynamic_bucket_table, "Set has dynamic bucket table" );
 
         test_rcu_int<set>();
 #endif
 
         test_rcu_int<set>();
 #endif
@@ -250,7 +250,7 @@ namespace set {
                 ,ci::split_list::dynamic_bucket_table<false>
             >::type
         > set;
                 ,ci::split_list::dynamic_bucket_table<false>
             >::type
         > set;
-        static_assert( !set::options::dynamic_bucket_table, "Set has dynamic bucket table" );
+        static_assert( !set::traits::dynamic_bucket_table, "Set has dynamic bucket table" );
 
         test_rcu_int<set>();
 #endif
 
         test_rcu_int<set>();
 #endif
@@ -279,7 +279,7 @@ namespace set {
                 ,co::memory_model<co::v::relaxed_ordering>
             >::type
         > set;
                 ,co::memory_model<co::v::relaxed_ordering>
             >::type
         > set;
-        static_assert( !set::options::dynamic_bucket_table, "Set has dynamic bucket table" );
+        static_assert( !set::traits::dynamic_bucket_table, "Set has dynamic bucket table" );
 
         test_rcu_int<set>();
 #endif
 
         test_rcu_int<set>();
 #endif
@@ -308,7 +308,7 @@ namespace set {
                 ,co::memory_model<co::v::sequential_consistent>
             >::type
         > set;
                 ,co::memory_model<co::v::sequential_consistent>
             >::type
         > set;
-        static_assert( !set::options::dynamic_bucket_table, "Set has dynamic bucket table" );
+        static_assert( !set::traits::dynamic_bucket_table, "Set has dynamic bucket table" );
 
         test_rcu_int<set>();
 #endif
 
         test_rcu_int<set>();
 #endif
@@ -338,11 +338,128 @@ namespace set {
                 ,ci::split_list::dynamic_bucket_table<false>
             >::type
         > set;
                 ,ci::split_list::dynamic_bucket_table<false>
             >::type
         > set;
-        static_assert( !set::options::dynamic_bucket_table, "Set has dynamic bucket table" );
+        static_assert( !set::traits::dynamic_bucket_table, "Set has dynamic bucket table" );
 
         test_rcu_int<set>();
 #endif
     }
 
 
         test_rcu_int<set>();
 #endif
     }
 
+    void IntrusiveHashSetHdrTest::split_dyn_RCU_SHB_base_cmpmix_stat()
+    {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        typedef base_int_item< ci::split_list::node<ci::michael_list::node<rcu_type> > > item;
+        struct list_traits : public ci::michael_list::traits
+        {
+            typedef ci::michael_list::base_hook< co::gc<rcu_type> > hook;
+            typedef IntrusiveHashSetHdrTest::less<item> less;
+            typedef cmp<item> compare;
+            typedef faked_disposer disposer;
+        };
+        typedef ci::MichaelList< rcu_type, item, list_traits > ord_list;
+
+        struct set_traits : public ci::split_list::make_traits<ci::split_list::dynamic_bucket_table<true> >::type
+        {
+            typedef hash_int hash;
+            typedef simple_item_counter item_counter;
+            typedef ci::split_list::stat<> stat;
+        };
+        typedef ci::SplitListSet< rcu_type, ord_list, set_traits > set;
+
+        static_assert( set::traits::dynamic_bucket_table, "Set has static bucket table" );
+
+        test_rcu_int<set>();
+#endif
+    }
+
+    void IntrusiveHashSetHdrTest::split_dyn_RCU_SHB_member_cmpmix_stat()
+    {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        typedef member_int_item< ci::split_list::node< ci::michael_list::node<rcu_type> > > item;
+        struct list_traits :
+            public ci::michael_list::make_traits<
+                ci::opt::hook< ci::michael_list::member_hook<
+                    offsetof( item, hMember ),
+                    co::gc<rcu_type>
+                > >
+                ,co::compare< cmp<item> >
+                ,co::less< less<item> >
+                ,ci::opt::disposer< faked_disposer >
+            >::type
+        {};
+        typedef ci::MichaelList< rcu_type, item, list_traits > ord_list;
+
+        struct set_traits :
+            public ci::split_list::make_traits<
+                co::hash< hash_int >
+                ,co::item_counter< simple_item_counter >
+                ,co::memory_model<co::v::sequential_consistent>
+                ,co::stat< ci::split_list::stat<>>
+            >::type
+        {};
+        typedef ci::SplitListSet< rcu_type, ord_list, set_traits > set;
+        static_assert( set::traits::dynamic_bucket_table, "Set has static bucket table" );
+
+        test_rcu_int<set>();
+#endif
+    }
+
+    void IntrusiveHashSetHdrTest::split_st_RCU_SHB_base_cmpmix_stat()
+    {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        typedef base_int_item< ci::split_list::node<ci::michael_list::node<rcu_type> > > item;
+        typedef ci::MichaelList< rcu_type
+            ,item
+            ,ci::michael_list::make_traits<
+                ci::opt::hook< ci::michael_list::base_hook< co::gc<rcu_type> > >
+                ,co::less< less<item> >
+                ,co::compare< cmp<item> >
+                ,ci::opt::disposer< faked_disposer >
+            >::type
+        >    ord_list;
+
+        typedef ci::SplitListSet< rcu_type, ord_list,
+            ci::split_list::make_traits<
+                co::hash< hash_int >
+                ,co::item_counter< simple_item_counter >
+                ,ci::split_list::dynamic_bucket_table<false>
+                ,co::stat< ci::split_list::stat<>>
+            >::type
+        > set;
+        static_assert( !set::traits::dynamic_bucket_table, "Set has dynamic bucket table" );
+
+        test_rcu_int<set>();
+#endif
+    }
+
+    void IntrusiveHashSetHdrTest::split_st_RCU_SHB_member_cmpmix_stat()
+    {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        typedef member_int_item< ci::split_list::node< ci::michael_list::node<rcu_type> > > item;
+        typedef ci::MichaelList< rcu_type
+            ,item
+            ,ci::michael_list::make_traits<
+                ci::opt::hook< ci::michael_list::member_hook<
+                    offsetof( item, hMember ),
+                    co::gc<rcu_type>
+                > >
+                ,co::compare< cmp<item> >
+                ,co::less< less<item> >
+                ,ci::opt::disposer< faked_disposer >
+            >::type
+        >    ord_list;
+
+        typedef ci::SplitListSet< rcu_type, ord_list,
+            ci::split_list::make_traits<
+                co::hash< hash_int >
+                ,co::item_counter< simple_item_counter >
+                ,ci::split_list::dynamic_bucket_table<false>
+                ,co::stat< ci::split_list::stat<> >
+            >::type
+        > set;
+        static_assert( !set::traits::dynamic_bucket_table, "Set has dynamic bucket table" );
+
+        test_rcu_int<set>();
+#endif
+    }
 
 } // namespace set
 
 } // namespace set
index cc1f22a767390db76a7a49dfa5157f619900c1ac..3c809e30c4df2ffb5eafd287588495c1d7b9939e 100644 (file)
@@ -32,7 +32,7 @@ namespace set {
                 ,co::memory_model<co::v::relaxed_ordering>
             >::type
         > set;
                 ,co::memory_model<co::v::relaxed_ordering>
             >::type
         > set;
-        static_assert( set::options::dynamic_bucket_table, "Set has static bucket table" );
+        static_assert( set::traits::dynamic_bucket_table, "Set has static bucket table" );
 
         test_rcu_int<set>();
 #endif
 
         test_rcu_int<set>();
 #endif
@@ -57,7 +57,7 @@ namespace set {
                 ,co::memory_model<co::v::sequential_consistent>
             >::type
         > set;
                 ,co::memory_model<co::v::sequential_consistent>
             >::type
         > set;
-        static_assert( set::options::dynamic_bucket_table, "Set has static bucket table" );
+        static_assert( set::traits::dynamic_bucket_table, "Set has static bucket table" );
 
         test_rcu_int<set>();
 #endif
 
         test_rcu_int<set>();
 #endif
@@ -84,7 +84,7 @@ namespace set {
                 ,ci::split_list::dynamic_bucket_table<true>
             >::type
         > set;
                 ,ci::split_list::dynamic_bucket_table<true>
             >::type
         > set;
-        static_assert( set::options::dynamic_bucket_table, "Set has static bucket table" );
+        static_assert( set::traits::dynamic_bucket_table, "Set has static bucket table" );
 
         test_rcu_int<set>();
 #endif
 
         test_rcu_int<set>();
 #endif
@@ -112,7 +112,7 @@ namespace set {
                 ,co::memory_model<co::v::relaxed_ordering>
             >::type
         > set;
                 ,co::memory_model<co::v::relaxed_ordering>
             >::type
         > set;
-        static_assert( set::options::dynamic_bucket_table, "Set has static bucket table" );
+        static_assert( set::traits::dynamic_bucket_table, "Set has static bucket table" );
 
         test_rcu_int<set>();
 #endif
 
         test_rcu_int<set>();
 #endif
@@ -140,7 +140,7 @@ namespace set {
                 ,co::memory_model<co::v::sequential_consistent>
             >::type
         > set;
                 ,co::memory_model<co::v::sequential_consistent>
             >::type
         > set;
-        static_assert( set::options::dynamic_bucket_table, "Set has static bucket table" );
+        static_assert( set::traits::dynamic_bucket_table, "Set has static bucket table" );
 
         test_rcu_int<set>();
 #endif
 
         test_rcu_int<set>();
 #endif
@@ -169,7 +169,7 @@ namespace set {
                 ,co::item_counter< simple_item_counter >
             >::type
         > set;
                 ,co::item_counter< simple_item_counter >
             >::type
         > set;
-        static_assert( set::options::dynamic_bucket_table, "Set has static bucket table" );
+        static_assert( set::traits::dynamic_bucket_table, "Set has static bucket table" );
 
         test_rcu_int<set>();
 #endif
 
         test_rcu_int<set>();
 #endif
@@ -197,7 +197,7 @@ namespace set {
                 ,co::memory_model<co::v::relaxed_ordering>
             >::type
         > set;
                 ,co::memory_model<co::v::relaxed_ordering>
             >::type
         > set;
-        static_assert( !set::options::dynamic_bucket_table, "Set has dynamic bucket table" );
+        static_assert( !set::traits::dynamic_bucket_table, "Set has dynamic bucket table" );
 
         test_rcu_int<set>();
 #endif
 
         test_rcu_int<set>();
 #endif
@@ -223,7 +223,7 @@ namespace set {
                 ,co::memory_model<co::v::sequential_consistent>
             >::type
         > set;
                 ,co::memory_model<co::v::sequential_consistent>
             >::type
         > set;
-        static_assert( !set::options::dynamic_bucket_table, "Set has dynamic bucket table" );
+        static_assert( !set::traits::dynamic_bucket_table, "Set has dynamic bucket table" );
 
         test_rcu_int<set>();
 #endif
 
         test_rcu_int<set>();
 #endif
@@ -250,7 +250,7 @@ namespace set {
                 ,ci::split_list::dynamic_bucket_table<false>
             >::type
         > set;
                 ,ci::split_list::dynamic_bucket_table<false>
             >::type
         > set;
-        static_assert( !set::options::dynamic_bucket_table, "Set has dynamic bucket table" );
+        static_assert( !set::traits::dynamic_bucket_table, "Set has dynamic bucket table" );
 
         test_rcu_int<set>();
 #endif
 
         test_rcu_int<set>();
 #endif
@@ -279,7 +279,7 @@ namespace set {
                 ,co::memory_model<co::v::relaxed_ordering>
             >::type
         > set;
                 ,co::memory_model<co::v::relaxed_ordering>
             >::type
         > set;
-        static_assert( !set::options::dynamic_bucket_table, "Set has dynamic bucket table" );
+        static_assert( !set::traits::dynamic_bucket_table, "Set has dynamic bucket table" );
 
         test_rcu_int<set>();
 #endif
 
         test_rcu_int<set>();
 #endif
@@ -308,7 +308,7 @@ namespace set {
                 ,co::memory_model<co::v::sequential_consistent>
             >::type
         > set;
                 ,co::memory_model<co::v::sequential_consistent>
             >::type
         > set;
-        static_assert( !set::options::dynamic_bucket_table, "Set has dynamic bucket table" );
+        static_assert( !set::traits::dynamic_bucket_table, "Set has dynamic bucket table" );
 
         test_rcu_int<set>();
 #endif
 
         test_rcu_int<set>();
 #endif
@@ -338,7 +338,123 @@ namespace set {
                 ,ci::split_list::dynamic_bucket_table<false>
             >::type
         > set;
                 ,ci::split_list::dynamic_bucket_table<false>
             >::type
         > set;
-        static_assert( !set::options::dynamic_bucket_table, "Set has dynamic bucket table" );
+        static_assert( !set::traits::dynamic_bucket_table, "Set has dynamic bucket table" );
+
+        test_rcu_int<set>();
+#endif
+    }
+
+    void IntrusiveHashSetHdrTest::split_dyn_RCU_SHB_base_cmpmix_stat_lazy()
+    {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        typedef base_int_item< ci::split_list::node<ci::lazy_list::node<rcu_type> > > item;
+        struct list_traits : public ci::lazy_list::traits
+        {
+            typedef ci::lazy_list::base_hook< co::gc<rcu_type> > hook;
+            typedef IntrusiveHashSetHdrTest::less< item > less;
+            typedef cmp<item> compare;
+            typedef faked_disposer disposer;
+        };
+        typedef ci::LazyList< rcu_type, item, list_traits > ord_list;
+
+        struct set_traits : public ci::split_list::make_traits<ci::split_list::dynamic_bucket_table<true>>::type
+        {
+            typedef hash_int hash;
+            typedef simple_item_counter item_counter;
+            typedef ci::split_list::stat<> stat;
+        };
+        typedef ci::SplitListSet< rcu_type, ord_list, set_traits > set;
+        static_assert( set::traits::dynamic_bucket_table, "Set has static bucket table" );
+
+        test_rcu_int<set>();
+#endif
+    }
+
+    void IntrusiveHashSetHdrTest::split_dyn_RCU_SHB_member_cmpmix_stat_lazy()
+    {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        typedef member_int_item< ci::split_list::node< ci::lazy_list::node<rcu_type> > > item;
+        struct list_traits :
+            public ci::lazy_list::make_traits<
+                ci::opt::hook< ci::lazy_list::member_hook<
+                    offsetof( item, hMember ),
+                    co::gc<rcu_type>
+                > >
+                ,co::compare< cmp<item> >
+                ,co::less< less<item> >
+                ,ci::opt::disposer< faked_disposer >
+            >::type
+        {};
+        typedef ci::LazyList< rcu_type, item, list_traits > ord_list;
+
+        struct set_traits :
+            public ci::split_list::make_traits<
+                co::hash< hash_int >
+                ,co::item_counter< simple_item_counter >
+                ,co::stat< ci::split_list::stat<> >
+            >::type
+        {};
+        typedef ci::SplitListSet< rcu_type, ord_list, set_traits > set;
+        static_assert( set::traits::dynamic_bucket_table, "Set has static bucket table" );
+
+        test_rcu_int<set>();
+#endif
+    }
+
+    void IntrusiveHashSetHdrTest::split_st_RCU_SHB_base_cmpmix_stat_lazy()
+    {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        typedef base_int_item< ci::split_list::node<ci::lazy_list::node<rcu_type> > > item;
+        typedef ci::LazyList< rcu_type
+            ,item
+            ,ci::lazy_list::make_traits<
+                ci::opt::hook< ci::lazy_list::base_hook< co::gc<rcu_type> > >
+                ,co::less< less<item> >
+                ,co::compare< cmp<item> >
+                ,ci::opt::disposer< faked_disposer >
+            >::type
+        >    ord_list;
+
+        typedef ci::SplitListSet< rcu_type, ord_list,
+            ci::split_list::make_traits<
+                co::hash< hash_int >
+                ,co::item_counter< simple_item_counter >
+                ,ci::split_list::dynamic_bucket_table<false>
+                ,co::stat< ci::split_list::stat<>>
+            >::type
+        > set;
+        static_assert( !set::traits::dynamic_bucket_table, "Set has dynamic bucket table" );
+
+        test_rcu_int<set>();
+#endif
+    }
+
+    void IntrusiveHashSetHdrTest::split_st_RCU_SHB_member_cmpmix_stat_lazy()
+    {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        typedef member_int_item< ci::split_list::node< ci::lazy_list::node<rcu_type> > > item;
+        typedef ci::LazyList< rcu_type
+            ,item
+            ,ci::lazy_list::make_traits<
+                ci::opt::hook< ci::lazy_list::member_hook<
+                    offsetof( item, hMember ),
+                    co::gc<rcu_type>
+                > >
+                ,co::compare< cmp<item> >
+                ,co::less< less<item> >
+                ,ci::opt::disposer< faked_disposer >
+            >::type
+        >    ord_list;
+
+        typedef ci::SplitListSet< rcu_type, ord_list,
+            ci::split_list::make_traits<
+                co::hash< hash_int >
+                ,co::item_counter< simple_item_counter >
+                ,ci::split_list::dynamic_bucket_table<false>
+                ,co::stat< ci::split_list::stat<>>
+            >::type
+        > set;
+        static_assert( !set::traits::dynamic_bucket_table, "Set has dynamic bucket table" );
 
         test_rcu_int<set>();
 #endif
 
         test_rcu_int<set>();
 #endif
index a82dc518786e27572ace2e99fa1c5a400ea34658..8bf2323d0d938437c1ad005a63d8829e74364d13 100644 (file)
@@ -32,7 +32,7 @@ namespace set {
                 ,co::memory_model<co::v::relaxed_ordering>
             >::type
         > set;
                 ,co::memory_model<co::v::relaxed_ordering>
             >::type
         > set;
-        static_assert( set::options::dynamic_bucket_table, "Set has static bucket table" );
+        static_assert( set::traits::dynamic_bucket_table, "Set has static bucket table" );
 
         test_rcu_int<set>();
 #endif
 
         test_rcu_int<set>();
 #endif
@@ -57,7 +57,7 @@ namespace set {
                 ,co::memory_model<co::v::sequential_consistent>
             >::type
         > set;
                 ,co::memory_model<co::v::sequential_consistent>
             >::type
         > set;
-        static_assert( set::options::dynamic_bucket_table, "Set has static bucket table" );
+        static_assert( set::traits::dynamic_bucket_table, "Set has static bucket table" );
 
         test_rcu_int<set>();
 #endif
 
         test_rcu_int<set>();
 #endif
@@ -84,7 +84,7 @@ namespace set {
                 ,ci::split_list::dynamic_bucket_table<true>
             >::type
         > set;
                 ,ci::split_list::dynamic_bucket_table<true>
             >::type
         > set;
-        static_assert( set::options::dynamic_bucket_table, "Set has static bucket table" );
+        static_assert( set::traits::dynamic_bucket_table, "Set has static bucket table" );
 
         test_rcu_int<set>();
 #endif
 
         test_rcu_int<set>();
 #endif
@@ -111,7 +111,7 @@ namespace set {
                 co::hash< hash_int >
             >::type
         > set;
                 co::hash< hash_int >
             >::type
         > set;
-        static_assert( set::options::dynamic_bucket_table, "Set has static bucket table" );
+        static_assert( set::traits::dynamic_bucket_table, "Set has static bucket table" );
 
         test_rcu_int<set>();
 #endif
 
         test_rcu_int<set>();
 #endif
@@ -139,7 +139,7 @@ namespace set {
                 ,co::memory_model<co::v::relaxed_ordering>
             >::type
         > set;
                 ,co::memory_model<co::v::relaxed_ordering>
             >::type
         > set;
-        static_assert( set::options::dynamic_bucket_table, "Set has static bucket table" );
+        static_assert( set::traits::dynamic_bucket_table, "Set has static bucket table" );
 
         test_rcu_int<set>();
 #endif
 
         test_rcu_int<set>();
 #endif
@@ -169,7 +169,7 @@ namespace set {
                 ,co::memory_model<co::v::sequential_consistent>
             >::type
         > set;
                 ,co::memory_model<co::v::sequential_consistent>
             >::type
         > set;
-        static_assert( set::options::dynamic_bucket_table, "Set has static bucket table" );
+        static_assert( set::traits::dynamic_bucket_table, "Set has static bucket table" );
 
         test_rcu_int<set>();
 #endif
 
         test_rcu_int<set>();
 #endif
@@ -197,7 +197,7 @@ namespace set {
                 ,co::memory_model<co::v::relaxed_ordering>
             >::type
         > set;
                 ,co::memory_model<co::v::relaxed_ordering>
             >::type
         > set;
-        static_assert( !set::options::dynamic_bucket_table, "Set has dynamic bucket table" );
+        static_assert( !set::traits::dynamic_bucket_table, "Set has dynamic bucket table" );
 
         test_rcu_int<set>();
 #endif
 
         test_rcu_int<set>();
 #endif
@@ -223,7 +223,7 @@ namespace set {
                 ,co::memory_model<co::v::sequential_consistent>
             >::type
         > set;
                 ,co::memory_model<co::v::sequential_consistent>
             >::type
         > set;
-        static_assert( !set::options::dynamic_bucket_table, "Set has dynamic bucket table" );
+        static_assert( !set::traits::dynamic_bucket_table, "Set has dynamic bucket table" );
 
         test_rcu_int<set>();
 #endif
 
         test_rcu_int<set>();
 #endif
@@ -250,7 +250,7 @@ namespace set {
                 ,ci::split_list::dynamic_bucket_table<false>
             >::type
         > set;
                 ,ci::split_list::dynamic_bucket_table<false>
             >::type
         > set;
-        static_assert( !set::options::dynamic_bucket_table, "Set has dynamic bucket table" );
+        static_assert( !set::traits::dynamic_bucket_table, "Set has dynamic bucket table" );
 
         test_rcu_int<set>();
 #endif
 
         test_rcu_int<set>();
 #endif
@@ -279,7 +279,7 @@ namespace set {
                 ,co::memory_model<co::v::relaxed_ordering>
             >::type
         > set;
                 ,co::memory_model<co::v::relaxed_ordering>
             >::type
         > set;
-        static_assert( !set::options::dynamic_bucket_table, "Set has dynamic bucket table" );
+        static_assert( !set::traits::dynamic_bucket_table, "Set has dynamic bucket table" );
 
         test_rcu_int<set>();
 #endif
 
         test_rcu_int<set>();
 #endif
@@ -308,7 +308,7 @@ namespace set {
                 ,co::memory_model<co::v::sequential_consistent>
             >::type
         > set;
                 ,co::memory_model<co::v::sequential_consistent>
             >::type
         > set;
-        static_assert( !set::options::dynamic_bucket_table, "Set has dynamic bucket table" );
+        static_assert( !set::traits::dynamic_bucket_table, "Set has dynamic bucket table" );
 
         test_rcu_int<set>();
 #endif
 
         test_rcu_int<set>();
 #endif
@@ -338,7 +338,125 @@ namespace set {
                 ,ci::split_list::dynamic_bucket_table<false>
             >::type
         > set;
                 ,ci::split_list::dynamic_bucket_table<false>
             >::type
         > set;
-        static_assert( !set::options::dynamic_bucket_table, "Set has dynamic bucket table" );
+        static_assert( !set::traits::dynamic_bucket_table, "Set has dynamic bucket table" );
+
+        test_rcu_int<set>();
+#endif
+    }
+
+    void IntrusiveHashSetHdrTest::split_dyn_RCU_SHT_base_cmpmix_stat()
+    {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        typedef base_int_item< ci::split_list::node<ci::michael_list::node<rcu_type> > > item;
+        struct list_traits : public ci::michael_list::traits
+        {
+            typedef ci::michael_list::base_hook< co::gc<rcu_type> > hook;
+            typedef IntrusiveHashSetHdrTest::less<item> less;
+            typedef cmp<item> compare;
+            typedef faked_disposer disposer;
+        };
+        typedef ci::MichaelList< rcu_type, item, list_traits > ord_list;
+
+        struct set_traits : public ci::split_list::make_traits<ci::split_list::dynamic_bucket_table<true> >::type
+        {
+            typedef hash_int hash;
+            typedef simple_item_counter item_counter;
+            typedef ci::split_list::stat<> stat;
+        };
+        typedef ci::SplitListSet< rcu_type, ord_list, set_traits > set;
+
+        static_assert( set::traits::dynamic_bucket_table, "Set has static bucket table" );
+
+        test_rcu_int<set>();
+#endif
+    }
+
+    void IntrusiveHashSetHdrTest::split_dyn_RCU_SHT_member_cmpmix_stat()
+    {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        typedef member_int_item< ci::split_list::node< ci::michael_list::node<rcu_type> > > item;
+        struct list_traits :
+            public ci::michael_list::make_traits<
+                ci::opt::hook< ci::michael_list::member_hook<
+                    offsetof( item, hMember ),
+                    co::gc<rcu_type>
+                > >
+                ,co::compare< cmp<item> >
+                ,co::less< less<item> >
+                ,ci::opt::disposer< faked_disposer >
+            >::type
+        {};
+        typedef ci::MichaelList< rcu_type, item, list_traits > ord_list;
+
+        struct set_traits :
+            public ci::split_list::make_traits<
+                co::hash< hash_int >
+                ,co::item_counter< simple_item_counter >
+                ,co::memory_model<co::v::sequential_consistent>
+                ,co::stat< ci::split_list::stat<>>
+            >::type
+        {};
+        typedef ci::SplitListSet< rcu_type, ord_list, set_traits > set;
+        static_assert( set::traits::dynamic_bucket_table, "Set has static bucket table" );
+
+        test_rcu_int<set>();
+#endif
+    }
+
+    void IntrusiveHashSetHdrTest::split_st_RCU_SHT_base_cmpmix_stat()
+    {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        typedef base_int_item< ci::split_list::node<ci::michael_list::node<rcu_type> > > item;
+        typedef ci::MichaelList< rcu_type
+            ,item
+            ,ci::michael_list::make_traits<
+                ci::opt::hook< ci::michael_list::base_hook< co::gc<rcu_type> > >
+                ,co::less< less<item> >
+                ,co::compare< cmp<item> >
+                ,ci::opt::disposer< faked_disposer >
+            >::type
+        >    ord_list;
+
+        typedef ci::SplitListSet< rcu_type, ord_list,
+            ci::split_list::make_traits<
+                co::hash< hash_int >
+                ,co::item_counter< simple_item_counter >
+                ,ci::split_list::dynamic_bucket_table<false>
+                ,co::stat< ci::split_list::stat<>>
+            >::type
+        > set;
+        static_assert( !set::traits::dynamic_bucket_table, "Set has dynamic bucket table" );
+
+        test_rcu_int<set>();
+#endif
+    }
+
+    void IntrusiveHashSetHdrTest::split_st_RCU_SHT_member_cmpmix_stat()
+    {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        typedef member_int_item< ci::split_list::node< ci::michael_list::node<rcu_type> > > item;
+        typedef ci::MichaelList< rcu_type
+            ,item
+            ,ci::michael_list::make_traits<
+                ci::opt::hook< ci::michael_list::member_hook<
+                    offsetof( item, hMember ),
+                    co::gc<rcu_type>
+                > >
+                ,co::compare< cmp<item> >
+                ,co::less< less<item> >
+                ,ci::opt::disposer< faked_disposer >
+            >::type
+        >    ord_list;
+
+        typedef ci::SplitListSet< rcu_type, ord_list,
+            ci::split_list::make_traits<
+                co::hash< hash_int >
+                ,co::item_counter< simple_item_counter >
+                ,ci::split_list::dynamic_bucket_table<false>
+                ,co::stat< ci::split_list::stat<> >
+            >::type
+        > set;
+        static_assert( !set::traits::dynamic_bucket_table, "Set has dynamic bucket table" );
 
         test_rcu_int<set>();
 #endif
 
         test_rcu_int<set>();
 #endif
index 088607fd7be502f7c9615e73f4eae66f7b34ae7d..6bd9c7ae417538155a742bfa19ff89a730ad50b7 100644 (file)
@@ -32,7 +32,7 @@ namespace set {
                 ,co::memory_model<co::v::relaxed_ordering>
             >::type
         > set;
                 ,co::memory_model<co::v::relaxed_ordering>
             >::type
         > set;
-        static_assert( set::options::dynamic_bucket_table, "Set has static bucket table" );
+        static_assert( set::traits::dynamic_bucket_table, "Set has static bucket table" );
 
         test_rcu_int<set>();
 #endif
 
         test_rcu_int<set>();
 #endif
@@ -57,7 +57,7 @@ namespace set {
                 ,co::memory_model<co::v::sequential_consistent>
             >::type
         > set;
                 ,co::memory_model<co::v::sequential_consistent>
             >::type
         > set;
-        static_assert( set::options::dynamic_bucket_table, "Set has static bucket table" );
+        static_assert( set::traits::dynamic_bucket_table, "Set has static bucket table" );
 
         test_rcu_int<set>();
 #endif
 
         test_rcu_int<set>();
 #endif
@@ -84,7 +84,7 @@ namespace set {
                 ,ci::split_list::dynamic_bucket_table<true>
             >::type
         > set;
                 ,ci::split_list::dynamic_bucket_table<true>
             >::type
         > set;
-        static_assert( set::options::dynamic_bucket_table, "Set has static bucket table" );
+        static_assert( set::traits::dynamic_bucket_table, "Set has static bucket table" );
 
         test_rcu_int<set>();
 #endif
 
         test_rcu_int<set>();
 #endif
@@ -112,7 +112,7 @@ namespace set {
                 ,co::memory_model<co::v::relaxed_ordering>
             >::type
         > set;
                 ,co::memory_model<co::v::relaxed_ordering>
             >::type
         > set;
-        static_assert( set::options::dynamic_bucket_table, "Set has static bucket table" );
+        static_assert( set::traits::dynamic_bucket_table, "Set has static bucket table" );
 
         test_rcu_int<set>();
 #endif
 
         test_rcu_int<set>();
 #endif
@@ -140,7 +140,7 @@ namespace set {
                 ,co::memory_model<co::v::sequential_consistent>
             >::type
         > set;
                 ,co::memory_model<co::v::sequential_consistent>
             >::type
         > set;
-        static_assert( set::options::dynamic_bucket_table, "Set has static bucket table" );
+        static_assert( set::traits::dynamic_bucket_table, "Set has static bucket table" );
 
         test_rcu_int<set>();
 #endif
 
         test_rcu_int<set>();
 #endif
@@ -169,7 +169,7 @@ namespace set {
                 ,co::item_counter< simple_item_counter >
             >::type
         > set;
                 ,co::item_counter< simple_item_counter >
             >::type
         > set;
-        static_assert( set::options::dynamic_bucket_table, "Set has static bucket table" );
+        static_assert( set::traits::dynamic_bucket_table, "Set has static bucket table" );
 
         test_rcu_int<set>();
 #endif
 
         test_rcu_int<set>();
 #endif
@@ -197,7 +197,7 @@ namespace set {
                 ,co::memory_model<co::v::relaxed_ordering>
             >::type
         > set;
                 ,co::memory_model<co::v::relaxed_ordering>
             >::type
         > set;
-        static_assert( !set::options::dynamic_bucket_table, "Set has dynamic bucket table" );
+        static_assert( !set::traits::dynamic_bucket_table, "Set has dynamic bucket table" );
 
         test_rcu_int<set>();
 #endif
 
         test_rcu_int<set>();
 #endif
@@ -223,7 +223,7 @@ namespace set {
                 ,co::memory_model<co::v::sequential_consistent>
             >::type
         > set;
                 ,co::memory_model<co::v::sequential_consistent>
             >::type
         > set;
-        static_assert( !set::options::dynamic_bucket_table, "Set has dynamic bucket table" );
+        static_assert( !set::traits::dynamic_bucket_table, "Set has dynamic bucket table" );
 
         test_rcu_int<set>();
 #endif
 
         test_rcu_int<set>();
 #endif
@@ -250,7 +250,7 @@ namespace set {
                 ,ci::split_list::dynamic_bucket_table<false>
             >::type
         > set;
                 ,ci::split_list::dynamic_bucket_table<false>
             >::type
         > set;
-        static_assert( !set::options::dynamic_bucket_table, "Set has dynamic bucket table" );
+        static_assert( !set::traits::dynamic_bucket_table, "Set has dynamic bucket table" );
 
         test_rcu_int<set>();
 #endif
 
         test_rcu_int<set>();
 #endif
@@ -279,7 +279,7 @@ namespace set {
                 ,co::memory_model<co::v::relaxed_ordering>
             >::type
         > set;
                 ,co::memory_model<co::v::relaxed_ordering>
             >::type
         > set;
-        static_assert( !set::options::dynamic_bucket_table, "Set has dynamic bucket table" );
+        static_assert( !set::traits::dynamic_bucket_table, "Set has dynamic bucket table" );
 
         test_rcu_int<set>();
 #endif
 
         test_rcu_int<set>();
 #endif
@@ -308,7 +308,7 @@ namespace set {
                 ,co::memory_model<co::v::sequential_consistent>
             >::type
         > set;
                 ,co::memory_model<co::v::sequential_consistent>
             >::type
         > set;
-        static_assert( !set::options::dynamic_bucket_table, "Set has dynamic bucket table" );
+        static_assert( !set::traits::dynamic_bucket_table, "Set has dynamic bucket table" );
 
         test_rcu_int<set>();
 #endif
 
         test_rcu_int<set>();
 #endif
@@ -338,7 +338,123 @@ namespace set {
                 ,ci::split_list::dynamic_bucket_table<false>
             >::type
         > set;
                 ,ci::split_list::dynamic_bucket_table<false>
             >::type
         > set;
-        static_assert( !set::options::dynamic_bucket_table, "Set has dynamic bucket table" );
+        static_assert( !set::traits::dynamic_bucket_table, "Set has dynamic bucket table" );
+
+        test_rcu_int<set>();
+#endif
+    }
+
+    void IntrusiveHashSetHdrTest::split_dyn_RCU_SHT_base_cmpmix_stat_lazy()
+    {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        typedef base_int_item< ci::split_list::node<ci::lazy_list::node<rcu_type> > > item;
+        struct list_traits : public ci::lazy_list::traits
+        {
+            typedef ci::lazy_list::base_hook< co::gc<rcu_type> > hook;
+            typedef IntrusiveHashSetHdrTest::less< item > less;
+            typedef cmp<item> compare;
+            typedef faked_disposer disposer;
+        };
+        typedef ci::LazyList< rcu_type, item, list_traits > ord_list;
+
+        struct set_traits : public ci::split_list::make_traits<ci::split_list::dynamic_bucket_table<true>>::type
+        {
+            typedef hash_int hash;
+            typedef simple_item_counter item_counter;
+            typedef ci::split_list::stat<> stat;
+        };
+        typedef ci::SplitListSet< rcu_type, ord_list, set_traits > set;
+        static_assert( set::traits::dynamic_bucket_table, "Set has static bucket table" );
+
+        test_rcu_int<set>();
+#endif
+    }
+
+    void IntrusiveHashSetHdrTest::split_dyn_RCU_SHT_member_cmpmix_stat_lazy()
+    {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        typedef member_int_item< ci::split_list::node< ci::lazy_list::node<rcu_type> > > item;
+        struct list_traits :
+            public ci::lazy_list::make_traits<
+                ci::opt::hook< ci::lazy_list::member_hook<
+                    offsetof( item, hMember ),
+                    co::gc<rcu_type>
+                > >
+                ,co::compare< cmp<item> >
+                ,co::less< less<item> >
+                ,ci::opt::disposer< faked_disposer >
+            >::type
+        {};
+        typedef ci::LazyList< rcu_type, item, list_traits > ord_list;
+
+        struct set_traits :
+            public ci::split_list::make_traits<
+                co::hash< hash_int >
+                ,co::item_counter< simple_item_counter >
+                ,co::stat< ci::split_list::stat<> >
+            >::type
+        {};
+        typedef ci::SplitListSet< rcu_type, ord_list, set_traits > set;
+        static_assert( set::traits::dynamic_bucket_table, "Set has static bucket table" );
+
+        test_rcu_int<set>();
+#endif
+    }
+
+    void IntrusiveHashSetHdrTest::split_st_RCU_SHT_base_cmpmix_stat_lazy()
+    {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        typedef base_int_item< ci::split_list::node<ci::lazy_list::node<rcu_type> > > item;
+        typedef ci::LazyList< rcu_type
+            ,item
+            ,ci::lazy_list::make_traits<
+                ci::opt::hook< ci::lazy_list::base_hook< co::gc<rcu_type> > >
+                ,co::less< less<item> >
+                ,co::compare< cmp<item> >
+                ,ci::opt::disposer< faked_disposer >
+            >::type
+        >    ord_list;
+
+        typedef ci::SplitListSet< rcu_type, ord_list,
+            ci::split_list::make_traits<
+                co::hash< hash_int >
+                ,co::item_counter< simple_item_counter >
+                ,ci::split_list::dynamic_bucket_table<false>
+                ,co::stat< ci::split_list::stat<>>
+            >::type
+        > set;
+        static_assert( !set::traits::dynamic_bucket_table, "Set has dynamic bucket table" );
+
+        test_rcu_int<set>();
+#endif
+    }
+
+    void IntrusiveHashSetHdrTest::split_st_RCU_SHT_member_cmpmix_stat_lazy()
+    {
+#ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
+        typedef member_int_item< ci::split_list::node< ci::lazy_list::node<rcu_type> > > item;
+        typedef ci::LazyList< rcu_type
+            ,item
+            ,ci::lazy_list::make_traits<
+                ci::opt::hook< ci::lazy_list::member_hook<
+                    offsetof( item, hMember ),
+                    co::gc<rcu_type>
+                > >
+                ,co::compare< cmp<item> >
+                ,co::less< less<item> >
+                ,ci::opt::disposer< faked_disposer >
+            >::type
+        >    ord_list;
+
+        typedef ci::SplitListSet< rcu_type, ord_list,
+            ci::split_list::make_traits<
+                co::hash< hash_int >
+                ,co::item_counter< simple_item_counter >
+                ,ci::split_list::dynamic_bucket_table<false>
+                ,co::stat< ci::split_list::stat<>>
+            >::type
+        > set;
+        static_assert( !set::traits::dynamic_bucket_table, "Set has dynamic bucket table" );
 
         test_rcu_int<set>();
 #endif
 
         test_rcu_int<set>();
 #endif