forked from boostorg/smart_ptr
Aliasing support
[SVN r37405]
This commit is contained in:
@ -327,6 +327,11 @@ public:
|
||||
this_type( p, d, a ).swap( *this );
|
||||
}
|
||||
|
||||
template<class Y> void reset( shared_ptr<Y> const & r, T * p )
|
||||
{
|
||||
this_type( r, p ).swap( *this );
|
||||
}
|
||||
|
||||
reference operator* () const // never throws
|
||||
{
|
||||
BOOST_ASSERT(px != 0);
|
||||
|
@ -111,6 +111,7 @@ void bad()
|
||||
|
||||
<A href="#constructors" >shared_ptr</A>(shared_ptr const & r); // never throws
|
||||
template<class Y> <A href="#constructors" >shared_ptr</A>(shared_ptr<Y> const & r); // never throws
|
||||
template<class Y> <A href="#constructors" >shared_ptr</A>(shared_ptr<Y> const & r, T * p); // never throws
|
||||
template<class Y> explicit <A href="#constructors" >shared_ptr</A>(<A href="weak_ptr.htm" >weak_ptr</A><Y> const & r);
|
||||
template<class Y> explicit <A href="#constructors" >shared_ptr</A>(std::auto_ptr<Y> & r);
|
||||
|
||||
@ -122,6 +123,7 @@ void bad()
|
||||
template<class Y> void <A href="#reset" >reset</A>(Y * p);
|
||||
template<class Y, class D> void <A href="#reset" >reset</A>(Y * p, D d);
|
||||
template<class Y, class D, class A> void <A href="#reset" >reset</A>(Y * p, D d, A a);
|
||||
template<class Y> void <A href="#reset" >reset</A>(shared_ptr<Y> const & r, T * p); // never throws
|
||||
|
||||
T & <A href="#indirection" >operator*</A>() const; // never throws
|
||||
T * <A href="#indirection" >operator-></A>() const; // never throws
|
||||
@ -253,6 +255,13 @@ template<class Y> shared_ptr(shared_ptr<Y> const & r); // never
|
||||
r.use_count()</code>.</p>
|
||||
<p><b>Throws:</b> nothing.</p>
|
||||
</blockquote>
|
||||
<pre>template<class Y> shared_ptr(shared_ptr<Y> const & r, T * p); // never throws</pre>
|
||||
<blockquote>
|
||||
<p><b>Effects:</b> constructs a <b>shared_ptr</b> that <EM>shares ownership</EM> with
|
||||
<b>r</b> and stores <b>p</b>.</p>
|
||||
<p><b>Postconditions:</b> <code>get() == p && use_count() == r.use_count()</code>.</p>
|
||||
<p><b>Throws:</b> nothing.</p>
|
||||
</blockquote>
|
||||
<pre>template<class Y> explicit shared_ptr(<A href="weak_ptr.htm" >weak_ptr</A><Y> const & r);</pre>
|
||||
<blockquote>
|
||||
<p><b>Effects:</b> Constructs a <b>shared_ptr</b> that <EM>shares ownership</EM> with
|
||||
@ -328,6 +337,10 @@ q = p;
|
||||
<BLOCKQUOTE>
|
||||
<P><B>Effects:</B> Equivalent to <code>shared_ptr(p, d, a).swap(*this)</code>.</P>
|
||||
</BLOCKQUOTE>
|
||||
<pre>template<class Y> void reset(shared_ptr<Y> const & r, T * p); // never throws</pre>
|
||||
<BLOCKQUOTE>
|
||||
<P><B>Effects:</B> Equivalent to <code>shared_ptr(r, p).swap(*this)</code>.</P>
|
||||
</BLOCKQUOTE>
|
||||
<h3><a name="indirection">indirection</a></h3>
|
||||
<pre>T & operator*() const; // never throws</pre>
|
||||
<blockquote>
|
||||
|
@ -33,6 +33,7 @@ DEPENDS all : smart_ptr ;
|
||||
[ run pointer_cast_test.cpp ]
|
||||
[ compile pointer_to_other_test.cpp ]
|
||||
[ run auto_ptr_rv_test.cpp ]
|
||||
[ run shared_ptr_alias_test.cpp ]
|
||||
;
|
||||
|
||||
# this one is too slow to run unless explicitly requested, and ALL
|
||||
|
@ -28,5 +28,6 @@ import testing ;
|
||||
[ run pointer_cast_test.cpp ]
|
||||
[ compile pointer_to_other_test.cpp ]
|
||||
[ run auto_ptr_rv_test.cpp ]
|
||||
[ run shared_ptr_alias_test.cpp ]
|
||||
;
|
||||
}
|
||||
|
146
test/shared_ptr_alias_test.cpp
Normal file
146
test/shared_ptr_alias_test.cpp
Normal file
@ -0,0 +1,146 @@
|
||||
#include <boost/config.hpp>
|
||||
|
||||
// shared_ptr_alias_test.cpp
|
||||
//
|
||||
// Copyright (c) 2007 Peter Dimov
|
||||
//
|
||||
// Distributed under the Boost Software License, Version 1.0. (See
|
||||
// accompanying file LICENSE_1_0.txt or copy at
|
||||
// http://www.boost.org/LICENSE_1_0.txt)
|
||||
|
||||
|
||||
#include <boost/detail/lightweight_test.hpp>
|
||||
#include <boost/shared_ptr.hpp>
|
||||
#include <memory>
|
||||
#include <cstddef>
|
||||
|
||||
//
|
||||
|
||||
class incomplete;
|
||||
|
||||
struct X
|
||||
{
|
||||
int v_;
|
||||
|
||||
explicit X( int v ): v_( v )
|
||||
{
|
||||
}
|
||||
|
||||
~X()
|
||||
{
|
||||
v_ = 0;
|
||||
}
|
||||
};
|
||||
|
||||
int main()
|
||||
{
|
||||
{
|
||||
int m = 0;
|
||||
boost::shared_ptr< int > p;
|
||||
boost::shared_ptr< int > p2( p, &m );
|
||||
|
||||
BOOST_TEST( p2.get() == &m );
|
||||
BOOST_TEST( p2? true: false );
|
||||
BOOST_TEST( !!p2 );
|
||||
BOOST_TEST( p2.use_count() == p.use_count() );
|
||||
BOOST_TEST( !( p < p2 ) && !( p2 < p ) );
|
||||
|
||||
p2.reset( p, 0 );
|
||||
|
||||
BOOST_TEST( p2.get() == 0 );
|
||||
BOOST_TEST( p2? false: true );
|
||||
BOOST_TEST( !p2 );
|
||||
BOOST_TEST( p2.use_count() == p.use_count() );
|
||||
BOOST_TEST( !( p < p2 ) && !( p2 < p ) );
|
||||
}
|
||||
|
||||
{
|
||||
int m = 0;
|
||||
boost::shared_ptr< int > p( new int );
|
||||
boost::shared_ptr< int const > p2( p, &m );
|
||||
|
||||
BOOST_TEST( p2.get() == &m );
|
||||
BOOST_TEST( p2? true: false );
|
||||
BOOST_TEST( !!p2 );
|
||||
BOOST_TEST( p2.use_count() == p.use_count() );
|
||||
BOOST_TEST( !( p < p2 ) && !( p2 < p ) );
|
||||
|
||||
boost::shared_ptr< int volatile > p3;
|
||||
p2.reset( p3, 0 );
|
||||
|
||||
BOOST_TEST( p2.get() == 0 );
|
||||
BOOST_TEST( p2? false: true );
|
||||
BOOST_TEST( !p2 );
|
||||
BOOST_TEST( p2.use_count() == p3.use_count() );
|
||||
BOOST_TEST( !( p3 < p2 ) && !( p2 < p3 ) );
|
||||
}
|
||||
|
||||
{
|
||||
boost::shared_ptr< int > p( new int );
|
||||
boost::shared_ptr< void const > p2( p, 0 );
|
||||
|
||||
BOOST_TEST( p2.get() == 0 );
|
||||
BOOST_TEST( p2? false: true );
|
||||
BOOST_TEST( !p2 );
|
||||
BOOST_TEST( p2.use_count() == p.use_count() );
|
||||
BOOST_TEST( !( p < p2 ) && !( p2 < p ) );
|
||||
|
||||
int m = 0;
|
||||
boost::shared_ptr< void volatile > p3;
|
||||
|
||||
p2.reset( p3, &m );
|
||||
|
||||
BOOST_TEST( p2.get() == &m );
|
||||
BOOST_TEST( p2? true: false );
|
||||
BOOST_TEST( !!p2 );
|
||||
BOOST_TEST( p2.use_count() == p3.use_count() );
|
||||
BOOST_TEST( !( p3 < p2 ) && !( p2 < p3 ) );
|
||||
}
|
||||
|
||||
{
|
||||
boost::shared_ptr< incomplete > p;
|
||||
boost::shared_ptr< incomplete > p2( p, 0 );
|
||||
|
||||
BOOST_TEST( p2.get() == 0 );
|
||||
BOOST_TEST( p2? false: true );
|
||||
BOOST_TEST( !p2 );
|
||||
BOOST_TEST( p2.use_count() == p.use_count() );
|
||||
BOOST_TEST( !( p < p2 ) && !( p2 < p ) );
|
||||
|
||||
p2.reset( p, 0 );
|
||||
|
||||
BOOST_TEST( p2.get() == 0 );
|
||||
BOOST_TEST( p2? false: true );
|
||||
BOOST_TEST( !p2 );
|
||||
BOOST_TEST( p2.use_count() == p.use_count() );
|
||||
BOOST_TEST( !( p < p2 ) && !( p2 < p ) );
|
||||
}
|
||||
|
||||
{
|
||||
boost::shared_ptr< X > p( new X( 5 ) );
|
||||
boost::shared_ptr< int const > p2( p, &p->v_ );
|
||||
|
||||
BOOST_TEST( p2.get() == &p->v_ );
|
||||
BOOST_TEST( p2? true: false );
|
||||
BOOST_TEST( !!p2 );
|
||||
BOOST_TEST( p2.use_count() == p.use_count() );
|
||||
BOOST_TEST( !( p < p2 ) && !( p2 < p ) );
|
||||
|
||||
p.reset();
|
||||
BOOST_TEST( *p2 == 5 );
|
||||
|
||||
boost::shared_ptr< X const > p3( new X( 8 ) );
|
||||
p2.reset( p3, &p3->v_ );
|
||||
|
||||
BOOST_TEST( p2.get() == &p3->v_ );
|
||||
BOOST_TEST( p2? true: false );
|
||||
BOOST_TEST( !!p2 );
|
||||
BOOST_TEST( p2.use_count() == p3.use_count() );
|
||||
BOOST_TEST( !( p3 < p2 ) && !( p2 < p3 ) );
|
||||
|
||||
p3.reset();
|
||||
BOOST_TEST( *p2 == 8 );
|
||||
}
|
||||
|
||||
return boost::report_errors();
|
||||
}
|
Reference in New Issue
Block a user