Fix C++0x ambiguity between boost::shared_ptr and std::shared_ptr

[SVN r37374]
This commit is contained in:
Peter Dimov
2007-04-06 00:23:17 +00:00
parent 97118668e2
commit 469578e976

View File

@ -51,12 +51,6 @@ Incomplete * get_ptr( boost::shared_ptr<Incomplete>& incomplete )
return incomplete.get(); return incomplete.get();
} }
using namespace std;
using boost::scoped_ptr;
using boost::scoped_array;
using boost::shared_ptr;
using boost::shared_array;
template<class T> template<class T>
void ck( const T* v1, T v2 ) { BOOST_TEST( *v1 == v2 ); } void ck( const T* v1, T v2 ) { BOOST_TEST( *v1 == v2 ); }
@ -72,7 +66,7 @@ class UDT {
explicit UDT( long value=0 ) : value_(value) { ++UDT_use_count; } explicit UDT( long value=0 ) : value_(value) { ++UDT_use_count; }
~UDT() { ~UDT() {
--UDT_use_count; --UDT_use_count;
cout << "UDT with value " << value_ << " being destroyed\n"; std::cout << "UDT with value " << value_ << " being destroyed\n";
} }
long value() const { return value_; } long value() const { return value_; }
void value( long v ) { value_ = v;; } void value( long v ) { value_ = v;; }
@ -86,16 +80,16 @@ class UDT {
class Incomplete; class Incomplete;
Incomplete * check_incomplete( scoped_ptr<Incomplete>& incomplete ) Incomplete * check_incomplete( boost::scoped_ptr<Incomplete>& incomplete )
{ {
return incomplete.get(); return incomplete.get();
} }
Incomplete * check_incomplete( shared_ptr<Incomplete>& incomplete, Incomplete * check_incomplete( boost::shared_ptr<Incomplete>& incomplete,
shared_ptr<Incomplete>& i2 ) boost::shared_ptr<Incomplete>& i2 )
{ {
incomplete.swap(i2); incomplete.swap(i2);
cout << incomplete.use_count() << ' ' << incomplete.unique() << '\n'; std::cout << incomplete.use_count() << ' ' << incomplete.unique() << '\n';
return incomplete.get(); return incomplete.get();
} }
@ -107,7 +101,7 @@ void test()
// test scoped_ptr with a built-in type // test scoped_ptr with a built-in type
long * lp = new long; long * lp = new long;
scoped_ptr<long> sp ( lp ); boost::scoped_ptr<long> sp ( lp );
BOOST_TEST( sp.get() == lp ); BOOST_TEST( sp.get() == lp );
BOOST_TEST( lp == sp.get() ); BOOST_TEST( lp == sp.get() );
BOOST_TEST( &*sp == lp ); BOOST_TEST( &*sp == lp );
@ -122,7 +116,7 @@ void test()
BOOST_TEST( sp.get() == 0 ); BOOST_TEST( sp.get() == 0 );
// test scoped_ptr with a user defined type // test scoped_ptr with a user defined type
scoped_ptr<UDT> udt_sp ( new UDT( 999888777 ) ); boost::scoped_ptr<UDT> udt_sp ( new UDT( 999888777 ) );
BOOST_TEST( udt_sp->value() == 999888777 ); BOOST_TEST( udt_sp->value() == 999888777 );
udt_sp.reset(); udt_sp.reset();
udt_sp.reset( new UDT( 111222333 ) ); udt_sp.reset( new UDT( 111222333 ) );
@ -132,7 +126,7 @@ void test()
// test scoped_array with a build-in type // test scoped_array with a build-in type
char * sap = new char [ 100 ]; char * sap = new char [ 100 ];
scoped_array<char> sa ( sap ); boost::scoped_array<char> sa ( sap );
BOOST_TEST( sa.get() == sap ); BOOST_TEST( sa.get() == sap );
BOOST_TEST( sap == sa.get() ); BOOST_TEST( sap == sa.get() );
@ -152,7 +146,7 @@ void test()
// test shared_ptr with a built-in type // test shared_ptr with a built-in type
int * ip = new int; int * ip = new int;
shared_ptr<int> cp ( ip ); boost::shared_ptr<int> cp ( ip );
BOOST_TEST( ip == cp.get() ); BOOST_TEST( ip == cp.get() );
BOOST_TEST( cp.use_count() == 1 ); BOOST_TEST( cp.use_count() == 1 );
@ -162,7 +156,7 @@ void test()
ck( static_cast<int*>(cp.get()), 54321 ); ck( static_cast<int*>(cp.get()), 54321 );
ck( static_cast<int*>(ip), *cp ); ck( static_cast<int*>(ip), *cp );
shared_ptr<int> cp2 ( cp ); boost::shared_ptr<int> cp2 ( cp );
BOOST_TEST( ip == cp2.get() ); BOOST_TEST( ip == cp2.get() );
BOOST_TEST( cp.use_count() == 2 ); BOOST_TEST( cp.use_count() == 2 );
BOOST_TEST( cp2.use_count() == 2 ); BOOST_TEST( cp2.use_count() == 2 );
@ -172,7 +166,7 @@ void test()
ck( static_cast<int*>(cp2.get()), 54321 ); ck( static_cast<int*>(cp2.get()), 54321 );
ck( static_cast<int*>(ip), *cp2 ); ck( static_cast<int*>(ip), *cp2 );
shared_ptr<int> cp3 ( cp ); boost::shared_ptr<int> cp3 ( cp );
BOOST_TEST( cp.use_count() == 3 ); BOOST_TEST( cp.use_count() == 3 );
BOOST_TEST( cp2.use_count() == 3 ); BOOST_TEST( cp2.use_count() == 3 );
BOOST_TEST( cp3.use_count() == 3 ); BOOST_TEST( cp3.use_count() == 3 );
@ -202,20 +196,20 @@ void test()
BOOST_TEST( cp.use_count() == 3 ); BOOST_TEST( cp.use_count() == 3 );
BOOST_TEST( *cp == 87654 ); BOOST_TEST( *cp == 87654 );
shared_ptr<int> cp4; boost::shared_ptr<int> cp4;
swap( cp2, cp4 ); swap( cp2, cp4 );
BOOST_TEST( cp4.use_count() == 3 ); BOOST_TEST( cp4.use_count() == 3 );
BOOST_TEST( *cp4 == 87654 ); BOOST_TEST( *cp4 == 87654 );
BOOST_TEST( cp2.get() == 0 ); BOOST_TEST( cp2.get() == 0 );
set< shared_ptr<int> > scp; std::set< boost::shared_ptr<int> > scp;
scp.insert(cp4); scp.insert(cp4);
BOOST_TEST( scp.find(cp4) != scp.end() ); BOOST_TEST( scp.find(cp4) != scp.end() );
BOOST_TEST( scp.find(cp4) == scp.find( shared_ptr<int>(cp4) ) ); BOOST_TEST( scp.find(cp4) == scp.find( boost::shared_ptr<int>(cp4) ) );
// test shared_array with a built-in type // test shared_array with a built-in type
char * cap = new char [ 100 ]; char * cap = new char [ 100 ];
shared_array<char> ca ( cap ); boost::shared_array<char> ca ( cap );
BOOST_TEST( ca.get() == cap ); BOOST_TEST( ca.get() == cap );
BOOST_TEST( cap == ca.get() ); BOOST_TEST( cap == ca.get() );
BOOST_TEST( &ca[0] == cap ); BOOST_TEST( &ca[0] == cap );
@ -227,8 +221,8 @@ void test()
BOOST_TEST( ca[0] == 'H' ); BOOST_TEST( ca[0] == 'H' );
BOOST_TEST( ca[30] == 'h' ); BOOST_TEST( ca[30] == 'h' );
shared_array<char> ca2 ( ca ); boost::shared_array<char> ca2 ( ca );
shared_array<char> ca3 ( ca2 ); boost::shared_array<char> ca3 ( ca2 );
ca[0] = 'N'; ca[0] = 'N';
ca[4] = 'd'; ca[4] = 'd';
@ -246,24 +240,24 @@ void test()
ca.reset(); ca.reset();
BOOST_TEST( ca.get() == 0 ); BOOST_TEST( ca.get() == 0 );
shared_array<char> ca4; boost::shared_array<char> ca4;
swap( ca3, ca4 ); swap( ca3, ca4 );
BOOST_TEST( ca4.use_count() == 1 ); BOOST_TEST( ca4.use_count() == 1 );
BOOST_TEST( strcmp( ca4.get(), "Not dog with mustard and relish" ) == 0 ); BOOST_TEST( strcmp( ca4.get(), "Not dog with mustard and relish" ) == 0 );
BOOST_TEST( ca3.get() == 0 ); BOOST_TEST( ca3.get() == 0 );
set< shared_array<char> > sca; std::set< boost::shared_array<char> > sca;
sca.insert(ca4); sca.insert(ca4);
BOOST_TEST( sca.find(ca4) != sca.end() ); BOOST_TEST( sca.find(ca4) != sca.end() );
BOOST_TEST( sca.find(ca4) == sca.find( shared_array<char>(ca4) ) ); BOOST_TEST( sca.find(ca4) == sca.find( boost::shared_array<char>(ca4) ) );
// test shared_array with user defined type // test shared_array with user defined type
shared_array<UDT> udta ( new UDT[3] ); boost::shared_array<UDT> udta ( new UDT[3] );
udta[0].value( 111 ); udta[0].value( 111 );
udta[1].value( 222 ); udta[1].value( 222 );
udta[2].value( 333 ); udta[2].value( 333 );
shared_array<UDT> udta2 ( udta ); boost::shared_array<UDT> udta2 ( udta );
BOOST_TEST( udta[0].value() == 111 ); BOOST_TEST( udta[0].value() == 111 );
BOOST_TEST( udta[1].value() == 222 ); BOOST_TEST( udta[1].value() == 222 );
@ -280,7 +274,7 @@ void test()
// test shared_ptr with a user defined type // test shared_ptr with a user defined type
UDT * up = new UDT; UDT * up = new UDT;
shared_ptr<UDT> sup ( up ); boost::shared_ptr<UDT> sup ( up );
BOOST_TEST( up == sup.get() ); BOOST_TEST( up == sup.get() );
BOOST_TEST( sup.use_count() == 1 ); BOOST_TEST( sup.use_count() == 1 );
@ -288,7 +282,7 @@ void test()
BOOST_TEST( sup->value() == 54321 ); BOOST_TEST( sup->value() == 54321 );
BOOST_TEST( up->value() == 54321 ); BOOST_TEST( up->value() == 54321 );
shared_ptr<UDT> sup2; boost::shared_ptr<UDT> sup2;
sup2 = sup; sup2 = sup;
BOOST_TEST( sup2->value() == 54321 ); BOOST_TEST( sup2->value() == 54321 );
BOOST_TEST( sup.use_count() == 2 ); BOOST_TEST( sup.use_count() == 2 );
@ -298,7 +292,7 @@ void test()
BOOST_TEST( sup.use_count() == 2 ); BOOST_TEST( sup.use_count() == 2 );
BOOST_TEST( sup2.use_count() == 2 ); BOOST_TEST( sup2.use_count() == 2 );
cout << "OK\n"; std::cout << "OK\n";
new char[12345]; // deliberate memory leak to verify leaks detected new char[12345]; // deliberate memory leak to verify leaks detected
} }