Source code repo: http://github.com/khizmax/libcds/
Download: http://sourceforge.net/projects/libcds/files/
-
+
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met:
SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
#ifndef CDSUNIT_TREE_TEST_INTRUSIVE_TREE_H
}
};
+ typedef int key_type;
+
template <typename Node>
struct base_int_item
: public Node
}
};
+ struct key_extractor
+ {
+ template <typename T>
+ void operator()( key_type& key, T const& val ) const
+ {
+ key = val.key();
+ }
+ };
+
struct simple_item_counter {
size_t m_nCount;
{
return lhs < rhs.key();
}
+
+ bool operator()( int lhs, int rhs ) const
+ {
+ return lhs < rhs;
+ }
};
template <typename T>
return v1.key() > v2.key() ? 1 : 0;
}
- bool operator()( T const& lhs, int rhs ) const
+ int operator()( T const& lhs, int rhs ) const
{
if ( lhs.key() < rhs )
return -1;
return lhs.key() > rhs ? 1 : 0;
}
- bool operator()( int lhs, T const& rhs ) const
+ int operator()( int lhs, T const& rhs ) const
{
if ( lhs < rhs.key() )
return -1;
return lhs > rhs.key() ? 1 : 0;
}
+
+ int operator()( int lhs, int rhs ) const
+ {
+ if ( lhs < rhs )
+ return -1;
+ return lhs > rhs ? 1 : 0;
+ }
};
struct other_item {
{
return lhs.key() < rhs.key();
}
+
+ template <typename Q>
+ bool operator()( Q const& lhs, int rhs ) const
+ {
+ return lhs.key() < rhs;
+ }
+
+ template <typename T>
+ bool operator()( int lhs, T const& rhs ) const
+ {
+ return lhs < rhs.key();
+ }
};
struct mock_disposer
std::pair<bool, bool> updResult;
- updResult = t.update( i, []( bool bNew, value_type&, value_type& )
+ updResult = t.update( i, []( bool, value_type&, value_type& )
{
ASSERT_TRUE( false );
}, false );
EXPECT_FALSE( updResult.second );
break;
case 1:
- EXPECT_EQ( i.nUpdateNewCount, 0 );
+ EXPECT_EQ( i.nUpdateNewCount, 0u );
ASSERT_TRUE( t.insert( i, []( value_type& v ) { ++v.nUpdateNewCount;} ));
- EXPECT_EQ( i.nUpdateNewCount, 1 );
+ EXPECT_EQ( i.nUpdateNewCount, 1u );
ASSERT_FALSE( t.insert( i, []( value_type& v ) { ++v.nUpdateNewCount;} ) );
- EXPECT_EQ( i.nUpdateNewCount, 1 );
+ EXPECT_EQ( i.nUpdateNewCount, 1u );
i.nUpdateNewCount = 0;
break;
case 2:
- updResult = t.update( i, []( bool bNew, value_type& val, value_type& arg )
+ updResult = t.update( i, []( bool, value_type&, value_type& )
{
EXPECT_TRUE( false );
}, false );
EXPECT_FALSE( updResult.first );
EXPECT_FALSE( updResult.second );
- EXPECT_EQ( i.nUpdateNewCount, 0 );
+ EXPECT_EQ( i.nUpdateNewCount, 0u );
updResult = t.update( i, []( bool bNew, value_type& val, value_type& arg )
{
EXPECT_TRUE( bNew );
});
EXPECT_TRUE( updResult.first );
EXPECT_TRUE( updResult.second );
- EXPECT_EQ( i.nUpdateNewCount, 1 );
+ EXPECT_EQ( i.nUpdateNewCount, 1u );
i.nUpdateNewCount = 0;
- EXPECT_EQ( i.nUpdateCount, 0 );
+ EXPECT_EQ( i.nUpdateCount, 0u );
updResult = t.update( i, []( bool bNew, value_type& val, value_type& arg )
{
EXPECT_FALSE( bNew );
++val.nUpdateCount;
}, false );
EXPECT_TRUE( updResult.first );
- EXPECT_TRUE( updResult.second );
- EXPECT_EQ( i.nUpdateCount, 1 );
+ EXPECT_FALSE( updResult.second );
+ EXPECT_EQ( i.nUpdateCount, 1u );
i.nUpdateCount = 0;
break;
ASSERT_TRUE( t.contains( i.nKey ) );
ASSERT_TRUE( t.contains( i ) );
ASSERT_TRUE( t.contains( other_item( i.key() ), other_less()));
- EXPECT_EQ( i.nFindCount, 0 );
+ EXPECT_EQ( i.nFindCount, 0u );
ASSERT_TRUE( t.find( i.nKey, []( value_type& v, int ) { ++v.nFindCount; } ));
- EXPECT_EQ( i.nFindCount, 1 );
+ EXPECT_EQ( i.nFindCount, 1u );
ASSERT_TRUE( t.find_with( other_item( i.key() ), other_less(), []( value_type& v, other_item const& ) { ++v.nFindCount; } ));
- EXPECT_EQ( i.nFindCount, 2 );
+ EXPECT_EQ( i.nFindCount, 2u );
ASSERT_TRUE( t.find( i, []( value_type& v, value_type& ) { ++v.nFindCount; } ) );
- EXPECT_EQ( i.nFindCount, 3 );
+ EXPECT_EQ( i.nFindCount, 3u );
}
ASSERT_FALSE( t.empty() );
ASSERT_CONTAINER_SIZE( t, nTreeSize );
ASSERT_TRUE( t.contains( i.nKey ) );
ASSERT_TRUE( t.contains( i ) );
ASSERT_TRUE( t.contains( other_item( i.key() ), other_less() ) );
- EXPECT_EQ( i.nFindCount, 0 );
+ EXPECT_EQ( i.nFindCount, 0u );
ASSERT_TRUE( t.find( i.nKey, []( value_type& v, int ) { ++v.nFindCount; } ) );
- EXPECT_EQ( i.nFindCount, 1 );
+ EXPECT_EQ( i.nFindCount, 1u );
ASSERT_TRUE( t.find_with( other_item( i.key() ), other_less(), []( value_type& v, other_item const& ) { ++v.nFindCount; } ) );
- EXPECT_EQ( i.nFindCount, 2 );
+ EXPECT_EQ( i.nFindCount, 2u );
value_type v( i );
switch ( i.key() % 6 ) {
ASSERT_FALSE( t.erase_with( other_item( i.key() ), other_less() ) );
break;
case 4:
- EXPECT_EQ( i.nEraseCount, 0 );
+ EXPECT_EQ( i.nEraseCount, 0u );
ASSERT_TRUE( t.erase( v, []( value_type& val ) { ++val.nEraseCount; } ));
- EXPECT_EQ( i.nEraseCount, 1 );
+ EXPECT_EQ( i.nEraseCount, 1u );
ASSERT_FALSE( t.erase( v, []( value_type& val ) { ++val.nEraseCount; } ));
- EXPECT_EQ( i.nEraseCount, 1 );
+ EXPECT_EQ( i.nEraseCount, 1u );
break;
case 5:
- EXPECT_EQ( i.nEraseCount, 0 );
+ EXPECT_EQ( i.nEraseCount, 0u );
ASSERT_TRUE( t.erase_with( other_item( i.key() ), other_less(), []( value_type& val ) { ++val.nEraseCount; } ));
- EXPECT_EQ( i.nEraseCount, 1 );
+ EXPECT_EQ( i.nEraseCount, 1u );
ASSERT_FALSE( t.erase_with( other_item( i.key() ), other_less(), []( value_type& val ) { ++val.nEraseCount; } ));
- EXPECT_EQ( i.nEraseCount, 1 );
+ EXPECT_EQ( i.nEraseCount, 1u );
break;
}
// Force retiring cycle
Tree::gc::force_dispose();
for ( auto& i : data ) {
- EXPECT_EQ( i.nDisposeCount, 1 );
+ EXPECT_EQ( i.nDisposeCount, 1u );
}
// clear
- for ( auto& i : data ) {
+ for ( auto idx : indices ) {
+ auto& i = data[idx];
i.clear_stat();
ASSERT_TRUE( t.insert( i ));
}
t.clear();
ASSERT_TRUE( t.empty());
- ASSERT_CONTAINER_SIZE( t, 0 );
- ASSERT_TRUE( t.begin() == t.end() );
- ASSERT_TRUE( t.cbegin() == t.cend() );
+ ASSERT_CONTAINER_SIZE( t, 0u );
// Force retiring cycle
Tree::gc::force_dispose();
for ( auto& i : data ) {
- EXPECT_EQ( i.nDisposeCount, 1 );
+ EXPECT_EQ( i.nDisposeCount, 1u );
}
}
};