1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128
|
// Copyright (c) 2006-2018 Maxim Khizhinsky
//
// Distributed under the Boost Software License, Version 1.0. (See accompanying
// file LICENSE or copy at http://www.boost.org/LICENSE_1_0.txt)
#ifndef CDSUNIT_SET_TEST_SET_HP_H
#define CDSUNIT_SET_TEST_SET_HP_H
#include "test_set.h"
namespace cds_test {
class container_set_hp: public container_set
{
typedef container_set base_class;
protected:
template <typename Set>
void test( Set& s )
{
// Precondition: set is empty
// Postcondition: set is empty
ASSERT_TRUE( s.empty());
ASSERT_CONTAINER_SIZE( s, 0 );
base_class::test( s );
typedef typename Set::value_type value_type;
size_t const nSetSize = kSize;
std::vector< value_type > data;
std::vector< size_t> indices;
data.reserve( kSize );
indices.reserve( kSize );
for ( size_t key = 0; key < kSize; ++key ) {
data.push_back( value_type( static_cast<int>(key)));
indices.push_back( key );
}
shuffle( indices.begin(), indices.end());
for ( auto& i : data ) {
ASSERT_TRUE( s.insert( i ));
}
ASSERT_FALSE( s.empty());
ASSERT_CONTAINER_SIZE( s, nSetSize );
// iterator test
for ( auto it = s.begin(); it != s.end(); ++it ) {
it->nFindCount = it->key() * 3;
}
for ( auto it = s.cbegin(); it != s.cend(); ++it ) {
EXPECT_EQ( it->nFindCount, static_cast<size_t>( it->key() * 3 ));
}
typedef typename Set::guarded_ptr guarded_ptr;
guarded_ptr gp;
// get()
for ( auto idx : indices ) {
auto& i = data[idx];
ASSERT_TRUE( !gp );
switch ( idx % 3 ) {
case 0:
gp = s.get( i.key());
ASSERT_FALSE( !gp );
break;
case 1:
gp = s.get( i );
ASSERT_FALSE( !gp );
break;
case 2:
gp = s.get_with( other_item( i.key()), other_less());
ASSERT_FALSE( !gp );
}
EXPECT_EQ( gp->key(), i.key());
EXPECT_EQ( gp->nFindCount, static_cast<size_t>( i.key() * 3 ));
gp->nFindCount *= 2;
gp.release();
}
// extract()
for ( auto idx : indices ) {
auto& i = data[idx];
ASSERT_TRUE( !gp );
switch ( idx % 3 ) {
case 0:
gp = s.extract( i.key());
ASSERT_FALSE( !gp );
break;
case 1:
gp = s.extract( i );
ASSERT_FALSE( !gp );
break;
case 2:
gp = s.extract_with( other_item( i.key()), other_less());
ASSERT_FALSE( !gp );
break;
}
EXPECT_EQ( gp->key(), i.key());
EXPECT_EQ( gp->nFindCount, static_cast<size_t>( i.key() * 6 ));
switch ( idx % 3 ) {
case 0:
gp = s.extract( i.key());
break;
case 1:
gp = s.extract( i );
break;
case 2:
gp = s.extract_with( other_item( i.key()), other_less());
break;
}
ASSERT_TRUE( !gp );
}
ASSERT_TRUE( s.empty());
ASSERT_CONTAINER_SIZE( s, 0 );
}
};
} // namespace cds_test
#endif // CDSUNIT_SET_TEST_SET_HP_H
|