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_MAP_TEST_MAP_NOGC_H
32 #define CDSUNIT_MAP_TEST_MAP_NOGC_H
34 #include <cds_test/check_size.h>
35 #include <cds_test/fixture.h>
37 #include <cds/opt/hash.h>
39 // forward declaration
40 namespace cds { namespace container {} }
44 class container_map_nogc: public fixture
47 static size_t const kSize = 1000;
52 explicit key_type( int n )
56 explicit key_type( std::string const& str )
57 : nKey( std::stoi( str ))
69 explicit value_type( int n )
71 , strVal( std::to_string( n ))
74 explicit value_type( std::string const& str )
75 : nVal( std::stoi( str ))
79 explicit value_type( std::string&& str )
80 : nVal( std::stoi( str ))
81 , strVal( std::move( str ))
84 value_type( int n, std::string const& str )
89 value_type( int n, std::string&& str )
91 , strVal( std::move( str ))
94 value_type( value_type&& v )
96 , strVal( std::move( v.strVal ))
99 value_type( value_type const& v )
104 value_type& operator=( value_type const& v )
113 value_type& operator=( value_type&& v )
117 strVal = std::move( v.strVal );
123 typedef std::pair<key_type const, value_type> pair_type;
127 bool operator ()( key_type const& v1, key_type const& v2 ) const
129 return v1.nKey < v2.nKey;
132 bool operator ()( key_type const& v1, int v2 ) const
137 bool operator ()( int v1, key_type const& v2 ) const
142 bool operator ()( key_type const& v1, std::string const& v2 ) const
144 return v1.nKey < std::stoi(v2 );
147 bool operator ()( std::string const& v1, key_type const& v2 ) const
149 return std::stoi( v1 ) < v2.nKey;
154 int operator ()( key_type const& v1, key_type const& v2 ) const
156 if ( v1.nKey < v2.nKey )
158 return v1.nKey > v2.nKey ? 1 : 0;
161 int operator ()( key_type const& v1, int v2 ) const
165 return v1.nKey > v2 ? 1 : 0;
168 int operator ()( int v1, key_type const& v2 ) const
172 return v1 > v2.nKey ? 1 : 0;
175 int operator ()( key_type const& v1, std::string const& v2 ) const
177 int n2 = std::stoi( v2 );
180 return v1.nKey > n2 ? 1 : 0;
183 int operator ()( std::string const& v1, key_type const& v2 ) const
185 int n1 = std::stoi( v1 );
188 return n1 > v2.nKey ? 1 : 0;
193 size_t operator()( int i ) const
195 return cds::opt::v::hash<int>()( i );
198 size_t operator()( std::string const& str ) const
200 return cds::opt::v::hash<int>()( std::stoi( str ));
203 template <typename T>
204 size_t operator()( T const& i ) const
206 return cds::opt::v::hash<int>()(i.nKey);
213 other_item( int key )
220 bool operator ()( key_type const& v1, other_item const& v2 ) const
222 return v1.nKey < v2.nKey;
224 bool operator ()( other_item const& v1, key_type const& v2 ) const
226 return v1.nKey < v2.nKey;
234 // Precondition: map is empty
235 // Postcondition: map is empty
237 ASSERT_TRUE( m.empty());
238 ASSERT_CONTAINER_SIZE( m, 0 );
240 typedef typename Map::value_type map_pair;
241 typedef typename Map::iterator iterator;
242 typedef typename Map::const_iterator const_iterator;
243 size_t const kkSize = kSize;
245 std::vector<key_type> arrKeys;
246 for ( int i = 0; i < static_cast<int>(kkSize); ++i )
247 arrKeys.push_back( key_type( i ));
248 shuffle( arrKeys.begin(), arrKeys.end());
250 std::vector< value_type > arrVals;
251 for ( size_t i = 0; i < kkSize; ++i ) {
253 val.nVal = static_cast<int>( i );
254 val.strVal = std::to_string( i );
255 arrVals.push_back( val );
259 for ( auto const& i : arrKeys ) {
260 value_type const& val( arrVals.at( i.nKey ));
262 ASSERT_FALSE( m.contains( i.nKey ) != m.end());
263 ASSERT_FALSE( m.contains( i ) != m.end());
264 ASSERT_FALSE( m.contains( other_item( i.nKey ), other_less()) != m.end());
266 std::pair< iterator, bool > updResult;
268 switch ( i.nKey % 16 ) {
271 ASSERT_FALSE( it == m.end());
272 ASSERT_TRUE( m.insert( i ) == m.end());
273 it->second.nVal = it->first.nKey;
274 it->second.strVal = std::to_string( it->first.nKey );
277 it = m.insert( i.nKey );
278 ASSERT_FALSE( it == m.end() );
279 ASSERT_TRUE( m.insert( i.nKey ) == m.end());
280 it->second.nVal = it->first.nKey;
281 it->second.strVal = std::to_string( it->first.nKey );
284 it = m.insert( std::to_string( i.nKey ));
285 ASSERT_FALSE( it == m.end() );
286 ASSERT_TRUE( m.insert( std::to_string( i.nKey )) == m.end());
287 it->second.nVal = it->first.nKey;
288 it->second.strVal = std::to_string( it->first.nKey );
291 it = m.insert( i, val );
292 ASSERT_FALSE( it == m.end() );
293 ASSERT_TRUE( m.insert( i, val ) == m.end());
296 it = m.insert( i.nKey, val.strVal );
297 ASSERT_FALSE( it == m.end() );
298 ASSERT_TRUE( m.insert( i.nKey, val.strVal ) == m.end());
301 it = m.insert( val.strVal, i.nKey );
302 ASSERT_FALSE( it == m.end() );
303 ASSERT_TRUE( m.insert( val.strVal, i.nKey ) == m.end());
306 it = m.insert_with( i, []( map_pair& v ) {
307 v.second.nVal = v.first.nKey;
308 v.second.strVal = std::to_string( v.first.nKey );
310 ASSERT_FALSE( it == m.end() );
311 ASSERT_TRUE( m.insert_with( i, []( map_pair& v ) {
312 EXPECT_TRUE( false );
316 it = m.insert_with( i.nKey, []( map_pair& v ) {
317 v.second.nVal = v.first.nKey;
318 v.second.strVal = std::to_string( v.first.nKey );
320 ASSERT_FALSE( it == m.end() );
321 ASSERT_TRUE( m.insert_with( i.nKey, []( map_pair& v ) {
322 EXPECT_TRUE( false );
326 it = m.insert_with( val.strVal, []( map_pair& v ) {
327 v.second.nVal = v.first.nKey;
328 v.second.strVal = std::to_string( v.first.nKey );
330 ASSERT_FALSE( it == m.end() );
331 ASSERT_TRUE( m.insert_with( val.strVal, []( map_pair& v ) {
332 EXPECT_TRUE( false );
336 updResult = m.update( i.nKey, false );
337 ASSERT_TRUE( updResult.first == m.end() );
338 ASSERT_FALSE( updResult.second );
340 updResult = m.update( i.nKey );
341 ASSERT_TRUE( updResult.first != m.end());
342 ASSERT_TRUE( updResult.second );
343 updResult.first->second.nVal = updResult.first->first.nKey;
345 updResult = m.update( i.nKey, false );
346 ASSERT_TRUE( updResult.first != m.end() );
347 ASSERT_FALSE( updResult.second );
348 EXPECT_EQ( updResult.first->first.nKey, updResult.first->second.nVal );
349 updResult.first->second.strVal = std::to_string( updResult.first->second.nVal );
352 updResult = m.update( i, false );
353 ASSERT_TRUE( updResult.first == m.end() );
354 ASSERT_FALSE( updResult.second );
356 updResult = m.update( i );
357 ASSERT_TRUE( updResult.first != m.end());
358 ASSERT_TRUE( updResult.second );
359 updResult.first->second.nVal = updResult.first->first.nKey;
361 updResult = m.update( i );
362 ASSERT_TRUE( updResult.first != m.end());
363 ASSERT_FALSE( updResult.second );
364 EXPECT_EQ( updResult.first->first.nKey, updResult.first->second.nVal );
365 updResult.first->second.strVal = std::to_string( updResult.first->second.nVal );
368 updResult = m.update( val.strVal, false );
369 ASSERT_TRUE( updResult.first == m.end());
370 ASSERT_FALSE( updResult.second );
372 updResult = m.update( val.strVal );
373 ASSERT_TRUE( updResult.first != m.end());
374 ASSERT_TRUE( updResult.second );
375 updResult.first->second.nVal = updResult.first->first.nKey;
377 updResult = m.update( val.strVal, false );
378 ASSERT_TRUE( updResult.first != m.end());
379 ASSERT_FALSE( updResult.second );
380 EXPECT_EQ( updResult.first->first.nKey, updResult.first->second.nVal );
381 updResult.first->second.strVal = std::to_string( updResult.first->second.nVal );
384 it = m.emplace( i.nKey );
385 ASSERT_TRUE( it != m.end());
386 ASSERT_FALSE( m.emplace( i.nKey ) != m.end());
387 it->second.nVal = it->first.nKey;
388 it->second.strVal = std::to_string( it->first.nKey );
391 it = m.emplace( i, i.nKey );
392 ASSERT_TRUE( it != m.end() );
393 ASSERT_FALSE( m.emplace( i, i.nKey ) != m.end());
397 std::string str = val.strVal;
398 it = m.emplace( i, std::move( str ));
399 ASSERT_TRUE( it != m.end() );
400 ASSERT_TRUE( str.empty());
402 ASSERT_FALSE( m.emplace( i, std::move( str )) != m.end());
403 ASSERT_TRUE( str.empty());
408 std::string str = val.strVal;
409 it = m.emplace( i, i.nKey, std::move( str ));
410 ASSERT_TRUE( it != m.end() );
411 ASSERT_TRUE( str.empty());
413 ASSERT_FALSE( m.emplace( i, i.nKey, std::move( str )) != m.end());
414 ASSERT_TRUE( str.empty());
419 it = m.contains( i.nKey );
420 ASSERT_TRUE( it != m.end());
421 ASSERT_TRUE( m.contains( i ) == it );
422 ASSERT_TRUE( m.contains( other_item( i.nKey ), other_less()) == it );
423 EXPECT_EQ( it->first.nKey, it->second.nVal );
424 EXPECT_EQ( std::to_string( it->first.nKey ), it->second.strVal );
426 ASSERT_FALSE( m.empty() );
427 ASSERT_CONTAINER_SIZE( m, kkSize );
428 ASSERT_FALSE( m.begin() == m.end() );
429 ASSERT_FALSE( m.cbegin() == m.cend() );
435 ASSERT_TRUE( m.empty() );
436 ASSERT_CONTAINER_SIZE( m, 0 );
437 ASSERT_TRUE( m.begin() == m.end() );
438 ASSERT_TRUE( m.cbegin() == m.cend() );
442 } // namespace cds_test
444 #endif // #ifndef CDSUNIT_MAP_TEST_MAP_NOGC_H