Added copyright and license
[libcds.git] / tests / test-hdr / set / hdr_splitlist_set_rcu_sht.cpp
1 /*
2     This file is a part of libcds - Concurrent Data Structures library
3
4     (C) Copyright Maxim Khizhinsky (libcds.dev@gmail.com) 2006-2016
5
6     Source code repo: http://github.com/khizmax/libcds/
7     Download: http://sourceforge.net/projects/libcds/files/
8     
9     Redistribution and use in source and binary forms, with or without
10     modification, are permitted provided that the following conditions are met:
11
12     * Redistributions of source code must retain the above copyright notice, this
13       list of conditions and the following disclaimer.
14
15     * Redistributions in binary form must reproduce the above copyright notice,
16       this list of conditions and the following disclaimer in the documentation
17       and/or other materials provided with the distribution.
18
19     THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
20     AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
21     IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
22     DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
23     FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
24     DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
25     SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
26     CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
27     OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
28     OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.     
29 */
30
31 #include "set/hdr_set.h"
32 #include <cds/urcu/signal_threaded.h>
33 #include <cds/container/michael_list_rcu.h>
34 #include <cds/container/split_list_set_rcu.h>
35
36 namespace set {
37
38 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
39     namespace {
40         typedef cds::urcu::gc< cds::urcu::signal_threaded<> > rcu_type;
41
42         struct RCU_SHT_cmp_traits: public cc::split_list::traits
43         {
44             typedef cc::michael_list_tag                ordered_list;
45             typedef HashSetHdrTest::hash_int            hash;
46             typedef HashSetHdrTest::simple_item_counter item_counter;
47             typedef cc::opt::v::relaxed_ordering        memory_model;
48             enum { dynamic_bucket_table = false };
49
50             struct ordered_list_traits: public cc::michael_list::traits
51             {
52                 typedef HashSetHdrTest::cmp<HashSetHdrTest::item>   compare;
53             };
54         };
55
56         struct RCU_SHT_less_traits: public cc::split_list::traits
57         {
58             typedef cc::michael_list_tag                ordered_list;
59             typedef HashSetHdrTest::hash_int            hash;
60             typedef HashSetHdrTest::simple_item_counter item_counter;
61             typedef cc::opt::v::sequential_consistent   memory_model;
62             enum { dynamic_bucket_table = false };
63
64             struct ordered_list_traits: public cc::michael_list::traits
65             {
66                 typedef HashSetHdrTest::less<HashSetHdrTest::item>   less;
67             };
68         };
69
70         struct RCU_cmpmix_traits: public cc::split_list::traits
71         {
72             typedef cc::michael_list_tag                ordered_list;
73             typedef HashSetHdrTest::hash_int            hash;
74             typedef HashSetHdrTest::simple_item_counter item_counter;
75
76             struct ordered_list_traits: public cc::michael_list::traits
77             {
78                 typedef HashSetHdrTest::cmp<HashSetHdrTest::item>   compare;
79                 typedef HashSetHdrTest::less<HashSetHdrTest::item>   less;
80             };
81         };
82
83         struct RCU_cmpmix_stat_traits : public RCU_cmpmix_traits
84         {
85             typedef cc::split_list::stat<> stat;
86         };
87
88     }
89 #endif
90
91     void HashSetHdrTest::Split_RCU_SHT_cmp()
92     {
93 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
94         // traits-based version
95         typedef cc::SplitListSet< rcu_type, item, RCU_SHT_cmp_traits > set;
96
97         test_int_rcu_michael_list< set >();
98
99         // option-based version
100         typedef cc::SplitListSet< rcu_type, item,
101             cc::split_list::make_traits<
102                 cc::split_list::ordered_list<cc::michael_list_tag>
103                 ,cc::opt::hash< hash_int >
104                 ,cc::opt::item_counter< simple_item_counter >
105                 ,cc::opt::memory_model< cc::opt::v::relaxed_ordering >
106                 ,cc::split_list::dynamic_bucket_table< true >
107                 ,cc::split_list::ordered_list_traits<
108                     cc::michael_list::make_traits<
109                         cc::opt::compare< cmp<item> >
110                     >::type
111                 >
112             >::type
113         > opt_set;
114         test_int_rcu_michael_list< opt_set >();
115 #endif
116     }
117
118     void HashSetHdrTest::Split_RCU_SHT_less()
119     {
120 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
121         // traits-based version
122         typedef cc::SplitListSet< rcu_type, item, RCU_SHT_less_traits > set;
123
124         test_int_rcu_michael_list< set >();
125
126         // option-based version
127         typedef cc::SplitListSet< rcu_type, item,
128             cc::split_list::make_traits<
129                 cc::split_list::ordered_list<cc::michael_list_tag>
130                 ,cc::opt::hash< hash_int >
131                 ,cc::opt::item_counter< simple_item_counter >
132                 ,cc::opt::memory_model< cc::opt::v::sequential_consistent >
133                 ,cc::split_list::dynamic_bucket_table< false >
134                 ,cc::split_list::ordered_list_traits<
135                     cc::michael_list::make_traits<
136                         cc::opt::less< less<item> >
137                     >::type
138                 >
139             >::type
140         > opt_set;
141         test_int_rcu_michael_list< opt_set >();
142 #endif
143     }
144
145     void HashSetHdrTest::Split_RCU_SHT_cmpmix()
146     {
147 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
148         // traits-based version
149         typedef cc::SplitListSet< rcu_type, item, RCU_cmpmix_traits > set;
150         test_int_rcu_michael_list< set >();
151
152         // option-based version
153         typedef cc::SplitListSet< rcu_type, item,
154             cc::split_list::make_traits<
155                 cc::split_list::ordered_list<cc::michael_list_tag>
156                 ,cc::opt::hash< hash_int >
157                 ,cc::opt::item_counter< simple_item_counter >
158                 ,cc::split_list::ordered_list_traits<
159                     cc::michael_list::make_traits<
160                         cc::opt::less< less<item> >
161                         ,cc::opt::compare< cmp<item> >
162                     >::type
163                 >
164             >::type
165         > opt_set;
166         test_int_rcu_michael_list< opt_set >();
167 #endif
168     }
169
170     void HashSetHdrTest::Split_RCU_SHT_cmpmix_stat()
171     {
172 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
173         // traits-based version
174         typedef cc::SplitListSet< rcu_type, item, RCU_cmpmix_stat_traits > set;
175         test_int_rcu_michael_list< set >();
176
177         // option-based version
178         typedef cc::SplitListSet< rcu_type, item,
179             cc::split_list::make_traits<
180                 cc::split_list::ordered_list<cc::michael_list_tag>
181                 ,cc::opt::hash< hash_int >
182                 ,cc::opt::item_counter< simple_item_counter >
183                 ,cc::opt::stat< cc::split_list::stat<>>
184                 ,cc::split_list::ordered_list_traits<
185                     cc::michael_list::make_traits<
186                         cc::opt::less< less<item> >
187                         ,cc::opt::compare< cmp<item> >
188                     >::type
189                 >
190             >::type
191         > opt_set;
192         test_int_rcu_michael_list< opt_set >();
193 #endif
194     }
195
196 } // namespace set