Uses different pass count for different parallel queue test cases
[libcds.git] / test / stress / sequential / sequential-set / set_type_michael.h
1 /*
2     This file is a part of libcds - Concurrent Data Structures library
3
4     (C) Copyright Maxim Khizhinsky (libcds.dev@gmail.com) 2006-2017
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 #ifndef CDSUNIT_SET_TYPE_MICHAEL_H
32 #define CDSUNIT_SET_TYPE_MICHAEL_H
33
34 #include "set_type_michael_list.h"
35 #include "set_type_lazy_list.h"
36 #include "set_type_iterable_list.h"
37
38 #include <cds/container/michael_set.h>
39 #include <cds/container/michael_set_rcu.h>
40
41 #include <cds_test/stat_michael_list_out.h>
42 #include <cds_test/stat_lazy_list_out.h>
43 #include <cds_test/stat_iterable_list_out.h>
44
45 namespace set {
46
47     template <class GC, typename List, typename Traits = cc::michael_set::traits>
48     class MichaelHashSet : public cc::MichaelHashSet< GC, List, Traits >
49     {
50         typedef cc::MichaelHashSet< GC, List, Traits > base_class;
51     public:
52         template <class Config>
53         MichaelHashSet( Config const& cfg )
54             : base_class( cfg.s_nSetSize, cfg.s_nLoadFactor )
55         {}
56
57         template <typename Iterator>
58         typename std::enable_if< std::is_same< Iterator, typename base_class::iterator>::value, Iterator>::type
59         get_begin()
60         {
61             return base_class::begin();
62         }
63
64         template <typename Iterator>
65         typename std::enable_if< std::is_same< Iterator, typename base_class::iterator>::value, Iterator>::type
66         get_end()
67         {
68             return base_class::end();
69         }
70
71         // for testing
72         static CDS_CONSTEXPR bool const c_bExtractSupported = true;
73         static CDS_CONSTEXPR bool const c_bLoadFactorDepended = true;
74         static CDS_CONSTEXPR bool const c_bEraseExactKey = false;
75     };
76
77     struct tag_MichaelHashSet;
78
79     template <typename Key, typename Val>
80     struct set_type< tag_MichaelHashSet, Key, Val >: public set_type_base< Key, Val >
81     {
82         typedef set_type_base< Key, Val > base_class;
83         typedef typename base_class::key_val key_val;
84         typedef typename base_class::compare compare;
85         typedef typename base_class::less less;
86         typedef typename base_class::hash hash;
87
88         // ***************************************************************************
89         // MichaelHashSet based on MichaelList
90
91         typedef michael_list_type< Key, Val > ml;
92
93         struct traits_MichaelSet :
94             public cc::michael_set::make_traits<
95                 co::hash< hash >
96                 ,co::item_counter< cds::atomicity::cache_friendly_item_counter >
97             >::type
98         {};
99         typedef MichaelHashSet< cds::gc::HP,  typename ml::MichaelList_HP_cmp,  traits_MichaelSet > MichaelSet_HP_cmp;
100         typedef MichaelHashSet< cds::gc::DHP, typename ml::MichaelList_DHP_cmp, traits_MichaelSet > MichaelSet_DHP_cmp;
101         typedef MichaelHashSet< rcu_gpi, typename ml::MichaelList_RCU_GPI_cmp, traits_MichaelSet > MichaelSet_RCU_GPI_cmp;
102         typedef MichaelHashSet< rcu_gpb, typename ml::MichaelList_RCU_GPB_cmp, traits_MichaelSet > MichaelSet_RCU_GPB_cmp;
103         typedef MichaelHashSet< rcu_gpt, typename ml::MichaelList_RCU_GPT_cmp, traits_MichaelSet > MichaelSet_RCU_GPT_cmp;
104 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
105         typedef MichaelHashSet< rcu_shb, typename ml::MichaelList_RCU_SHB_cmp, traits_MichaelSet > MichaelSet_RCU_SHB_cmp;
106 #endif
107
108         typedef MichaelHashSet< cds::gc::HP, typename ml::MichaelList_HP_cmp_stat, traits_MichaelSet > MichaelSet_HP_cmp_stat;
109         typedef MichaelHashSet< cds::gc::DHP, typename ml::MichaelList_DHP_cmp_stat, traits_MichaelSet > MichaelSet_DHP_cmp_stat;
110         typedef MichaelHashSet< rcu_gpi, typename ml::MichaelList_RCU_GPI_cmp_stat, traits_MichaelSet > MichaelSet_RCU_GPI_cmp_stat;
111         typedef MichaelHashSet< rcu_gpb, typename ml::MichaelList_RCU_GPB_cmp_stat, traits_MichaelSet > MichaelSet_RCU_GPB_cmp_stat;
112         typedef MichaelHashSet< rcu_gpt, typename ml::MichaelList_RCU_GPT_cmp_stat, traits_MichaelSet > MichaelSet_RCU_GPT_cmp_stat;
113 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
114         typedef MichaelHashSet< rcu_shb, typename ml::MichaelList_RCU_SHB_cmp_stat, traits_MichaelSet > MichaelSet_RCU_SHB_cmp_stat;
115 #endif
116
117         typedef MichaelHashSet< cds::gc::HP, typename ml::MichaelList_HP_less, traits_MichaelSet > MichaelSet_HP_less;
118         typedef MichaelHashSet< cds::gc::DHP, typename ml::MichaelList_DHP_less, traits_MichaelSet > MichaelSet_DHP_less;
119         typedef MichaelHashSet< rcu_gpi, typename ml::MichaelList_RCU_GPI_less, traits_MichaelSet > MichaelSet_RCU_GPI_less;
120         typedef MichaelHashSet< rcu_gpb, typename ml::MichaelList_RCU_GPB_less, traits_MichaelSet > MichaelSet_RCU_GPB_less;
121         typedef MichaelHashSet< rcu_gpt, typename ml::MichaelList_RCU_GPT_less, traits_MichaelSet > MichaelSet_RCU_GPT_less;
122 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
123         typedef MichaelHashSet< rcu_shb, typename ml::MichaelList_RCU_SHB_less, traits_MichaelSet > MichaelSet_RCU_SHB_less;
124 #endif
125
126         typedef MichaelHashSet< cds::gc::HP, typename ml::MichaelList_HP_less_stat, traits_MichaelSet > MichaelSet_HP_less_stat;
127         typedef MichaelHashSet< cds::gc::DHP, typename ml::MichaelList_DHP_less_stat, traits_MichaelSet > MichaelSet_DHP_less_stat;
128         typedef MichaelHashSet< rcu_gpi, typename ml::MichaelList_RCU_GPI_less_stat, traits_MichaelSet > MichaelSet_RCU_GPI_less_stat;
129         typedef MichaelHashSet< rcu_gpb, typename ml::MichaelList_RCU_GPB_less_stat, traits_MichaelSet > MichaelSet_RCU_GPB_less_stat;
130         typedef MichaelHashSet< rcu_gpt, typename ml::MichaelList_RCU_GPT_less_stat, traits_MichaelSet > MichaelSet_RCU_GPT_less_stat;
131 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
132         typedef MichaelHashSet< rcu_shb, typename ml::MichaelList_RCU_SHB_less_stat, traits_MichaelSet > MichaelSet_RCU_SHB_less_stat;
133 #endif
134
135         typedef MichaelHashSet< cds::gc::HP, typename ml::MichaelList_HP_less_seqcst, traits_MichaelSet > MichaelSet_HP_less_seqcst;
136         typedef MichaelHashSet< cds::gc::DHP, typename ml::MichaelList_DHP_less_seqcst, traits_MichaelSet > MichaelSet_DHP_less_seqcst;
137         typedef MichaelHashSet< rcu_gpi, typename ml::MichaelList_RCU_GPI_less_seqcst, traits_MichaelSet > MichaelSet_RCU_GPI_less_seqcst;
138         typedef MichaelHashSet< rcu_gpb, typename ml::MichaelList_RCU_GPB_less_seqcst, traits_MichaelSet > MichaelSet_RCU_GPB_less_seqcst;
139         typedef MichaelHashSet< rcu_gpt, typename ml::MichaelList_RCU_GPT_less_seqcst, traits_MichaelSet > MichaelSet_RCU_GPT_less_seqcst;
140 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
141         typedef MichaelHashSet< rcu_shb, typename ml::MichaelList_RCU_SHB_less_seqcst, traits_MichaelSet > MichaelSet_RCU_SHB_less_seqcst;
142 #endif
143
144
145         // ***************************************************************************
146         // MichaelHashSet based on LazyList
147
148         typedef lazy_list_type< Key, Val > ll;
149
150         typedef MichaelHashSet< cds::gc::HP, typename ll::LazyList_HP_cmp, traits_MichaelSet > MichaelSet_Lazy_HP_cmp;
151         typedef MichaelHashSet< cds::gc::DHP, typename ll::LazyList_DHP_cmp, traits_MichaelSet > MichaelSet_Lazy_DHP_cmp;
152         typedef MichaelHashSet< rcu_gpi, typename ll::LazyList_RCU_GPI_cmp, traits_MichaelSet > MichaelSet_Lazy_RCU_GPI_cmp;
153         typedef MichaelHashSet< rcu_gpb, typename ll::LazyList_RCU_GPB_cmp, traits_MichaelSet > MichaelSet_Lazy_RCU_GPB_cmp;
154         typedef MichaelHashSet< rcu_gpt, typename ll::LazyList_RCU_GPT_cmp, traits_MichaelSet > MichaelSet_Lazy_RCU_GPT_cmp;
155 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
156         typedef MichaelHashSet< rcu_shb, typename ll::LazyList_RCU_SHB_cmp, traits_MichaelSet > MichaelSet_Lazy_RCU_SHB_cmp;
157 #endif
158
159         typedef MichaelHashSet< cds::gc::HP, typename ll::LazyList_HP_cmp_stat, traits_MichaelSet > MichaelSet_Lazy_HP_cmp_stat;
160         typedef MichaelHashSet< cds::gc::DHP, typename ll::LazyList_DHP_cmp_stat, traits_MichaelSet > MichaelSet_Lazy_DHP_cmp_stat;
161         typedef MichaelHashSet< rcu_gpi, typename ll::LazyList_RCU_GPI_cmp_stat, traits_MichaelSet > MichaelSet_Lazy_RCU_GPI_cmp_stat;
162         typedef MichaelHashSet< rcu_gpb, typename ll::LazyList_RCU_GPB_cmp_stat, traits_MichaelSet > MichaelSet_Lazy_RCU_GPB_cmp_stat;
163         typedef MichaelHashSet< rcu_gpt, typename ll::LazyList_RCU_GPT_cmp_stat, traits_MichaelSet > MichaelSet_Lazy_RCU_GPT_cmp_stat;
164 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
165         typedef MichaelHashSet< rcu_shb, typename ll::LazyList_RCU_SHB_cmp_stat, traits_MichaelSet > MichaelSet_Lazy_RCU_SHB_cmp_stat;
166 #endif
167
168         typedef MichaelHashSet< cds::gc::HP, typename ll::LazyList_HP_less, traits_MichaelSet > MichaelSet_Lazy_HP_less;
169         typedef MichaelHashSet< cds::gc::DHP, typename ll::LazyList_DHP_less, traits_MichaelSet > MichaelSet_Lazy_DHP_less;
170         typedef MichaelHashSet< rcu_gpi, typename ll::LazyList_RCU_GPI_less, traits_MichaelSet > MichaelSet_Lazy_RCU_GPI_less;
171         typedef MichaelHashSet< rcu_gpb, typename ll::LazyList_RCU_GPB_less, traits_MichaelSet > MichaelSet_Lazy_RCU_GPB_less;
172         typedef MichaelHashSet< rcu_gpt, typename ll::LazyList_RCU_GPT_less, traits_MichaelSet > MichaelSet_Lazy_RCU_GPT_less;
173 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
174         typedef MichaelHashSet< rcu_shb, typename ll::LazyList_RCU_SHB_less, traits_MichaelSet > MichaelSet_Lazy_RCU_SHB_less;
175 #endif
176
177         typedef MichaelHashSet< cds::gc::HP, typename ll::LazyList_HP_less_stat, traits_MichaelSet > MichaelSet_Lazy_HP_less_stat;
178         typedef MichaelHashSet< cds::gc::DHP, typename ll::LazyList_DHP_less_stat, traits_MichaelSet > MichaelSet_Lazy_DHP_less_stat;
179         typedef MichaelHashSet< rcu_gpi, typename ll::LazyList_RCU_GPI_less_stat, traits_MichaelSet > MichaelSet_Lazy_RCU_GPI_less_stat;
180         typedef MichaelHashSet< rcu_gpb, typename ll::LazyList_RCU_GPB_less_stat, traits_MichaelSet > MichaelSet_Lazy_RCU_GPB_less_stat;
181         typedef MichaelHashSet< rcu_gpt, typename ll::LazyList_RCU_GPT_less_stat, traits_MichaelSet > MichaelSet_Lazy_RCU_GPT_less_stat;
182 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
183         typedef MichaelHashSet< rcu_shb, typename ll::LazyList_RCU_SHB_less_stat, traits_MichaelSet > MichaelSet_Lazy_RCU_SHB_less_stat;
184 #endif
185
186         typedef MichaelHashSet< cds::gc::HP, typename ll::LazyList_HP_less_seqcst, traits_MichaelSet > MichaelSet_Lazy_HP_less_seqcst;
187         typedef MichaelHashSet< cds::gc::DHP, typename ll::LazyList_DHP_less_seqcst, traits_MichaelSet > MichaelSet_Lazy_DHP_less_seqcst;
188         typedef MichaelHashSet< rcu_gpi, typename ll::LazyList_RCU_GPI_less_seqcst, traits_MichaelSet > MichaelSet_Lazy_RCU_GPI_less_seqcst;
189         typedef MichaelHashSet< rcu_gpb, typename ll::LazyList_RCU_GPB_less_seqcst, traits_MichaelSet > MichaelSet_Lazy_RCU_GPB_less_seqcst;
190         typedef MichaelHashSet< rcu_gpt, typename ll::LazyList_RCU_GPT_less_seqcst, traits_MichaelSet > MichaelSet_Lazy_RCU_GPT_less_seqcst;
191 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
192         typedef MichaelHashSet< rcu_shb, typename ll::LazyList_RCU_SHB_less_seqcst, traits_MichaelSet > MichaelSet_Lazy_RCU_SHB_less_seqcst;
193 #endif
194
195
196         // ***************************************************************************
197         // MichaelHashSet based on IterableList
198
199         typedef iterable_list_type< Key, Val > il;
200
201         typedef MichaelHashSet< cds::gc::HP, typename il::IterableList_HP_cmp, traits_MichaelSet > MichaelSet_Iterable_HP_cmp;
202         typedef MichaelHashSet< cds::gc::DHP, typename il::IterableList_DHP_cmp, traits_MichaelSet > MichaelSet_Iterable_DHP_cmp;
203
204         typedef MichaelHashSet< cds::gc::HP, typename il::IterableList_HP_cmp_stat, traits_MichaelSet > MichaelSet_Iterable_HP_cmp_stat;
205         typedef MichaelHashSet< cds::gc::DHP, typename il::IterableList_DHP_cmp_stat, traits_MichaelSet > MichaelSet_Iterable_DHP_cmp_stat;
206
207         typedef MichaelHashSet< cds::gc::HP, typename il::IterableList_HP_less, traits_MichaelSet > MichaelSet_Iterable_HP_less;
208         typedef MichaelHashSet< cds::gc::DHP, typename il::IterableList_DHP_less, traits_MichaelSet > MichaelSet_Iterable_DHP_less;
209
210         typedef MichaelHashSet< cds::gc::HP, typename il::IterableList_HP_less_stat, traits_MichaelSet > MichaelSet_Iterable_HP_less_stat;
211         typedef MichaelHashSet< cds::gc::DHP, typename il::IterableList_DHP_less_stat, traits_MichaelSet > MichaelSet_Iterable_DHP_less_stat;
212
213         typedef MichaelHashSet< cds::gc::HP, typename il::IterableList_HP_less_seqcst, traits_MichaelSet > MichaelSet_Iterable_HP_less_seqcst;
214         typedef MichaelHashSet< cds::gc::DHP, typename il::IterableList_DHP_less_seqcst, traits_MichaelSet > MichaelSet_Iterable_DHP_less_seqcst;
215
216     };
217
218     template <typename GC, typename T, typename Traits>
219     static inline void print_stat( cds_test::property_stream& o, MichaelHashSet<GC, T, Traits> const& s )
220     {
221         o << s.statistics();
222     }
223
224 } // namespace set
225
226
227 #define CDSSTRESS_MichaelSet_case( fixture, test_case, michael_set_type, key_type, value_type ) \
228     TEST_P( fixture, michael_set_type ) \
229     { \
230         typedef set::set_type< tag_MichaelHashSet, key_type, value_type >::michael_set_type set_type; \
231         test_case<set_type>(); \
232     }
233
234 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
235
236 #if defined(CDS_STRESS_TEST_LEVEL) && CDS_STRESS_TEST_LEVEL > 0
237 #   define CDSSTRESS_MichaelSet_SHRCU_1( fixture, test_case, key_type, value_type ) \
238         CDSSTRESS_MichaelSet_case( fixture, test_case, MichaelSet_RCU_SHT_cmp,             key_type, value_type ) \
239         CDSSTRESS_MichaelSet_case( fixture, test_case, MichaelSet_RCU_SHB_less,            key_type, value_type ) \
240         CDSSTRESS_MichaelSet_case( fixture, test_case, MichaelSet_Lazy_RCU_SHT_cmp,        key_type, value_type ) \
241         CDSSTRESS_MichaelSet_case( fixture, test_case, MichaelSet_Lazy_RCU_SHB_less,       key_type, value_type ) \
242
243 #   define CDSSTRESS_MichaelIterableSet_SHRCU_1( fixture, test_case, key_type, value_type ) \
244         CDSSTRESS_MichaelSet_case( fixture, test_case, MichaelSet_Iterable_RCU_SHT_cmp,        key_type, value_type ) \
245         CDSSTRESS_MichaelSet_case( fixture, test_case, MichaelSet_Iterable_RCU_SHB_less,       key_type, value_type ) \
246
247 #else
248 #   define CDSSTRESS_MichaelSet_SHRCU_1( fixture, test_case, key_type, value_type )
249 #   define CDSSTRESS_MichaelIterableSet_SHRCU_1( fixture, test_case, key_type, value_type )
250 #endif
251
252 #   define CDSSTRESS_MichaelSet_SHRCU( fixture, test_case, key_type, value_type ) \
253         CDSSTRESS_MichaelSet_case( fixture, test_case, MichaelSet_RCU_SHB_cmp,             key_type, value_type ) \
254         CDSSTRESS_MichaelSet_case( fixture, test_case, MichaelSet_RCU_SHT_less,            key_type, value_type ) \
255         CDSSTRESS_MichaelSet_case( fixture, test_case, MichaelSet_Lazy_RCU_SHB_cmp,        key_type, value_type ) \
256         CDSSTRESS_MichaelSet_case( fixture, test_case, MichaelSet_Lazy_RCU_SHT_less,       key_type, value_type ) \
257         CDSSTRESS_MichaelSet_SHRCU_1( fixture, test_case, key_type, value_type ) \
258
259 #   define CDSSTRESS_MichaelIterableSet_SHRCU( fixture, test_case, key_type, value_type ) \
260         CDSSTRESS_MichaelSet_case( fixture, test_case, MichaelSet_Iterable_RCU_SHB_cmp,        key_type, value_type ) \
261         CDSSTRESS_MichaelSet_case( fixture, test_case, MichaelSet_Iterable_RCU_SHT_less,       key_type, value_type ) \
262         CDSSTRESS_MichaelIterableSet_SHRCU_1( fixture, test_case, key_type, value_type ) \
263
264 #else
265 #   define CDSSTRESS_MichaelSet_SHRCU( fixture, test_case, key_type, value_type )
266 #   define CDSSTRESS_MichaelIterableSet_SHRCU( fixture, test_case, key_type, value_type )
267 #endif
268
269 #if defined(CDS_STRESS_TEST_LEVEL) && CDS_STRESS_TEST_LEVEL > 0
270 #   define CDSSTRESS_MichaelSet_HP_1( fixture, test_case, key_type, value_type ) \
271         CDSSTRESS_MichaelSet_case( fixture, test_case, MichaelSet_DHP_cmp,                 key_type, value_type ) \
272         CDSSTRESS_MichaelSet_case( fixture, test_case, MichaelSet_HP_less,                 key_type, value_type ) \
273         \
274         CDSSTRESS_MichaelSet_case( fixture, test_case, MichaelSet_Lazy_DHP_cmp,            key_type, value_type ) \
275         CDSSTRESS_MichaelSet_case( fixture, test_case, MichaelSet_Lazy_HP_less,            key_type, value_type ) \
276
277 #   define CDSSTRESS_MichaelSet_RCU_1( fixture, test_case, key_type, value_type ) \
278         CDSSTRESS_MichaelSet_case( fixture, test_case, MichaelSet_RCU_GPB_cmp,             key_type, value_type ) \
279         CDSSTRESS_MichaelSet_case( fixture, test_case, MichaelSet_RCU_GPI_less,            key_type, value_type ) \
280         \
281         CDSSTRESS_MichaelSet_case( fixture, test_case, MichaelSet_Lazy_RCU_GPB_cmp,        key_type, value_type ) \
282         CDSSTRESS_MichaelSet_case( fixture, test_case, MichaelSet_Lazy_RCU_GPI_less,       key_type, value_type ) \
283         \
284         CDSSTRESS_MichaelSet_SHRCU( fixture, test_case, key_type, value_type ) \
285
286 #   define CDSSTRESS_MichaelIterableSet_1( fixture, test_case, key_type, value_type ) \
287         CDSSTRESS_MichaelSet_case( fixture, test_case, MichaelSet_Iterable_DHP_cmp,            key_type, value_type ) \
288         CDSSTRESS_MichaelSet_case( fixture, test_case, MichaelSet_Iterable_HP_less,            key_type, value_type ) \
289
290
291 #else
292 #   define CDSSTRESS_MichaelSet_HP_1( fixture, test_case, key_type, value_type )
293 #   define CDSSTRESS_MichaelSet_RCU_1( fixture, test_case, key_type, value_type )
294 #   define CDSSTRESS_MichaelIterableSet_1( fixture, test_case, key_type, value_type )
295 #endif
296
297
298 #define CDSSTRESS_MichaelSet_HP( fixture, test_case, key_type, value_type ) \
299     CDSSTRESS_MichaelSet_case( fixture, test_case, MichaelSet_HP_cmp,                  key_type, value_type ) \
300     CDSSTRESS_MichaelSet_case( fixture, test_case, MichaelSet_DHP_less,                key_type, value_type ) \
301     \
302     CDSSTRESS_MichaelSet_case( fixture, test_case, MichaelSet_Lazy_HP_cmp,             key_type, value_type ) \
303     CDSSTRESS_MichaelSet_case( fixture, test_case, MichaelSet_Lazy_DHP_less,           key_type, value_type ) \
304     \
305     CDSSTRESS_MichaelSet_HP_1( fixture, test_case, key_type, value_type ) \
306
307 #define CDSSTRESS_MichaelSet_RCU( fixture, test_case, key_type, value_type ) \
308     CDSSTRESS_MichaelSet_case( fixture, test_case, MichaelSet_RCU_GPI_cmp,             key_type, value_type ) \
309     CDSSTRESS_MichaelSet_case( fixture, test_case, MichaelSet_RCU_GPB_less,            key_type, value_type ) \
310     \
311     CDSSTRESS_MichaelSet_case( fixture, test_case, MichaelSet_Lazy_RCU_GPI_cmp,        key_type, value_type ) \
312     CDSSTRESS_MichaelSet_case( fixture, test_case, MichaelSet_Lazy_RCU_GPB_less,       key_type, value_type ) \
313     \
314     CDSSTRESS_MichaelSet_RCU_1( fixture, test_case, key_type, value_type ) \
315
316 #define CDSSTRESS_MichaelSet( fixture, test_case, key_type, value_type ) \
317     CDSSTRESS_MichaelSet_HP( fixture, test_case, key_type, value_type ) \
318     CDSSTRESS_MichaelSet_RCU( fixture, test_case, key_type, value_type ) \
319
320 #define CDSSTRESS_MichaelIterableSet( fixture, test_case, key_type, value_type ) \
321     CDSSTRESS_MichaelSet_case( fixture, test_case, MichaelSet_Iterable_HP_cmp,             key_type, value_type ) \
322     CDSSTRESS_MichaelSet_case( fixture, test_case, MichaelSet_Iterable_DHP_less,           key_type, value_type ) \
323     CDSSTRESS_MichaelIterableSet_1( fixture, test_case, key_type, value_type ) \
324
325 #endif // #ifndef CDSUNIT_SET_TYPE_MICHAEL_H