2 This file is a part of libcds - Concurrent Data Structures library
4 (C) Copyright Maxim Khizhinsky (libcds.dev@gmail.com) 2006-2016
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>
44 #include "framework/michael_alloc.h"
47 namespace cc = cds::container;
48 namespace co = cds::opt;
50 typedef cds::urcu::gc< cds::urcu::general_instant_stripped > rcu_gpi;
51 typedef cds::urcu::gc< cds::urcu::general_buffered_stripped > rcu_gpb;
52 typedef cds::urcu::gc< cds::urcu::general_threaded_stripped > rcu_gpt;
53 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
54 typedef cds::urcu::gc< cds::urcu::signal_buffered_stripped > rcu_shb;
55 typedef cds::urcu::gc< cds::urcu::signal_threaded_stripped > rcu_sht;
58 template <typename Key>
61 template <typename Key>
64 int operator ()(Key const& k1, Key const& k2) const
66 if ( less<Key>( k1, k2 ) )
68 return less<Key>( k2, k1 ) ? 1 : 0;
72 template <typename Key>
75 #define CDSUNIT_INT_COMPARE(t) template <> struct cmp<t> { int operator()( t k1, t k2 ){ 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
86 #define CDSUNIT_INT_LESS(t) template <> struct less<t> { bool operator()( t k1, t k2 ){ 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
98 struct cmp<std::string>
100 int operator()(std::string const& s1, std::string const& s2)
102 return s1.compare( s2 );
104 int operator()(std::string const& s1, char const * s2)
106 return s1.compare( s2 );
108 int operator()(char const * s1, std::string const& s2)
110 return -s2.compare( s1 );
115 struct less<std::string>
117 bool operator ()( std::string const& k1, std::string const& k2 ) const
119 return cmp<std::string>()( k1, k2 ) < 0;
121 bool operator ()( std::string const& k1, char const* k2 ) const
123 return cmp<std::string>()( k1, k2 ) < 0;
125 bool operator ()( char const* k1, std::string const& k2 ) const
127 return cmp<std::string>()( k1, k2 ) < 0;
131 template <typename T>
134 typedef size_t result_type;
135 typedef T argument_type;
137 size_t operator()( T const& k ) const
139 return std::hash<size_t>()(k.nKey);
142 size_t operator()( size_t k ) const
144 return std::hash<size_t>()(k);
151 typedef size_t result_type;
152 typedef size_t argument_type;
154 size_t operator()( size_t k ) const
156 return std::hash<size_t>()(k);
161 struct hash<std::string>
163 typedef size_t result_type;
164 typedef std::string argument_type;
166 size_t operator()( std::string const& k ) const
168 return std::hash<std::string>()(k);
173 template <typename ImplSelector, typename Key, typename Value>
176 template <typename Key, typename Value>
179 typedef Key key_type;
180 typedef Value value_type;
186 /*explicit*/ key_val( key_type const& k ): key(k), val() {}
187 key_val( key_type const& k, value_type const& v ): key(k), val(v) {}
189 template <typename K>
190 explicit key_val( K const& k ): key(k) {}
192 template <typename K, typename T>
193 key_val( K const& k, T const& v ): key(k), val(v) {}
196 typedef set::hash<key_type> key_hash;
197 typedef set::less<key_type> key_less;
198 typedef set::cmp<key_type> key_compare;
201 bool operator()( key_val const& k1, key_val const& k2 ) const
203 return key_less()( k1.key, k2.key );
205 bool operator()( key_type const& k1, key_val const& k2 ) const
207 return key_less()( k1, k2.key );
209 bool operator()( key_val const& k1, key_type const& k2 ) const
211 return key_less()( k1.key, k2 );
216 int operator()( key_val const& k1, key_val const& k2 ) const
218 return key_compare()( k1.key, k2.key );
220 int operator()( key_type const& k1, key_val const& k2 ) const
222 return key_compare()( k1, k2.key );
224 int operator()( key_val const& k1, key_type const& k2 ) const
226 return key_compare()( k1.key, k2 );
231 bool operator()( key_val const& k1, key_val const& k2 ) const
233 return key_compare()( k1.key, k2.key ) == 0;
235 bool operator()( key_type const& k1, key_val const& k2 ) const
237 return key_compare()( k1, k2.key ) == 0;
239 bool operator()( key_val const& k1, key_type const& k2 ) const
241 return key_compare()( k1.key, k2 ) == 0;
246 struct hash: public key_hash
248 size_t operator()( key_val const& v ) const
250 return key_hash::operator()( v.key );
252 size_t operator()( key_type const& key ) const
254 return key_hash::operator()( key );
256 template <typename Q>
257 size_t operator()( Q const& k ) const
259 return key_hash::operator()( k );
263 struct hash2: public hash
265 size_t operator()( key_val const& k ) const
267 size_t h = hash::operator ()( k.key );
269 seed ^= h + 0x9e3779b9 + (seed << 6) + (seed >> 2);
272 size_t operator()( key_type const& k ) const
274 size_t h = hash::operator ()( k );
276 seed ^= h + 0x9e3779b9 + (seed << 6) + (seed >> 2);
279 template <typename Q>
280 size_t operator()( Q const& k ) const
282 return key_hash::operator()( k );
288 // *************************************************
290 // *************************************************
292 template <typename Set>
293 static inline void print_stat( cds_test::property_stream&, Set const& /*s*/ )
297 //*******************************************************
299 //*******************************************************
301 template <typename Set>
302 static inline void additional_check( Set& /*set*/ )
305 template <typename Set>
306 static inline void additional_cleanup( Set& /*set*/ )
309 //*******************************************************
310 // check_before_clear
311 //*******************************************************
313 template <typename Set>
314 static inline void check_before_clear( Set& /*s*/ )
320 #endif // ifndef CDSUNIT_SET_TYPE_H