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_MAP_TYPE_H
32 #define CDSUNIT_MAP_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/sync/spinlock.h>
40 #include <cds/opt/hash.h>
41 #include <boost/functional/hash/hash.hpp>
43 #include <cds_test/stress_test.h>
44 #include <cds_test/check_size.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;
57 template <typename Key>
60 template <typename Key>
62 int operator ()(Key const& k1, Key const& k2) const
64 if ( less<Key>( k1, k2 ))
66 return less<Key>( k2, k1 ) ? 1 : 0;
70 template <typename Key>
73 #define CDSUNIT_INT_COMPARE(t) template <> struct cmp<t> { int operator()( t k1, t k2 ) const { return (int)(k1 - k2); } }
74 CDSUNIT_INT_COMPARE(char);
75 CDSUNIT_INT_COMPARE(unsigned char);
76 CDSUNIT_INT_COMPARE(int);
77 CDSUNIT_INT_COMPARE(unsigned int);
78 CDSUNIT_INT_COMPARE(long);
79 CDSUNIT_INT_COMPARE(unsigned long);
80 CDSUNIT_INT_COMPARE(long long);
81 CDSUNIT_INT_COMPARE(unsigned long long);
82 #undef CDSUNIT_INT_COMPARE
84 #define CDSUNIT_INT_LESS(t) template <> struct less<t> { bool operator()( t k1, t k2 ) const { return k1 < k2; } }
85 CDSUNIT_INT_LESS( char );
86 CDSUNIT_INT_LESS( unsigned char );
87 CDSUNIT_INT_LESS( int );
88 CDSUNIT_INT_LESS( unsigned int );
89 CDSUNIT_INT_LESS( long );
90 CDSUNIT_INT_LESS( unsigned long );
91 CDSUNIT_INT_LESS( long long );
92 CDSUNIT_INT_LESS( unsigned long long );
93 #undef CDSUNIT_INT_LESS
96 struct cmp<std::string>
98 int operator()(std::string const& s1, std::string const& s2)
100 return s1.compare( s2 );
102 int operator()(std::string const& s1, char const * s2)
104 return s1.compare( s2 );
106 int operator()(char const * s1, std::string const& s2)
108 return -s2.compare( s1 );
113 struct less<std::string>
115 bool operator ()( std::string const& k1, std::string const& k2 ) const
117 return cmp<std::string>()(k1, k2) < 0;
119 bool operator ()( std::string const& k1, char const* k2 ) const
121 return cmp<std::string>()(k1, k2) < 0;
123 bool operator ()( char const* k1, std::string const& k2 ) const
125 return cmp<std::string>()(k1, k2) < 0;
129 template <typename T>
132 typedef size_t result_type;
133 typedef T argument_type;
135 size_t operator()( T const& k ) const
137 return std::hash<size_t>()(k.nKey);
140 size_t operator()( size_t k ) const
142 return std::hash<size_t>()(k);
149 typedef size_t result_type;
150 typedef size_t argument_type;
152 size_t operator()( size_t k ) const
154 return std::hash<size_t>()(k);
159 struct hash<std::string>
161 typedef size_t result_type;
162 typedef std::string argument_type;
164 size_t operator()( std::string const& k ) const
166 return std::hash<std::string>()(k);
171 template <typename ImplSelector, typename Key, typename Value>
174 template <typename Key, typename Value>
177 typedef map::hash<Key> key_hash;
178 typedef map::less<Key> key_less;
179 typedef cmp<Key> key_compare;
182 bool operator()( Key const& k1, Key const& k2 ) const
184 return key_compare()( k1, k2 ) == 0;
188 struct hash2: public key_hash
190 size_t operator()( Key const& k ) const
192 size_t h = key_hash::operator ()( k );
194 seed ^= h + 0x9e3779b9 + (seed << 6) + (seed >> 2);
197 template <typename Q>
198 size_t operator()( Q const& k ) const
200 size_t h = key_hash::operator ()( k );
202 seed ^= h + 0x9e3779b9 + (seed << 6) + (seed >> 2);
208 struct empty_stat {};
209 static inline cds_test::property_stream& operator <<( cds_test::property_stream& o, empty_stat const& )
214 template <typename Map>
215 static inline void print_stat( cds_test::property_stream& o, Map const& m )
221 template <typename Map>
222 static inline void check_before_cleanup( Map& /*m*/ )
225 template <typename Map>
226 static inline void additional_cleanup( Map& /*m*/ )
229 template <typename Map>
230 static inline void additional_check( Map& /*m*/ )
235 #endif // ifndef CDSUNIT_MAP_TYPE_H