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>
38 #include <cds/urcu/signal_threaded.h>
40 #include <cds/sync/spinlock.h>
41 #include <cds/opt/hash.h>
42 #include <boost/functional/hash/hash.hpp>
44 #include <cds_test/stress_test.h>
45 #include <cds_test/check_size.h>
48 namespace cc = cds::container;
49 namespace co = cds::opt;
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;
59 template <typename Key>
62 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 ) 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
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
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 map::hash<Key> key_hash;
180 typedef map::less<Key> key_less;
181 typedef cmp<Key> key_compare;
184 bool operator()( Key const& k1, Key const& k2 ) const
186 return key_compare()( k1, k2 ) == 0;
190 struct hash2: public key_hash
192 size_t operator()( Key const& k ) const
194 size_t h = key_hash::operator ()( k );
196 seed ^= h + 0x9e3779b9 + (seed << 6) + (seed >> 2);
199 template <typename Q>
200 size_t operator()( Q const& k ) const
202 size_t h = key_hash::operator ()( k );
204 seed ^= h + 0x9e3779b9 + (seed << 6) + (seed >> 2);
210 struct empty_stat {};
211 static inline cds_test::property_stream& operator <<( cds_test::property_stream& o, empty_stat const& )
216 template <typename Map>
217 static inline void print_stat( cds_test::property_stream& o, Map const& m )
223 template <typename Map>
224 static inline void check_before_cleanup( Map& /*m*/ )
227 template <typename Map>
228 static inline void additional_cleanup( Map& /*m*/ )
231 template <typename Map>
232 static inline void additional_check( Map& /*m*/ )
237 #endif // ifndef CDSUNIT_MAP_TYPE_H