8
0
mirror of https://github.com/FirebirdSQL/firebird.git synced 2025-01-23 17:23:04 +01:00
firebird-mirror/extern/libcds/test/unit/set/test_set_hp.h
2022-10-08 20:46:39 +03:00

129 lines
3.8 KiB
C++

// 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