2 This file is a part of libcds - Concurrent Data Structures library
4 (C) Copyright Maxim Khizhinsky (libcds.dev@gmail.com) 2006-2017
6 Source code repo: http://github.com/khizmax/libcds/
7 Download: http://sourceforge.net/projects/libcds/files/
9 Redistribution and use in source and binary forms, with or without
10 modification, are permitted provided that the following conditions are met:
12 * Redistributions of source code must retain the above copyright notice, this
13 list of conditions and the following disclaimer.
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.
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.
31 #ifndef CDSUNIT_SET_TYPE_H
32 #define CDSUNIT_SET_TYPE_H
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>
39 #include <cds/opt/hash.h>
40 #include <cds/sync/spinlock.h>
42 #include <cds_test/stress_test.h>
45 namespace cc = cds::container;
46 namespace co = cds::opt;
48 typedef cds::urcu::gc< cds::urcu::general_instant_stripped > rcu_gpi;
49 typedef cds::urcu::gc< cds::urcu::general_buffered_stripped > rcu_gpb;
50 typedef cds::urcu::gc< cds::urcu::general_threaded_stripped > rcu_gpt;
51 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
52 typedef cds::urcu::gc< cds::urcu::signal_buffered_stripped > rcu_shb;
55 template <typename Key>
58 template <typename Key>
61 int operator ()(Key const& k1, Key const& k2) const
63 if ( less<Key>( k1, k2 ))
65 return less<Key>( k2, k1 ) ? 1 : 0;
69 template <typename Key>
72 #define CDSUNIT_INT_COMPARE(t) template <> struct cmp<t> { int operator()( t k1, t k2 ){ return (int)(k1 - k2); } }
73 CDSUNIT_INT_COMPARE(char);
74 CDSUNIT_INT_COMPARE(unsigned char);
75 CDSUNIT_INT_COMPARE(int);
76 CDSUNIT_INT_COMPARE(unsigned int);
77 CDSUNIT_INT_COMPARE(long);
78 CDSUNIT_INT_COMPARE(unsigned long);
79 CDSUNIT_INT_COMPARE(long long);
80 CDSUNIT_INT_COMPARE(unsigned long long);
81 #undef CDSUNIT_INT_COMPARE
83 #define CDSUNIT_INT_LESS(t) template <> struct less<t> { bool operator()( t k1, t k2 ){ return k1 < k2; } }
84 CDSUNIT_INT_LESS( char );
85 CDSUNIT_INT_LESS( unsigned char );
86 CDSUNIT_INT_LESS( int );
87 CDSUNIT_INT_LESS( unsigned int );
88 CDSUNIT_INT_LESS( long );
89 CDSUNIT_INT_LESS( unsigned long );
90 CDSUNIT_INT_LESS( long long );
91 CDSUNIT_INT_LESS( unsigned long long );
92 #undef CDSUNIT_INT_LESS
95 struct cmp<std::string>
97 int operator()(std::string const& s1, std::string const& s2)
99 return s1.compare( s2 );
101 int operator()(std::string const& s1, char const * s2)
103 return s1.compare( s2 );
105 int operator()(char const * s1, std::string const& s2)
107 return -s2.compare( s1 );
112 struct less<std::string>
114 bool operator ()( std::string const& k1, std::string const& k2 ) const
116 return cmp<std::string>()( k1, k2 ) < 0;
118 bool operator ()( std::string const& k1, char const* k2 ) const
120 return cmp<std::string>()( k1, k2 ) < 0;
122 bool operator ()( char const* k1, std::string const& k2 ) const
124 return cmp<std::string>()( k1, k2 ) < 0;
128 template <typename T>
131 typedef size_t result_type;
132 typedef T argument_type;
134 size_t operator()( T const& k ) const
136 return std::hash<size_t>()(k.nKey);
139 size_t operator()( size_t k ) const
141 return std::hash<size_t>()(k);
148 typedef size_t result_type;
149 typedef size_t argument_type;
151 size_t operator()( size_t k ) const
153 return std::hash<size_t>()(k);
158 struct hash<std::string>
160 typedef size_t result_type;
161 typedef std::string argument_type;
163 size_t operator()( std::string const& k ) const
165 return std::hash<std::string>()(k);
170 template <typename ImplSelector, typename Key, typename Value>
173 template <typename Key, typename Value>
176 typedef Key key_type;
177 typedef Value value_type;
183 explicit key_val( key_type const& k ): key(k), val() {}
184 key_val( key_type const& k, value_type const& v ): key(k), val(v) {}
186 template <typename K>
187 explicit key_val( K const& k ): key(k) {}
189 template <typename K, typename T>
190 key_val( K const& k, T const& v ): key(k), val(v) {}
193 typedef set::hash<key_type> key_hash;
194 typedef set::less<key_type> key_less;
195 typedef set::cmp<key_type> key_compare;
198 bool operator()( key_val const& k1, key_val const& k2 ) const
200 return key_less()( k1.key, k2.key );
202 bool operator()( key_type const& k1, key_val const& k2 ) const
204 return key_less()( k1, k2.key );
206 bool operator()( key_val const& k1, key_type const& k2 ) const
208 return key_less()( k1.key, k2 );
213 int operator()( key_val const& k1, key_val const& k2 ) const
215 return key_compare()( k1.key, k2.key );
217 int operator()( key_type const& k1, key_val const& k2 ) const
219 return key_compare()( k1, k2.key );
221 int operator()( key_val const& k1, key_type const& k2 ) const
223 return key_compare()( k1.key, k2 );
228 bool operator()( key_val const& k1, key_val const& k2 ) const
230 return key_compare()( k1.key, k2.key ) == 0;
232 bool operator()( key_type const& k1, key_val const& k2 ) const
234 return key_compare()( k1, k2.key ) == 0;
236 bool operator()( key_val const& k1, key_type const& k2 ) const
238 return key_compare()( k1.key, k2 ) == 0;
243 struct hash: public key_hash
245 size_t operator()( key_val const& v ) const
247 return key_hash::operator()( v.key );
249 size_t operator()( key_type const& key ) const
251 return key_hash::operator()( key );
253 template <typename Q>
254 size_t operator()( Q const& k ) const
256 return key_hash::operator()( k );
260 struct hash2: public hash
262 size_t operator()( key_val const& k ) const
264 size_t h = hash::operator ()( k.key );
266 seed ^= h + 0x9e3779b9 + (seed << 6) + (seed >> 2);
269 size_t operator()( key_type const& k ) const
271 size_t h = hash::operator ()( k );
273 seed ^= h + 0x9e3779b9 + (seed << 6) + (seed >> 2);
276 template <typename Q>
277 size_t operator()( Q const& k ) const
279 return key_hash::operator()( k );
285 // *************************************************
287 // *************************************************
289 struct empty_stat {};
290 static inline cds_test::property_stream& operator <<( cds_test::property_stream& o, empty_stat const& )
295 template <typename Set>
296 static inline void print_stat( cds_test::property_stream& o, Set const& s )
302 //*******************************************************
304 //*******************************************************
306 template <typename Set>
307 static inline void additional_check( Set& /*set*/ )
310 template <typename Set>
311 static inline void additional_cleanup( Set& /*set*/ )
314 //*******************************************************
315 // check_before_clear
316 //*******************************************************
318 template <typename Set>
319 static inline void check_before_clear( Set& /*s*/ )
325 #endif // ifndef CDSUNIT_SET_TYPE_H