[stress] Splitting large tests on two executable - HP-based and RCU-based (to be...
[libcds.git] / test / stress / map / map_type_feldman_hashmap.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_MAP_TYPE_FELDMAN_HASHMAP_H
32 #define CDSUNIT_MAP_TYPE_FELDMAN_HASHMAP_H
33
34 #include "map_type.h"
35
36 #include <cds/container/feldman_hashmap_hp.h>
37 #include <cds/container/feldman_hashmap_dhp.h>
38 #include <cds/container/feldman_hashmap_rcu.h>
39
40 #include <cds_test/stat_feldman_hashset_out.h>
41 #include <cds_test/hash_func.h>
42
43 namespace map {
44
45     template <class GC, typename Key, typename T, typename Traits = cc::feldman_hashmap::traits>
46     class FeldmanHashMap : public cc::FeldmanHashMap< GC, Key, T, Traits >
47     {
48         typedef cc::FeldmanHashMap< GC, Key, T, Traits > base_class;
49     public:
50
51         template <typename OtherTraits>
52         struct rebind_traits {
53             typedef FeldmanHashMap<GC, Key, T, OtherTraits > result;
54         };
55
56         template <typename Config>
57         FeldmanHashMap( Config const& cfg)
58             : base_class( cfg.s_nFeldmanMap_HeadBits, cfg.s_nFeldmanMap_ArrayBits )
59         {}
60
61         // for testing
62         static CDS_CONSTEXPR bool const c_bExtractSupported = true;
63         static CDS_CONSTEXPR bool const c_bLoadFactorDepended = false;
64         static CDS_CONSTEXPR bool const c_bEraseExactKey = true;
65     };
66
67     struct tag_FeldmanHashMap;
68
69     template <typename Key, typename Value>
70     struct map_type< tag_FeldmanHashMap, Key, Value >: public map_type_base< Key, Value >
71     {
72         typedef map_type_base< Key, Value >      base_class;
73         typedef typename base_class::key_compare compare;
74         typedef typename base_class::key_less    less;
75
76         struct traits_FeldmanHashMap_stdhash : public cc::feldman_hashmap::traits
77         {
78             typedef std::hash< Key >    hash;
79             typedef std::less<size_t>   less;
80         };
81
82         typedef FeldmanHashMap< cds::gc::HP,  Key, Value, traits_FeldmanHashMap_stdhash >    FeldmanHashMap_hp_stdhash;
83         typedef FeldmanHashMap< cds::gc::DHP, Key, Value, traits_FeldmanHashMap_stdhash >    FeldmanHashMap_dhp_stdhash;
84         typedef FeldmanHashMap< rcu_gpi, Key, Value, traits_FeldmanHashMap_stdhash >    FeldmanHashMap_rcu_gpi_stdhash;
85         typedef FeldmanHashMap< rcu_gpb, Key, Value, traits_FeldmanHashMap_stdhash >    FeldmanHashMap_rcu_gpb_stdhash;
86         typedef FeldmanHashMap< rcu_gpt, Key, Value, traits_FeldmanHashMap_stdhash >    FeldmanHashMap_rcu_gpt_stdhash;
87 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
88         typedef FeldmanHashMap< rcu_shb, Key, Value, traits_FeldmanHashMap_stdhash >    FeldmanHashMap_rcu_shb_stdhash;
89         typedef FeldmanHashMap< rcu_sht, Key, Value, traits_FeldmanHashMap_stdhash >    FeldmanHashMap_rcu_sht_stdhash;
90 #endif
91
92         struct traits_FeldmanHashMap_stdhash_stat: traits_FeldmanHashMap_stdhash
93         {
94             typedef cc::feldman_hashmap::stat<> stat;
95             typedef std::less<size_t>   less;
96         };
97
98         typedef FeldmanHashMap< cds::gc::HP,  Key, Value, traits_FeldmanHashMap_stdhash_stat >    FeldmanHashMap_hp_stdhash_stat;
99         typedef FeldmanHashMap< cds::gc::DHP, Key, Value, traits_FeldmanHashMap_stdhash_stat >    FeldmanHashMap_dhp_stdhash_stat;
100         typedef FeldmanHashMap< rcu_gpi, Key, Value, traits_FeldmanHashMap_stdhash_stat >    FeldmanHashMap_rcu_gpi_stdhash_stat;
101         typedef FeldmanHashMap< rcu_gpb, Key, Value, traits_FeldmanHashMap_stdhash_stat >    FeldmanHashMap_rcu_gpb_stdhash_stat;
102         typedef FeldmanHashMap< rcu_gpt, Key, Value, traits_FeldmanHashMap_stdhash_stat >    FeldmanHashMap_rcu_gpt_stdhash_stat;
103 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
104         typedef FeldmanHashMap< rcu_shb, Key, Value, traits_FeldmanHashMap_stdhash_stat >    FeldmanHashMap_rcu_shb_stdhash_stat;
105         typedef FeldmanHashMap< rcu_sht, Key, Value, traits_FeldmanHashMap_stdhash_stat >    FeldmanHashMap_rcu_sht_stdhash_stat;
106 #endif
107
108         // CityHash
109 #if CDS_BUILD_BITS == 64
110         struct traits_FeldmanHashMap_city64 : public cc::feldman_hashmap::traits
111         {
112             typedef ::cds_test::city64 hash;
113             typedef ::cds_test::city64::less less;
114         };
115         typedef FeldmanHashMap< cds::gc::HP,  Key, Value, traits_FeldmanHashMap_city64 >    FeldmanHashMap_hp_city64;
116         typedef FeldmanHashMap< cds::gc::DHP, Key, Value, traits_FeldmanHashMap_city64 >    FeldmanHashMap_dhp_city64;
117         typedef FeldmanHashMap< rcu_gpi, Key, Value, traits_FeldmanHashMap_city64 >    FeldmanHashMap_rcu_gpi_city64;
118         typedef FeldmanHashMap< rcu_gpb, Key, Value, traits_FeldmanHashMap_city64 >    FeldmanHashMap_rcu_gpb_city64;
119         typedef FeldmanHashMap< rcu_gpt, Key, Value, traits_FeldmanHashMap_city64 >    FeldmanHashMap_rcu_gpt_city64;
120 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
121         typedef FeldmanHashMap< rcu_shb, Key, Value, traits_FeldmanHashMap_city64 >    FeldmanHashMap_rcu_shb_city64;
122         typedef FeldmanHashMap< rcu_sht, Key, Value, traits_FeldmanHashMap_city64 >    FeldmanHashMap_rcu_sht_city64;
123 #endif
124
125         struct traits_FeldmanHashMap_city64_stat : public traits_FeldmanHashMap_city64
126         {
127             typedef cc::feldman_hashmap::stat<> stat;
128         };
129         typedef FeldmanHashMap< cds::gc::HP,  Key, Value, traits_FeldmanHashMap_city64_stat >    FeldmanHashMap_hp_city64_stat;
130         typedef FeldmanHashMap< cds::gc::DHP, Key, Value, traits_FeldmanHashMap_city64_stat >    FeldmanHashMap_dhp_city64_stat;
131         typedef FeldmanHashMap< rcu_gpi, Key, Value, traits_FeldmanHashMap_city64_stat >    FeldmanHashMap_rcu_gpi_city64_stat;
132         typedef FeldmanHashMap< rcu_gpb, Key, Value, traits_FeldmanHashMap_city64_stat >    FeldmanHashMap_rcu_gpb_city64_stat;
133         typedef FeldmanHashMap< rcu_gpt, Key, Value, traits_FeldmanHashMap_city64_stat >    FeldmanHashMap_rcu_gpt_city64_stat;
134 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
135         typedef FeldmanHashMap< rcu_shb, Key, Value, traits_FeldmanHashMap_city64_stat >    FeldmanHashMap_rcu_shb_city64_stat;
136         typedef FeldmanHashMap< rcu_sht, Key, Value, traits_FeldmanHashMap_city64_stat >    FeldmanHashMap_rcu_sht_city64_stat;
137 #endif
138
139         struct traits_FeldmanHashMap_city128 : public cc::feldman_hashmap::traits
140         {
141             typedef ::cds_test::city128 hash;
142             typedef ::cds_test::city128::less less;
143         };
144         typedef FeldmanHashMap< cds::gc::HP,  Key, Value, traits_FeldmanHashMap_city128 >    FeldmanHashMap_hp_city128;
145         typedef FeldmanHashMap< cds::gc::DHP, Key, Value, traits_FeldmanHashMap_city128 >    FeldmanHashMap_dhp_city128;
146         typedef FeldmanHashMap< rcu_gpi, Key, Value, traits_FeldmanHashMap_city128 >    FeldmanHashMap_rcu_gpi_city128;
147         typedef FeldmanHashMap< rcu_gpb, Key, Value, traits_FeldmanHashMap_city128 >    FeldmanHashMap_rcu_gpb_city128;
148         typedef FeldmanHashMap< rcu_gpt, Key, Value, traits_FeldmanHashMap_city128 >    FeldmanHashMap_rcu_gpt_city128;
149 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
150         typedef FeldmanHashMap< rcu_shb, Key, Value, traits_FeldmanHashMap_city128 >    FeldmanHashMap_rcu_shb_city128;
151         typedef FeldmanHashMap< rcu_sht, Key, Value, traits_FeldmanHashMap_city128 >    FeldmanHashMap_rcu_sht_city128;
152 #endif
153
154         struct traits_FeldmanHashMap_city128_stat : public traits_FeldmanHashMap_city128
155         {
156             typedef cc::feldman_hashmap::stat<> stat;
157         };
158         typedef FeldmanHashMap< cds::gc::HP,  Key, Value, traits_FeldmanHashMap_city128_stat >    FeldmanHashMap_hp_city128_stat;
159         typedef FeldmanHashMap< cds::gc::DHP, Key, Value, traits_FeldmanHashMap_city128_stat >    FeldmanHashMap_dhp_city128_stat;
160         typedef FeldmanHashMap< rcu_gpi, Key, Value, traits_FeldmanHashMap_city128_stat >    FeldmanHashMap_rcu_gpi_city128_stat;
161         typedef FeldmanHashMap< rcu_gpb, Key, Value, traits_FeldmanHashMap_city128_stat >    FeldmanHashMap_rcu_gpb_city128_stat;
162         typedef FeldmanHashMap< rcu_gpt, Key, Value, traits_FeldmanHashMap_city128_stat >    FeldmanHashMap_rcu_gpt_city128_stat;
163 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
164         typedef FeldmanHashMap< rcu_shb, Key, Value, traits_FeldmanHashMap_city128_stat >    FeldmanHashMap_rcu_shb_city128_stat;
165         typedef FeldmanHashMap< rcu_sht, Key, Value, traits_FeldmanHashMap_city128_stat >    FeldmanHashMap_rcu_sht_city128_stat;
166 #endif
167 #endif // CDS_BUILD_BITS == 64
168
169
170         // for fixed-sized keys - no hash functor required
171         struct traits_FeldmanHashMap_fixed: public cc::feldman_hashmap::traits
172         {
173             typedef map::cmp<Key>    compare;
174         };
175
176         typedef FeldmanHashMap< cds::gc::HP, Key, Value,  traits_FeldmanHashMap_fixed >    FeldmanHashMap_hp_fixed;
177         typedef FeldmanHashMap< cds::gc::DHP, Key, Value, traits_FeldmanHashMap_fixed >   FeldmanHashMap_dhp_fixed;
178         typedef FeldmanHashMap< rcu_gpi, Key, Value,      traits_FeldmanHashMap_fixed >    FeldmanHashMap_rcu_gpi_fixed;
179         typedef FeldmanHashMap< rcu_gpb, Key, Value,      traits_FeldmanHashMap_fixed >    FeldmanHashMap_rcu_gpb_fixed;
180         typedef FeldmanHashMap< rcu_gpt, Key, Value,      traits_FeldmanHashMap_fixed >    FeldmanHashMap_rcu_gpt_fixed;
181 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
182         typedef FeldmanHashMap< rcu_shb, Key, Value,      traits_FeldmanHashMap_fixed >    FeldmanHashMap_rcu_shb_fixed;
183         typedef FeldmanHashMap< rcu_sht, Key, Value,      traits_FeldmanHashMap_fixed >    FeldmanHashMap_rcu_sht_fixed;
184 #endif
185
186         struct traits_FeldmanHashMap_fixed_stat : public traits_FeldmanHashMap_fixed
187         {
188             typedef cc::feldman_hashmap::stat<> stat;
189         };
190         typedef FeldmanHashMap< cds::gc::HP, Key, Value,    traits_FeldmanHashMap_fixed_stat >  FeldmanHashMap_hp_fixed_stat;
191         typedef FeldmanHashMap< cds::gc::DHP, Key, Value,   traits_FeldmanHashMap_fixed_stat >  FeldmanHashMap_dhp_fixed_stat;
192         typedef FeldmanHashMap< rcu_gpi, Key, Value,        traits_FeldmanHashMap_fixed_stat >  FeldmanHashMap_rcu_gpi_fixed_stat;
193         typedef FeldmanHashMap< rcu_gpb, Key, Value,        traits_FeldmanHashMap_fixed_stat >  FeldmanHashMap_rcu_gpb_fixed_stat;
194         typedef FeldmanHashMap< rcu_gpt, Key, Value,        traits_FeldmanHashMap_fixed_stat >  FeldmanHashMap_rcu_gpt_fixed_stat;
195 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
196         typedef FeldmanHashMap< rcu_shb, Key, Value, traits_FeldmanHashMap_fixed_stat > FeldmanHashMap_rcu_shb_fixed_stat;
197         typedef FeldmanHashMap< rcu_sht, Key, Value, traits_FeldmanHashMap_fixed_stat > FeldmanHashMap_rcu_sht_fixed_stat;
198 #endif
199
200     };
201
202     template <typename GC, typename K, typename T, typename Traits >
203     static inline void print_stat( cds_test::property_stream& o, FeldmanHashMap< GC, K, T, Traits > const& m )
204     {
205         std::vector< cds::intrusive::feldman_hashset::level_statistics > level_stat;
206         m.get_level_statistics( level_stat );
207
208         o << m.statistics()
209           << level_stat;
210     }
211
212 #define CDSSTRESS_FeldmanHashMap_case( fixture, test_case, feldman_map_type, key_type, value_type ) \
213     TEST_F( fixture, feldman_map_type ) \
214     { \
215         typedef map::map_type< tag_FeldmanHashMap, key_type, value_type >::feldman_map_type map_type; \
216         test_case<map_type>(); \
217     }
218
219
220 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
221 #   define CDSSTRESS_FeldmanHashMap_fixed_SHRCU( fixture, test_case, key_type, value_type ) \
222         CDSSTRESS_FeldmanHashMap_case( fixture, test_case, FeldmanHashMap_rcu_shb_fixed, key_type, value_type ) \
223         CDSSTRESS_FeldmanHashMap_case( fixture, test_case, FeldmanHashMap_rcu_sht_fixed, key_type, value_type ) \
224         CDSSTRESS_FeldmanHashMap_case( fixture, test_case, FeldmanHashMap_rcu_shb_fixed_stat, key_type, value_type ) \
225         CDSSTRESS_FeldmanHashMap_case( fixture, test_case, FeldmanHashMap_rcu_sht_fixed_stat, key_type, value_type ) \
226
227 #   define CDSSTRESS_FeldmanHashMap_stdhash_SHRCU( fixture, test_case, key_type, value_type ) \
228         CDSSTRESS_FeldmanHashMap_case( fixture, test_case, FeldmanHashMap_rcu_shb_stdhash, key_type, value_type ) \
229         CDSSTRESS_FeldmanHashMap_case( fixture, test_case, FeldmanHashMap_rcu_sht_stdhash, key_type, value_type ) \
230         CDSSTRESS_FeldmanHashMap_case( fixture, test_case, FeldmanHashMap_rcu_shb_stdhash_stat, key_type, value_type ) \
231         CDSSTRESS_FeldmanHashMap_case( fixture, test_case, FeldmanHashMap_rcu_sht_stdhash_stat, key_type, value_type ) \
232
233 #   if CDS_BUILD_BITS == 64
234 #       define CDSSTRESS_FeldmanHashMap_city64_SHRCU( fixture, test_case, key_type, value_type ) \
235             CDSSTRESS_FeldmanHashMap_case( fixture, test_case, FeldmanHashMap_rcu_shb_city64, key_type, value_type ) \
236             CDSSTRESS_FeldmanHashMap_case( fixture, test_case, FeldmanHashMap_rcu_sht_city64, key_type, value_type ) \
237             CDSSTRESS_FeldmanHashMap_case( fixture, test_case, FeldmanHashMap_rcu_shb_city64_stat, key_type, value_type ) \
238             CDSSTRESS_FeldmanHashMap_case( fixture, test_case, FeldmanHashMap_rcu_sht_city64_stat, key_type, value_type ) \
239
240 #       define CDSSTRESS_FeldmanHashMap_city128_SHRCU( fixture, test_case, key_type, value_type ) \
241             CDSSTRESS_FeldmanHashMap_case( fixture, test_case, FeldmanHashMap_rcu_shb_city64, key_type, value_type ) \
242             CDSSTRESS_FeldmanHashMap_case( fixture, test_case, FeldmanHashMap_rcu_sht_city64, key_type, value_type ) \
243             CDSSTRESS_FeldmanHashMap_case( fixture, test_case, FeldmanHashMap_rcu_shb_city64_stat, key_type, value_type ) \
244             CDSSTRESS_FeldmanHashMap_case( fixture, test_case, FeldmanHashMap_rcu_sht_city64_stat, key_type, value_type ) \
245
246 #   else
247 #       define CDSSTRESS_FeldmanHashMap_city64_SHRCU( fixture, test_case, key_type, value_type )
248 #       define CDSSTRESS_FeldmanHashMap_city128_SHRCU( fixture, test_case, key_type, value_type )
249 #   endif
250
251 #else
252 #   define CDSSTRESS_FeldmanHashMap_fixed_SHRCU( fixture, test_case, key_type, value_type )
253 #   define CDSSTRESS_FeldmanHashMap_stdhash_SHRCU( fixture, test_case, key_type, value_type )
254 #   define CDSSTRESS_FeldmanHashMap_city64_SHRCU( fixture, test_case, key_type, value_type )
255 #   define CDSSTRESS_FeldmanHashMap_city128_SHRCU( fixture, test_case, key_type, value_type )
256 #endif
257
258 #define CDSSTRESS_FeldmanHashMap_fixed_HP( fixture, test_case, key_type, value_type ) \
259     CDSSTRESS_FeldmanHashMap_case( fixture, test_case, FeldmanHashMap_hp_fixed,         key_type, value_type ) \
260     CDSSTRESS_FeldmanHashMap_case( fixture, test_case, FeldmanHashMap_dhp_fixed,        key_type, value_type ) \
261     CDSSTRESS_FeldmanHashMap_case( fixture, test_case, FeldmanHashMap_hp_fixed_stat,    key_type, value_type ) \
262     CDSSTRESS_FeldmanHashMap_case( fixture, test_case, FeldmanHashMap_dhp_fixed_stat,   key_type, value_type ) \
263
264 #define CDSSTRESS_FeldmanHashMap_fixed_RCU( fixture, test_case, key_type, value_type ) \
265     CDSSTRESS_FeldmanHashMap_case( fixture, test_case, FeldmanHashMap_rcu_gpi_fixed,        key_type, value_type ) \
266     CDSSTRESS_FeldmanHashMap_case( fixture, test_case, FeldmanHashMap_rcu_gpb_fixed,        key_type, value_type ) \
267     CDSSTRESS_FeldmanHashMap_case( fixture, test_case, FeldmanHashMap_rcu_gpt_fixed,        key_type, value_type ) \
268     CDSSTRESS_FeldmanHashMap_case( fixture, test_case, FeldmanHashMap_rcu_gpi_fixed_stat,   key_type, value_type ) \
269     CDSSTRESS_FeldmanHashMap_case( fixture, test_case, FeldmanHashMap_rcu_gpb_fixed_stat,   key_type, value_type ) \
270     CDSSTRESS_FeldmanHashMap_case( fixture, test_case, FeldmanHashMap_rcu_gpt_fixed_stat,   key_type, value_type ) \
271     CDSSTRESS_FeldmanHashMap_fixed_SHRCU( fixture, test_case, key_type, value_type )
272
273 #define CDSSTRESS_FeldmanHashMap_fixed( fixture, test_case, key_type, value_type ) \
274     CDSSTRESS_FeldmanHashMap_fixed_HP( fixture, test_case, key_type, value_type ) \
275     CDSSTRESS_FeldmanHashMap_fixed_RCU( fixture, test_case, key_type, value_type ) \
276
277
278 #define CDSSTRESS_FeldmanHashMap_stdhash_HP( fixture, test_case, key_type, value_type ) \
279     CDSSTRESS_FeldmanHashMap_case( fixture, test_case, FeldmanHashMap_hp_stdhash,       key_type, value_type ) \
280     CDSSTRESS_FeldmanHashMap_case( fixture, test_case, FeldmanHashMap_dhp_stdhash,      key_type, value_type ) \
281     CDSSTRESS_FeldmanHashMap_case( fixture, test_case, FeldmanHashMap_hp_stdhash_stat,  key_type, value_type ) \
282     CDSSTRESS_FeldmanHashMap_case( fixture, test_case, FeldmanHashMap_dhp_stdhash_stat, key_type, value_type ) \
283
284 #define CDSSTRESS_FeldmanHashMap_stdhash_RCU( fixture, test_case, key_type, value_type ) \
285     CDSSTRESS_FeldmanHashMap_case( fixture, test_case, FeldmanHashMap_rcu_gpi_stdhash,      key_type, value_type ) \
286     CDSSTRESS_FeldmanHashMap_case( fixture, test_case, FeldmanHashMap_rcu_gpb_stdhash,      key_type, value_type ) \
287     CDSSTRESS_FeldmanHashMap_case( fixture, test_case, FeldmanHashMap_rcu_gpt_stdhash,      key_type, value_type ) \
288     CDSSTRESS_FeldmanHashMap_case( fixture, test_case, FeldmanHashMap_rcu_gpi_stdhash_stat, key_type, value_type ) \
289     CDSSTRESS_FeldmanHashMap_case( fixture, test_case, FeldmanHashMap_rcu_gpb_stdhash_stat, key_type, value_type ) \
290     CDSSTRESS_FeldmanHashMap_case( fixture, test_case, FeldmanHashMap_rcu_gpt_stdhash_stat, key_type, value_type ) \
291     CDSSTRESS_FeldmanHashMap_stdhash_SHRCU( fixture, test_case, key_type, value_type )
292
293 #define CDSSTRESS_FeldmanHashMap_stdhash( fixture, test_case, key_type, value_type ) \
294     CDSSTRESS_FeldmanHashMap_stdhash_HP( fixture, test_case, key_type, value_type ) \
295     CDSSTRESS_FeldmanHashMap_stdhash_RCU( fixture, test_case, key_type, value_type ) \
296
297
298 #if CDS_BUILD_BITS == 64
299 #   define CDSSTRESS_FeldmanHashMap_city64_HP( fixture, test_case, key_type, value_type ) \
300         CDSSTRESS_FeldmanHashMap_case( fixture, test_case, FeldmanHashMap_hp_city64, key_type, value_type ) \
301         CDSSTRESS_FeldmanHashMap_case( fixture, test_case, FeldmanHashMap_dhp_city64, key_type, value_type ) \
302         CDSSTRESS_FeldmanHashMap_case( fixture, test_case, FeldmanHashMap_hp_city64_stat, key_type, value_type ) \
303         CDSSTRESS_FeldmanHashMap_case( fixture, test_case, FeldmanHashMap_dhp_city64_stat, key_type, value_type ) \
304
305 #   define CDSSTRESS_FeldmanHashMap_city64_RCU( fixture, test_case, key_type, value_type ) \
306         CDSSTRESS_FeldmanHashMap_case( fixture, test_case, FeldmanHashMap_rcu_gpi_city64, key_type, value_type ) \
307         CDSSTRESS_FeldmanHashMap_case( fixture, test_case, FeldmanHashMap_rcu_gpb_city64, key_type, value_type ) \
308         CDSSTRESS_FeldmanHashMap_case( fixture, test_case, FeldmanHashMap_rcu_gpt_city64, key_type, value_type ) \
309         CDSSTRESS_FeldmanHashMap_case( fixture, test_case, FeldmanHashMap_rcu_gpi_city64_stat, key_type, value_type ) \
310         CDSSTRESS_FeldmanHashMap_case( fixture, test_case, FeldmanHashMap_rcu_gpb_city64_stat, key_type, value_type ) \
311         CDSSTRESS_FeldmanHashMap_case( fixture, test_case, FeldmanHashMap_rcu_gpt_city64_stat, key_type, value_type ) \
312         CDSSTRESS_FeldmanHashMap_city64_SHRCU( fixture, test_case, key_type, value_type )
313
314 #   define CDSSTRESS_FeldmanHashMap_city64( fixture, test_case, key_type, value_type ) \
315         CDSSTRESS_FeldmanHashMap_city64_HP( fixture, test_case, key_type, value_type ) \
316         CDSSTRESS_FeldmanHashMap_city64_RCU( fixture, test_case, key_type, value_type ) \
317
318
319 #   define CDSSTRESS_FeldmanHashMap_city128_HP( fixture, test_case, key_type, value_type ) \
320         CDSSTRESS_FeldmanHashMap_case( fixture, test_case, FeldmanHashMap_hp_city128, key_type, value_type ) \
321         CDSSTRESS_FeldmanHashMap_case( fixture, test_case, FeldmanHashMap_dhp_city128, key_type, value_type ) \
322         CDSSTRESS_FeldmanHashMap_case( fixture, test_case, FeldmanHashMap_hp_city128_stat, key_type, value_type ) \
323         CDSSTRESS_FeldmanHashMap_case( fixture, test_case, FeldmanHashMap_dhp_city128_stat, key_type, value_type ) \
324
325 #   define CDSSTRESS_FeldmanHashMap_city128_RCU( fixture, test_case, key_type, value_type ) \
326         CDSSTRESS_FeldmanHashMap_case( fixture, test_case, FeldmanHashMap_rcu_gpi_city128, key_type, value_type ) \
327         CDSSTRESS_FeldmanHashMap_case( fixture, test_case, FeldmanHashMap_rcu_gpb_city128, key_type, value_type ) \
328         CDSSTRESS_FeldmanHashMap_case( fixture, test_case, FeldmanHashMap_rcu_gpt_city128, key_type, value_type ) \
329         CDSSTRESS_FeldmanHashMap_case( fixture, test_case, FeldmanHashMap_rcu_gpi_city128_stat, key_type, value_type ) \
330         CDSSTRESS_FeldmanHashMap_case( fixture, test_case, FeldmanHashMap_rcu_gpb_city128_stat, key_type, value_type ) \
331         CDSSTRESS_FeldmanHashMap_case( fixture, test_case, FeldmanHashMap_rcu_gpt_city128_stat, key_type, value_type ) \
332         CDSSTRESS_FeldmanHashMap_city128_SHRCU( fixture, test_case, key_type, value_type )
333
334 #   define CDSSTRESS_FeldmanHashMap_city128( fixture, test_case, key_type, value_type ) \
335         CDSSTRESS_FeldmanHashMap_city128_HP( fixture, test_case, key_type, value_type ) \
336         CDSSTRESS_FeldmanHashMap_city128_RCU( fixture, test_case, key_type, value_type ) \
337
338 #   define CDSSTRESS_FeldmanHashMap_city_HP( fixture, test_case, key_type, value_type ) \
339         CDSSTRESS_FeldmanHashMap_city64_HP( fixture, test_case, key_type, value_type ) \
340         CDSSTRESS_FeldmanHashMap_city128_HP( fixture, test_case, key_type, value_type )
341
342 #   define CDSSTRESS_FeldmanHashMap_city_RCU( fixture, test_case, key_type, value_type ) \
343         CDSSTRESS_FeldmanHashMap_city64_RCU( fixture, test_case, key_type, value_type ) \
344         CDSSTRESS_FeldmanHashMap_city128_RCU( fixture, test_case, key_type, value_type )
345
346 #   define CDSSTRESS_FeldmanHashMap_city( fixture, test_case, key_type, value_type ) \
347         CDSSTRESS_FeldmanHashMap_city_HP( fixture, test_case, key_type, value_type ) \
348         CDSSTRESS_FeldmanHashMap_city_RCU( fixture, test_case, key_type, value_type )
349
350 #else
351 #   define CDSSTRESS_FeldmanHashMap_city64_HP( fixture, test_case, key_type, value_type )
352 #   define CDSSTRESS_FeldmanHashMap_city64_RCU( fixture, test_case, key_type, value_type )
353 #   define CDSSTRESS_FeldmanHashMap_city64( fixture, test_case, key_type, value_type )
354 #   define CDSSTRESS_FeldmanHashMap_city128_HP( fixture, test_case, key_type, value_type )
355 #   define CDSSTRESS_FeldmanHashMap_city128_RCU( fixture, test_case, key_type, value_type )
356 #   define CDSSTRESS_FeldmanHashMap_city128( fixture, test_case, key_type, value_type )
357 #   define CDSSTRESS_FeldmanHashMap_city_HP( fixture, test_case, key_type, value_type )
358 #   define CDSSTRESS_FeldmanHashMap_city_RCU( fixture, test_case, key_type, value_type )
359 #   define CDSSTRESS_FeldmanHashMap_city( fixture, test_case, key_type, value_type )
360 #endif
361
362
363 }   // namespace map
364
365 #endif // #ifndef CDSUNIT_MAP_TYPE_FELDMAN_HASHMAP_H