Excluded IterableList-based MichaelMap/Set from "erase by iterator" stress-test
[libcds.git] / test / stress / map / map_type.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_H
32 #define CDSUNIT_MAP_TYPE_H
33
34 #include <cds/urcu/general_instant.h>
35 #include <cds/urcu/general_buffered.h>
36 #include <cds/urcu/general_threaded.h>
37 #include <cds/urcu/signal_buffered.h>
38 #include <cds/urcu/signal_threaded.h>
39
40 #include <cds/sync/spinlock.h>
41 #include <cds/opt/hash.h>
42 #include <boost/functional/hash/hash.hpp>
43
44 #include <cds_test/stress_test.h>
45 #include <cds_test/check_size.h>
46
47 namespace map {
48     namespace cc = cds::container;
49     namespace co = cds::opt;
50
51     typedef cds::urcu::gc< cds::urcu::general_instant_stripped >   rcu_gpi;
52     typedef cds::urcu::gc< cds::urcu::general_buffered_stripped >  rcu_gpb;
53     typedef cds::urcu::gc< cds::urcu::general_threaded_stripped >  rcu_gpt;
54 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
55     typedef cds::urcu::gc< cds::urcu::signal_buffered_stripped >  rcu_shb;
56     typedef cds::urcu::gc< cds::urcu::signal_threaded_stripped >  rcu_sht;
57 #endif
58
59     template <typename Key>
60     struct less;
61
62     template <typename Key>
63     struct cmp {
64         int operator ()(Key const& k1, Key const& k2) const
65         {
66             if ( less<Key>( k1, k2 ))
67                 return -1;
68             return less<Key>( k2, k1 ) ? 1 : 0;
69         }
70     };
71
72     template <typename Key>
73     struct hash;
74
75 #define CDSUNIT_INT_COMPARE(t)  template <> struct cmp<t> { int operator()( t k1, t k2 ) const { return (int)(k1 - k2); } }
76     CDSUNIT_INT_COMPARE(char);
77     CDSUNIT_INT_COMPARE(unsigned char);
78     CDSUNIT_INT_COMPARE(int);
79     CDSUNIT_INT_COMPARE(unsigned int);
80     CDSUNIT_INT_COMPARE(long);
81     CDSUNIT_INT_COMPARE(unsigned long);
82     CDSUNIT_INT_COMPARE(long long);
83     CDSUNIT_INT_COMPARE(unsigned long long);
84 #undef CDSUNIT_INT_COMPARE
85
86 #define CDSUNIT_INT_LESS(t)  template <> struct less<t> { bool operator()( t k1, t k2 ) const { return k1 < k2; } }
87     CDSUNIT_INT_LESS( char );
88     CDSUNIT_INT_LESS( unsigned char );
89     CDSUNIT_INT_LESS( int );
90     CDSUNIT_INT_LESS( unsigned int );
91     CDSUNIT_INT_LESS( long );
92     CDSUNIT_INT_LESS( unsigned long );
93     CDSUNIT_INT_LESS( long long );
94     CDSUNIT_INT_LESS( unsigned long long );
95 #undef CDSUNIT_INT_LESS
96
97     template <>
98     struct cmp<std::string>
99     {
100         int operator()(std::string const& s1, std::string const& s2)
101         {
102             return s1.compare( s2 );
103         }
104         int operator()(std::string const& s1, char const * s2)
105         {
106             return s1.compare( s2 );
107         }
108         int operator()(char const * s1, std::string const& s2)
109         {
110             return -s2.compare( s1 );
111         }
112     };
113
114     template <>
115     struct less<std::string>
116     {
117         bool operator ()( std::string const& k1, std::string const& k2 ) const
118         {
119             return cmp<std::string>()(k1, k2) < 0;
120         }
121         bool operator ()( std::string const& k1, char const* k2 ) const
122         {
123             return cmp<std::string>()(k1, k2) < 0;
124         }
125         bool operator ()( char const* k1, std::string const& k2 ) const
126         {
127             return cmp<std::string>()(k1, k2) < 0;
128         }
129     };
130
131     template <typename T>
132     struct hash
133     {
134         typedef size_t result_type;
135         typedef T      argument_type;
136
137         size_t operator()( T const& k ) const
138         {
139             return std::hash<size_t>()(k.nKey);
140         }
141
142         size_t operator()( size_t k ) const
143         {
144             return std::hash<size_t>()(k);
145         }
146     };
147
148     template <>
149     struct hash<size_t>
150     {
151         typedef size_t result_type;
152         typedef size_t argument_type;
153
154         size_t operator()( size_t k ) const
155         {
156             return std::hash<size_t>()(k);
157         }
158     };
159
160     template <>
161     struct hash<std::string>
162     {
163         typedef size_t result_type;
164         typedef std::string argument_type;
165
166         size_t operator()( std::string const& k ) const
167         {
168             return std::hash<std::string>()(k);
169         }
170     };
171
172     // forward
173     template <typename ImplSelector, typename Key, typename Value>
174     struct map_type;
175
176     template <typename Key, typename Value>
177     struct map_type_base
178     {
179         typedef map::hash<Key>    key_hash;
180         typedef map::less<Key>    key_less;
181         typedef cmp<Key>          key_compare;
182
183         struct equal_to {
184             bool operator()( Key const& k1, Key const& k2 ) const
185             {
186                 return key_compare()( k1, k2 ) == 0;
187             }
188         };
189
190         struct hash2: public key_hash
191         {
192             size_t operator()( Key const& k ) const
193             {
194                 size_t h = key_hash::operator ()( k );
195                 size_t seed = ~h;
196                 seed ^= h + 0x9e3779b9 + (seed << 6) + (seed >> 2);
197                 return seed;
198             }
199             template <typename Q>
200             size_t operator()( Q const& k ) const
201             {
202                 size_t h = key_hash::operator ()( k );
203                 size_t seed = ~h;
204                 seed ^= h + 0x9e3779b9 + (seed << 6) + (seed >> 2);
205                 return seed;
206             }
207         };
208     };
209
210     struct empty_stat {};
211     static inline cds_test::property_stream& operator <<( cds_test::property_stream& o, empty_stat const& )
212     {
213         return o;
214     }
215
216     template <typename Map>
217     static inline void print_stat( cds_test::property_stream& o, Map const& m )
218     {
219         o << m.statistics();
220     }
221
222
223     template <typename Map>
224     static inline void check_before_cleanup( Map& /*m*/ )
225     {}
226
227     template <typename Map>
228     static inline void additional_cleanup( Map& /*m*/ )
229     {}
230
231     template <typename Map>
232     static inline void additional_check( Map& /*m*/ )
233     {}
234
235 } // namespace map
236
237 #endif // ifndef CDSUNIT_MAP_TYPE_H