set02.cpp
来自「开放源码的编译器open watcom 1.6.0版的源代码」· C++ 代码 · 共 485 行 · 第 1/2 页
CPP
485 行
bool allocator_test( )
{
typedef std::multiset< int, std::less<int>, LowMemAllocator<int> > set_t;
LowMemAllocator<int> mem(200);
mem.SetTripOnAlloc();
set_t s( set_t::key_compare(), mem );
bool thrown = false;
//LowMemAllocator is set to trip after 200 allocations or 100 inserts
//(each unique key gets 2 allocations in multimap/set)
try{
for( int i=0; i<101; i++ ){
s.insert( i );
}
}catch( std::bad_alloc const & ){
mem = s.get_allocator();
if( mem.GetNumAllocs() != 201 ) FAIL //should have failed on 201st
if( INSANE(s) || s.size() != 100 ) FAIL
thrown = true;
}
if( !thrown ) FAIL //exception should have been thrown
s.clear();
mem.Reset(200);
mem.SetTripOnConstruct();
thrown = false;
//LowMemAllocator is set to trip after 100 allocations
try{
for( int i=0; i<101; i++ ){
s.insert( i );
}
}catch( std::bad_alloc const & ){
mem = s.get_allocator();
if( mem.GetNumConstructs() != 201 ) FAIL
//should have cleaned up last extra alloc
if( mem.GetNumAllocs() != 201 || mem.GetNumDeallocs() != 1 ) FAIL
if( INSANE(s) || s.size() != 100 ) FAIL
thrown = true;
}
if( !thrown ) FAIL //exception should have been thrown
//if container didn't deal with the exception and clean up the allocated
//memory then the leak detector will also trip later
s.clear();
mem.Reset(140);
mem.SetTripOnAlloc();
thrown = false;
for( int i = 0; i < 70; i++ ){
s.insert( i );
}
//now reset the allocator so it trips at a lower threshold
//and test the copy mechanism works right
mem.Reset( 50 );
mem.SetTripOnAlloc();
try{
set_t s2( s );
}catch( std::bad_alloc ){
if( mem.GetNumConstructs() != 50 ) FAIL
if( mem.GetNumAllocs() != 51 ) FAIL
if( mem.GetNumDestroys() != 50 ) FAIL
if( mem.GetNumDeallocs() != 50 ) FAIL
if( INSANE( s ) || s.size() != 70 ) FAIL
thrown = true;
}
if( !thrown ) FAIL
return( true );
}
/* ------------------------------------------------------------------
* bounds_test( )
*/
bool bounds_test( )
{
typedef std::multiset<int> s_t;
s_t s;
int i, j;
for( i = 0; i < 10; i++ ){
for( j = 0; j < 10; j++ ){
s.insert( i );
}
}
s.erase( 5 );
s_t::iterator it;
if( s.lower_bound( -1 ) != s.begin() ) FAIL
if( s.lower_bound( 0 ) != s.begin() ) FAIL
it = s.lower_bound( 2 );
for( j = 0; j < 10; j++ ) if( *it++ != 2 ) FAIL
it = s.lower_bound( 4 );
for( j = 0; j < 10; j++ ) if( *it++ != 4 ) FAIL
it = s.lower_bound( 5 );
for( j = 0; j < 10; j++ ) if( *it++ != 6 ) FAIL
it = s.lower_bound( 6 );
for( j = 0; j < 10; j++ ) if( *it++ != 6 ) FAIL
it = s.lower_bound( 9 );
for( j = 0; j < 10; j++ ) if( *it++ != 9 ) FAIL
if( s.lower_bound( 10 ) != s.end() ) FAIL
if( s.upper_bound( -1 ) != s.begin() ) FAIL
it = s.upper_bound( 0 );
for( j = 0; j < 10; j++ ) if( *it++ != 1 ) FAIL
it = s.upper_bound( 2 );
for( j = 0; j < 10; j++ ) if( *--it != 2 ) FAIL
it = s.upper_bound( 4 );
for( j = 0; j < 10; j++ ) if( *--it != 4 ) FAIL
it = s.upper_bound( 5 );
for( j = 0; j < 10; j++ ) if( *it++ != 6 ) FAIL
it = s.upper_bound( 6 );
for( j = 0; j < 10; j++ ) if( *it++ != 7 ) FAIL
it = s.upper_bound( 8 );
for( j = 0; j < 10; j++ ) if( *it++ != 9 ) FAIL
if( s.upper_bound( 9 ) != s.end() ) FAIL
if( s.upper_bound( 10 ) != s.end() ) FAIL
s_t const sc( s );
s_t::const_iterator cit;
if( sc.lower_bound( -1 ) != sc.begin() ) FAIL
if( sc.lower_bound( 0 ) != sc.begin() ) FAIL
cit = sc.lower_bound( 2 );
for( j = 0; j < 10; j++ ) if( *cit++ != 2 ) FAIL
cit = sc.lower_bound( 4 );
for( j = 0; j < 10; j++ ) if( *cit++ != 4 ) FAIL
cit = sc.lower_bound( 5 );
for( j = 0; j < 10; j++ ) if( *cit++ != 6 ) FAIL
cit = sc.lower_bound( 6 );
for( j = 0; j < 10; j++ ) if( *cit++ != 6 ) FAIL
cit = sc.lower_bound( 9 );
for( j = 0; j < 10; j++ ) if( *cit++ != 9 ) FAIL
if( sc.lower_bound( 10 ) != sc.end() ) FAIL
if( sc.upper_bound( -1 ) != sc.begin() ) FAIL
cit = sc.upper_bound( 0 );
for( j = 0; j < 10; j++ ) if( *cit++ != 1 ) FAIL
cit = sc.upper_bound( 2 );
for( j = 0; j < 10; j++ ) if( *--cit != 2 ) FAIL
cit = sc.upper_bound( 4 );
for( j = 0; j < 10; j++ ) if( *--cit != 4 ) FAIL
cit = sc.upper_bound( 5 );
for( j = 0; j < 10; j++ ) if( *cit++ != 6 ) FAIL
cit = sc.upper_bound( 6 );
for( j = 0; j < 10; j++ ) if( *cit++ != 7 ) FAIL
cit = sc.upper_bound( 8 );
for( j = 0; j < 10; j++ ) if( *cit++ != 9 ) FAIL
if( sc.upper_bound( 9 ) != sc.end() ) FAIL
if( sc.upper_bound( 10 ) != sc.end() ) FAIL
//it = sc.upper_bound( 3 ); //illegal
return( true );
}
/* ------------------------------------------------------------------
* hint_ins_test( )
* insert with hints
*/
bool hint_ins_test( )
{
typedef std::multiset< int > msii_t;
typedef msii_t::iterator msiter_t;
msii_t s1;
msiter_t it;
//hint insert tests
s1.clear();
s1.insert( s1.end(), 4 );
s1.insert( s1.end(), 7 );
s1.insert( --s1.end(), 6 );
s1.insert( s1.end(), 8 );
s1.insert( s1.begin(), 2 );
s1.insert( ++s1.begin(), 3 );
s1.insert( s1.find(6), 5 );
s1.insert( s1.end(), 0 ); //invalid hint
s1.insert( s1.find(0), 1 ); //invalid hint
s1.insert( ++s1.begin(), 9 ); //invalid hint
for( int i = 0; i < 10; i++){
it = s1.find( i );
if( INSANE( s1 ) || s1.size() != 10 || s1.empty() ||
it == s1.end() || *it != i ) FAIL
}
s1.clear();
msiter_t it2;
s1.insert( s1.end(), 0 );
s1.insert( s1.end(), 0 );
it = s1.insert( s1.end(), 1 );
it2 = s1.insert( s1.find(1), 1 );
s1.insert( s1.end(), 1 );
s1.insert( s1.end(), 2 );
s1.insert( it2, 0 );
s1.insert( --s1.end(), 2 );
s1.insert( ++(++it), 2 );
it = s1.insert( s1.begin(), 4 ); //invalid hint, insert closest
s1.insert( s1.find(1), 4 ); //invalid hint, insert closest
s1.insert( it2, 4 ); //invalid hint, insert closest
s1.insert( ++s1.find(4), 3 ); //invalid hint, insert closest
s1.insert( it, 3 ); //invalid hint, insert closest
s1.insert( ++s1.find(4), 3 ); //invalid hint, insert closest
it = s1.begin();
for( int i = 0; i < 5; i++){
for( int j = 0; j < 3; j++){
if( INSANE( s1 ) || s1.size() != 15 || s1.empty() ||
it == s1.end() || *it != i ) FAIL
++it;
}
}
return( true );
}
int main( )
{
int rc = 0;
//heap_dump();
int original_count = heap_count( );
try {
if( !construct_test( ) || !heap_ok( "t1" ) ) rc = 1;
if( !access_test( ) || !heap_ok( "t2" ) ) rc = 1;
//if( !string_test( ) || !heap_ok( "t3" ) ) rc = 1;
//if( !torture_test( ) || !heap_ok( "t4" ) ) rc = 1;
//if( !clear_test( ) || !heap_ok( "t5" ) ) rc = 1;
if( !iterator_test( ) || !heap_ok( "t6" ) ) rc = 1;
if( !copy_test( ) || !heap_ok( "t7" ) ) rc = 1;
if( !allocator_test( ) || !heap_ok( "t8" ) ) rc = 1;
if( !bounds_test( ) || !heap_ok( "t9" ) ) rc = 1;
if( !hint_ins_test( ) || !heap_ok( "tA" ) ) rc = 1;
}
catch( ... ) {
std::cout << "Unexpected exception of unexpected type.\n";
rc = 1;
}
int heap_diff = heap_count( ) - original_count;
if( heap_diff ) {
heap_dump();
std::cout << "Possible memory leak! " << heap_diff << " " << original_count << "\n";
rc = 1;
}
return( rc );
}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?