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>
38 #include <cds/urcu/signal_threaded.h>
40 #include <cds/opt/hash.h>
41 #include <cds/sync/spinlock.h>
43 #include <cds_test/stress_test.h>
46 namespace cc = cds::container;
47 namespace co = cds::opt;
49 typedef cds::urcu::gc< cds::urcu::general_instant_stripped > rcu_gpi;
50 typedef cds::urcu::gc< cds::urcu::general_buffered_stripped > rcu_gpb;
51 typedef cds::urcu::gc< cds::urcu::general_threaded_stripped > rcu_gpt;
52 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
53 typedef cds::urcu::gc< cds::urcu::signal_buffered_stripped > rcu_shb;
54 typedef cds::urcu::gc< cds::urcu::signal_threaded_stripped > rcu_sht;
57 template <typename Key>
60 template <typename Key>
63 int operator ()(Key const& k1, Key const& k2) const
65 if ( less<Key>( k1, k2 ))
67 return less<Key>( k2, k1 ) ? 1 : 0;
71 template <typename Key>
74 #define CDSUNIT_INT_COMPARE(t) template <> struct cmp<t> { int operator()( t k1, t k2 ){ return (int)(k1 - k2); } }
75 CDSUNIT_INT_COMPARE(char);
76 CDSUNIT_INT_COMPARE(unsigned char);
77 CDSUNIT_INT_COMPARE(int);
78 CDSUNIT_INT_COMPARE(unsigned int);
79 CDSUNIT_INT_COMPARE(long);
80 CDSUNIT_INT_COMPARE(unsigned long);
81 CDSUNIT_INT_COMPARE(long long);
82 CDSUNIT_INT_COMPARE(unsigned long long);
83 #undef CDSUNIT_INT_COMPARE
85 #define CDSUNIT_INT_LESS(t) template <> struct less<t> { bool operator()( t k1, t k2 ){ return k1 < k2; } }
86 CDSUNIT_INT_LESS( char );
87 CDSUNIT_INT_LESS( unsigned char );
88 CDSUNIT_INT_LESS( int );
89 CDSUNIT_INT_LESS( unsigned int );
90 CDSUNIT_INT_LESS( long );
91 CDSUNIT_INT_LESS( unsigned long );
92 CDSUNIT_INT_LESS( long long );
93 CDSUNIT_INT_LESS( unsigned long long );
94 #undef CDSUNIT_INT_LESS
97 struct cmp<std::string>
99 int operator()(std::string const& s1, std::string const& s2)
101 return s1.compare( s2 );
103 int operator()(std::string const& s1, char const * s2)
105 return s1.compare( s2 );
107 int operator()(char const * s1, std::string const& s2)
109 return -s2.compare( s1 );
114 struct less<std::string>
116 bool operator ()( std::string const& k1, std::string const& k2 ) const
118 return cmp<std::string>()( k1, k2 ) < 0;
120 bool operator ()( std::string const& k1, char const* k2 ) const
122 return cmp<std::string>()( k1, k2 ) < 0;
124 bool operator ()( char const* k1, std::string const& k2 ) const
126 return cmp<std::string>()( k1, k2 ) < 0;
130 template <typename T>
133 typedef size_t result_type;
134 typedef T argument_type;
136 size_t operator()( T const& k ) const
138 return std::hash<size_t>()(k.nKey);
141 size_t operator()( size_t k ) const
143 return std::hash<size_t>()(k);
150 typedef size_t result_type;
151 typedef size_t argument_type;
153 size_t operator()( size_t k ) const
155 return std::hash<size_t>()(k);
160 struct hash<std::string>
162 typedef size_t result_type;
163 typedef std::string argument_type;
165 size_t operator()( std::string const& k ) const
167 return std::hash<std::string>()(k);
172 template <typename ImplSelector, typename Key, typename Value>
175 template <typename Key, typename Value>
178 typedef Key key_type;
179 typedef Value value_type;
185 explicit key_val( key_type const& k ): key(k), val() {}
186 key_val( key_type const& k, value_type const& v ): key(k), val(v) {}
188 template <typename K>
189 explicit key_val( K const& k ): key(k) {}
191 template <typename K, typename T>
192 key_val( K const& k, T const& v ): key(k), val(v) {}
195 typedef set::hash<key_type> key_hash;
196 typedef set::less<key_type> key_less;
197 typedef set::cmp<key_type> key_compare;
200 bool operator()( key_val const& k1, key_val const& k2 ) const
202 return key_less()( k1.key, k2.key );
204 bool operator()( key_type const& k1, key_val const& k2 ) const
206 return key_less()( k1, k2.key );
208 bool operator()( key_val const& k1, key_type const& k2 ) const
210 return key_less()( k1.key, k2 );
215 int operator()( key_val const& k1, key_val const& k2 ) const
217 return key_compare()( k1.key, k2.key );
219 int operator()( key_type const& k1, key_val const& k2 ) const
221 return key_compare()( k1, k2.key );
223 int operator()( key_val const& k1, key_type const& k2 ) const
225 return key_compare()( k1.key, k2 );
230 bool operator()( key_val const& k1, key_val const& k2 ) const
232 return key_compare()( k1.key, k2.key ) == 0;
234 bool operator()( key_type const& k1, key_val const& k2 ) const
236 return key_compare()( k1, k2.key ) == 0;
238 bool operator()( key_val const& k1, key_type const& k2 ) const
240 return key_compare()( k1.key, k2 ) == 0;
245 struct hash: public key_hash
247 size_t operator()( key_val const& v ) const
249 return key_hash::operator()( v.key );
251 size_t operator()( key_type const& key ) const
253 return key_hash::operator()( key );
255 template <typename Q>
256 size_t operator()( Q const& k ) const
258 return key_hash::operator()( k );
262 struct hash2: public hash
264 size_t operator()( key_val const& k ) const
266 size_t h = hash::operator ()( k.key );
268 seed ^= h + 0x9e3779b9 + (seed << 6) + (seed >> 2);
271 size_t operator()( key_type const& k ) const
273 size_t h = hash::operator ()( k );
275 seed ^= h + 0x9e3779b9 + (seed << 6) + (seed >> 2);
278 template <typename Q>
279 size_t operator()( Q const& k ) const
281 return key_hash::operator()( k );
287 // *************************************************
289 // *************************************************
291 struct empty_stat {};
292 static inline cds_test::property_stream& operator <<( cds_test::property_stream& o, empty_stat const& )
297 template <typename Set>
298 static inline void print_stat( cds_test::property_stream& o, Set const& s )
304 //*******************************************************
306 //*******************************************************
308 template <typename Set>
309 static inline void additional_check( Set& /*set*/ )
312 template <typename Set>
313 static inline void additional_cleanup( Set& /*set*/ )
316 //*******************************************************
317 // check_before_clear
318 //*******************************************************
320 template <typename Set>
321 static inline void check_before_clear( Set& /*s*/ )
327 #endif // ifndef CDSUNIT_SET_TYPE_H