forked from boostorg/smart_ptr
Compare commits
22 Commits
boost-1.61
...
boost-1.62
Author | SHA1 | Date | |
---|---|---|---|
f3279d24b4 | |||
c87b6e8af8 | |||
aaded4f85c | |||
eb1a002e34 | |||
3304a56101 | |||
181f38682f | |||
5b1a8412c3 | |||
e52905cf3c | |||
b7f99ceba6 | |||
a7ade6f062 | |||
097d2e9bf9 | |||
d44a78d671 | |||
582eb63cb3 | |||
181b449a57 | |||
da8de3e95b | |||
6c27833099 | |||
522f6c1869 | |||
cd8de9d4a6 | |||
05d5a4e9a0 | |||
970a179ac2 | |||
fd543d3292 | |||
334654de06 |
48
.travis.yml
Normal file
48
.travis.yml
Normal file
@ -0,0 +1,48 @@
|
||||
# Copyright 2016 Peter Dimov
|
||||
# Distributed under the Boost Software License, Version 1.0.
|
||||
# (See accompanying file LICENSE_1_0.txt or copy at http://boost.org/LICENSE_1_0.txt)
|
||||
|
||||
language: cpp
|
||||
|
||||
sudo: false
|
||||
|
||||
os:
|
||||
- linux
|
||||
- osx
|
||||
|
||||
branches:
|
||||
only:
|
||||
- master
|
||||
- develop
|
||||
|
||||
install:
|
||||
- git clone -b $TRAVIS_BRANCH https://github.com/boostorg/boost.git boost
|
||||
- cd boost
|
||||
- git submodule init libs/align
|
||||
- git submodule init libs/assert
|
||||
- git submodule init libs/atomic
|
||||
- git submodule init libs/config
|
||||
- git submodule init libs/core
|
||||
- git submodule init libs/detail
|
||||
- git submodule init libs/functional
|
||||
- git submodule init libs/integer
|
||||
- git submodule init libs/move
|
||||
- git submodule init libs/predef
|
||||
- git submodule init libs/preprocessor
|
||||
- git submodule init libs/smart_ptr
|
||||
- git submodule init libs/static_assert
|
||||
- git submodule init libs/throw_exception
|
||||
- git submodule init libs/type_traits
|
||||
- git submodule init tools/build
|
||||
- git submodule init tools/inspect
|
||||
- git submodule update
|
||||
- cd libs/smart_ptr
|
||||
- git checkout -q $TRAVIS_COMMIT
|
||||
- cd ../..
|
||||
- ./bootstrap.sh
|
||||
- ./b2 headers
|
||||
|
||||
script:
|
||||
- TOOLSET=gcc,clang
|
||||
- if [ $TRAVIS_OS_NAME == osx ]; then TOOLSET=clang; fi
|
||||
- ./b2 libs/smart_ptr/test toolset=$TOOLSET
|
6
README.md
Normal file
6
README.md
Normal file
@ -0,0 +1,6 @@
|
||||
# Boost.SmartPtr
|
||||
|
||||
Branch | Travis | Appveyor
|
||||
---------|--------|---------
|
||||
Develop | [](https://travis-ci.org/boostorg/smart_ptr) | [](https://ci.appveyor.com/project/pdimov/smart_ptr)
|
||||
Master | [](https://travis-ci.org/boostorg/smart_ptr) | [](https://ci.appveyor.com/project/pdimov/smart_ptr)
|
44
appveyor.yml
Normal file
44
appveyor.yml
Normal file
@ -0,0 +1,44 @@
|
||||
# Copyright 2016 Peter Dimov
|
||||
# Distributed under the Boost Software License, Version 1.0.
|
||||
# (See accompanying file LICENSE_1_0.txt or copy at http://boost.org/LICENSE_1_0.txt)
|
||||
|
||||
version: 1.0.{build}-{branch}
|
||||
|
||||
shallow_clone: true
|
||||
|
||||
branches:
|
||||
only:
|
||||
- master
|
||||
- develop
|
||||
|
||||
install:
|
||||
- git clone -b %APPVEYOR_REPO_BRANCH% https://github.com/boostorg/boost.git boost
|
||||
- cd boost
|
||||
- git submodule init libs/align
|
||||
- git submodule init libs/assert
|
||||
- git submodule init libs/atomic
|
||||
- git submodule init libs/config
|
||||
- git submodule init libs/core
|
||||
- git submodule init libs/detail
|
||||
- git submodule init libs/functional
|
||||
- git submodule init libs/integer
|
||||
- git submodule init libs/move
|
||||
- git submodule init libs/predef
|
||||
- git submodule init libs/preprocessor
|
||||
- git submodule init libs/smart_ptr
|
||||
- git submodule init libs/static_assert
|
||||
- git submodule init libs/throw_exception
|
||||
- git submodule init libs/type_traits
|
||||
- git submodule init tools/build
|
||||
- git submodule init tools/inspect
|
||||
- git submodule update
|
||||
- cd libs\smart_ptr
|
||||
- git checkout -q %APPVEYOR_REPO_COMMIT%
|
||||
- cd ..\..
|
||||
- bootstrap
|
||||
- b2 headers
|
||||
|
||||
build: off
|
||||
|
||||
test_script:
|
||||
- b2 libs/smart_ptr/test toolset=msvc-9.0,msvc-10.0,msvc-11.0,msvc-12.0
|
@ -104,7 +104,7 @@ private:
|
||||
}
|
||||
|
||||
// Note: invoked automatically by shared_ptr; do not call
|
||||
template<class X, class Y> void _internal_accept_owner( shared_ptr<X> * ppx, Y * py ) const
|
||||
template<class X, class Y> void _internal_accept_owner( shared_ptr<X> * ppx, Y * ) const
|
||||
{
|
||||
BOOST_ASSERT( ppx != 0 );
|
||||
|
||||
|
@ -59,7 +59,7 @@ public:
|
||||
|
||||
typedef T element_type;
|
||||
|
||||
intrusive_ptr() BOOST_NOEXCEPT : px( 0 )
|
||||
BOOST_CONSTEXPR intrusive_ptr() BOOST_NOEXCEPT : px( 0 )
|
||||
{
|
||||
}
|
||||
|
||||
@ -122,6 +122,30 @@ public:
|
||||
return *this;
|
||||
}
|
||||
|
||||
template<class U> friend class intrusive_ptr;
|
||||
|
||||
template<class U>
|
||||
#if !defined( BOOST_SP_NO_SP_CONVERTIBLE )
|
||||
|
||||
intrusive_ptr(intrusive_ptr<U> && rhs, typename boost::detail::sp_enable_if_convertible<U,T>::type = boost::detail::sp_empty())
|
||||
|
||||
#else
|
||||
|
||||
intrusive_ptr(intrusive_ptr<U> && rhs)
|
||||
|
||||
#endif
|
||||
: px( rhs.px )
|
||||
{
|
||||
rhs.px = 0;
|
||||
}
|
||||
|
||||
template<class U>
|
||||
intrusive_ptr & operator=(intrusive_ptr<U> && rhs) BOOST_NOEXCEPT
|
||||
{
|
||||
this_type( static_cast< intrusive_ptr<U> && >( rhs ) ).swap(*this);
|
||||
return *this;
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
intrusive_ptr & operator=(intrusive_ptr const & rhs)
|
||||
|
@ -83,7 +83,7 @@ struct thread_safe_counter
|
||||
|
||||
static unsigned int decrement(boost::detail::atomic_count& counter) BOOST_NOEXCEPT
|
||||
{
|
||||
return --counter;
|
||||
return static_cast< unsigned int >(--counter);
|
||||
}
|
||||
};
|
||||
|
||||
|
@ -642,6 +642,14 @@ public:
|
||||
return *this;
|
||||
}
|
||||
|
||||
// aliasing move
|
||||
template<class Y>
|
||||
shared_ptr( shared_ptr<Y> && r, element_type * p ) BOOST_NOEXCEPT : px( p ), pn()
|
||||
{
|
||||
pn.swap( r.pn );
|
||||
r.px = 0;
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
#if !defined( BOOST_NO_CXX11_NULLPTR )
|
||||
@ -679,7 +687,16 @@ public:
|
||||
{
|
||||
this_type( r, p ).swap( *this );
|
||||
}
|
||||
|
||||
|
||||
#if !defined( BOOST_NO_CXX11_RVALUE_REFERENCES )
|
||||
|
||||
template<class Y> void reset( shared_ptr<Y> && r, element_type * p )
|
||||
{
|
||||
this_type( static_cast< shared_ptr<Y> && >( r ), p ).swap( *this );
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
// never throws (but has a BOOST_ASSERT in it, so not marked with BOOST_NOEXCEPT)
|
||||
typename boost::detail::sp_dereference< T >::type operator* () const
|
||||
{
|
||||
|
@ -139,6 +139,8 @@ void bad()
|
||||
|
||||
template<class Y> <a href="#aliasing_constructor" >shared_ptr</a>(shared_ptr<Y> const & r, element_type * p); // never throws
|
||||
|
||||
template<class Y> <a href="#aliasing_move_constructor" >shared_ptr</a>(shared_ptr<Y> && r, element_type * p); // never throws
|
||||
|
||||
template<class Y> explicit <a href="#weak_ptr_constructor" >shared_ptr</a>(<a href="weak_ptr.htm" >weak_ptr</a><Y> const & r);
|
||||
|
||||
template<class Y> explicit <a href="#auto_ptr_constructor" >shared_ptr</a>(std::auto_ptr<Y> & r);
|
||||
@ -352,6 +354,16 @@ template<class Y> shared_ptr(shared_ptr<Y> && r); // never t
|
||||
<p><b>Postconditions:</b> <code>get() == p && use_count() == r.use_count()</code>.</p>
|
||||
<p><b>Throws:</b> nothing.</p>
|
||||
</blockquote>
|
||||
<h3 id="aliasing_move_constructor">aliasing move constructor</h3>
|
||||
<pre>template<class Y> shared_ptr(shared_ptr<Y> && r, element_type * p); // never throws</pre>
|
||||
<blockquote>
|
||||
<p>
|
||||
<b>Effects:</b> Move-constructs a <code>shared_ptr</code> from <code>r</code>, while
|
||||
storing <code>p</code> instead.
|
||||
</p>
|
||||
<p><b>Postconditions:</b> <code>get() == p</code> and <code>use_count()</code> equals the old count of <code>r</code>. <code>r</code> is <em>empty</em> and <code>r.get() == 0</code>.</p>
|
||||
<p><b>Throws:</b> nothing.</p>
|
||||
</blockquote>
|
||||
<h3 id="weak_ptr_constructor">weak_ptr constructor</h3>
|
||||
<pre>template<class Y> explicit shared_ptr(<a href="weak_ptr.htm" >weak_ptr</a><Y> const & r);</pre>
|
||||
<blockquote>
|
||||
|
@ -34,6 +34,7 @@ import testing ;
|
||||
[ run shared_ptr_alias_test.cpp ]
|
||||
[ run shared_ptr_rv_test.cpp ]
|
||||
[ run shared_ptr_move_test.cpp ]
|
||||
[ run shared_ptr_alias_move_test.cpp ]
|
||||
[ compile-fail shared_ptr_pv_fail.cpp ]
|
||||
[ run sp_unary_addr_test.cpp ]
|
||||
[ compile-fail scoped_ptr_eq_fail.cpp ]
|
||||
|
@ -143,6 +143,18 @@ int main()
|
||||
BOOST_TEST( N::base::instances == 0 );
|
||||
}
|
||||
|
||||
{
|
||||
boost::intrusive_ptr<Y> p( new Y );
|
||||
BOOST_TEST( N::base::instances == 1 );
|
||||
|
||||
boost::intrusive_ptr<X> p2( std::move( p ) );
|
||||
BOOST_TEST( N::base::instances == 1 );
|
||||
BOOST_TEST( p.get() == 0 );
|
||||
|
||||
p2.reset();
|
||||
BOOST_TEST( N::base::instances == 0 );
|
||||
}
|
||||
|
||||
{
|
||||
boost::intrusive_ptr<X> p( new X );
|
||||
BOOST_TEST( N::base::instances == 1 );
|
||||
@ -170,6 +182,33 @@ int main()
|
||||
BOOST_TEST( N::base::instances == 0 );
|
||||
}
|
||||
|
||||
{
|
||||
boost::intrusive_ptr<Y> p( new Y );
|
||||
BOOST_TEST( N::base::instances == 1 );
|
||||
|
||||
boost::intrusive_ptr<X> p2;
|
||||
p2 = std::move( p );
|
||||
BOOST_TEST( N::base::instances == 1 );
|
||||
BOOST_TEST( p.get() == 0 );
|
||||
|
||||
p2.reset();
|
||||
BOOST_TEST( N::base::instances == 0 );
|
||||
}
|
||||
|
||||
{
|
||||
boost::intrusive_ptr<Y> p( new Y );
|
||||
BOOST_TEST( N::base::instances == 1 );
|
||||
|
||||
boost::intrusive_ptr<X> p2( new X );
|
||||
BOOST_TEST( N::base::instances == 2 );
|
||||
p2 = std::move( p );
|
||||
BOOST_TEST( N::base::instances == 1 );
|
||||
BOOST_TEST( p.get() == 0 );
|
||||
|
||||
p2.reset();
|
||||
BOOST_TEST( N::base::instances == 0 );
|
||||
}
|
||||
|
||||
return boost::report_errors();
|
||||
}
|
||||
|
||||
|
255
test/shared_ptr_alias_move_test.cpp
Normal file
255
test/shared_ptr_alias_move_test.cpp
Normal file
@ -0,0 +1,255 @@
|
||||
#include <boost/config.hpp>
|
||||
|
||||
// shared_ptr_alias_move_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 <utility>
|
||||
|
||||
#if !defined( BOOST_NO_CXX11_RVALUE_REFERENCES )
|
||||
|
||||
class incomplete;
|
||||
|
||||
struct X
|
||||
{
|
||||
static long instances;
|
||||
|
||||
int v_;
|
||||
|
||||
explicit X( int v ): v_( v )
|
||||
{
|
||||
++instances;
|
||||
}
|
||||
|
||||
~X()
|
||||
{
|
||||
v_ = 0;
|
||||
--instances;
|
||||
}
|
||||
|
||||
private:
|
||||
X( X const & );
|
||||
X & operator=( X const & );
|
||||
};
|
||||
|
||||
long X::instances = 0;
|
||||
|
||||
int main()
|
||||
{
|
||||
BOOST_TEST( X::instances == 0 );
|
||||
|
||||
{
|
||||
int m = 0;
|
||||
boost::shared_ptr< int > p;
|
||||
boost::shared_ptr< int > p2( std::move( p ), &m );
|
||||
|
||||
BOOST_TEST( p2.get() == &m );
|
||||
BOOST_TEST( p2? true: false );
|
||||
BOOST_TEST( !!p2 );
|
||||
BOOST_TEST( p2.use_count() == 0 );
|
||||
|
||||
BOOST_TEST( p.get() == 0 );
|
||||
BOOST_TEST( p.use_count() == 0 );
|
||||
|
||||
p2.reset( std::move( p ), 0 );
|
||||
|
||||
BOOST_TEST( p2.get() == 0 );
|
||||
BOOST_TEST( p2? false: true );
|
||||
BOOST_TEST( !p2 );
|
||||
BOOST_TEST( p2.use_count() == 0 );
|
||||
|
||||
BOOST_TEST( p.get() == 0 );
|
||||
BOOST_TEST( p.use_count() == 0 );
|
||||
}
|
||||
|
||||
{
|
||||
int m = 0;
|
||||
boost::shared_ptr< int > p( new int );
|
||||
boost::shared_ptr< int const > p2( std::move( p ), &m );
|
||||
|
||||
BOOST_TEST( p2.get() == &m );
|
||||
BOOST_TEST( p2? true: false );
|
||||
BOOST_TEST( !!p2 );
|
||||
BOOST_TEST( p2.use_count() == 1 );
|
||||
|
||||
BOOST_TEST( p.get() == 0 );
|
||||
BOOST_TEST( p.use_count() == 0 );
|
||||
|
||||
boost::shared_ptr< int volatile > p3;
|
||||
p2.reset( std::move( p3 ), 0 );
|
||||
|
||||
BOOST_TEST( p2.get() == 0 );
|
||||
BOOST_TEST( p2? false: true );
|
||||
BOOST_TEST( !p2 );
|
||||
BOOST_TEST( p2.use_count() == 0 );
|
||||
|
||||
BOOST_TEST( p3.get() == 0 );
|
||||
BOOST_TEST( p3.use_count() == 0 );
|
||||
|
||||
boost::shared_ptr< int const volatile > p4( new int );
|
||||
p2.reset( std::move( p4 ), &m );
|
||||
|
||||
BOOST_TEST( p2.get() == &m );
|
||||
BOOST_TEST( p2.use_count() == 1 );
|
||||
|
||||
BOOST_TEST( p4.get() == 0 );
|
||||
BOOST_TEST( p4.use_count() == 0 );
|
||||
}
|
||||
|
||||
{
|
||||
boost::shared_ptr< int > p( new int );
|
||||
boost::shared_ptr< void const > p2( std::move( p ), 0 );
|
||||
|
||||
BOOST_TEST( p2.get() == 0 );
|
||||
BOOST_TEST( p2? false: true );
|
||||
BOOST_TEST( !p2 );
|
||||
BOOST_TEST( p2.use_count() == 1 );
|
||||
|
||||
BOOST_TEST( p.get() == 0 );
|
||||
BOOST_TEST( p.use_count() == 0 );
|
||||
|
||||
int m = 0;
|
||||
boost::shared_ptr< void volatile > p3;
|
||||
|
||||
p2.reset( std::move( p3 ), &m );
|
||||
|
||||
BOOST_TEST( p2.get() == &m );
|
||||
BOOST_TEST( p2? true: false );
|
||||
BOOST_TEST( !!p2 );
|
||||
BOOST_TEST( p2.use_count() == 0 );
|
||||
|
||||
BOOST_TEST( p3.get() == 0 );
|
||||
BOOST_TEST( p3.use_count() == 0 );
|
||||
|
||||
boost::shared_ptr< void const volatile > p4( new int );
|
||||
p2.reset( std::move( p4 ), 0 );
|
||||
|
||||
BOOST_TEST( p2.get() == 0 );
|
||||
BOOST_TEST( p2.use_count() == 1 );
|
||||
|
||||
BOOST_TEST( p4.get() == 0 );
|
||||
BOOST_TEST( p4.use_count() == 0 );
|
||||
}
|
||||
|
||||
{
|
||||
boost::shared_ptr< incomplete > p;
|
||||
boost::shared_ptr< incomplete > p2( std::move( p ), 0 );
|
||||
|
||||
BOOST_TEST( p2.get() == 0 );
|
||||
BOOST_TEST( p2? false: true );
|
||||
BOOST_TEST( !p2 );
|
||||
BOOST_TEST( p2.use_count() == 0 );
|
||||
|
||||
BOOST_TEST( p.get() == 0 );
|
||||
BOOST_TEST( p.use_count() == 0 );
|
||||
|
||||
p2.reset( std::move( p ), 0 );
|
||||
|
||||
BOOST_TEST( p2.get() == 0 );
|
||||
BOOST_TEST( p2? false: true );
|
||||
BOOST_TEST( !p2 );
|
||||
BOOST_TEST( p2.use_count() == 0 );
|
||||
|
||||
BOOST_TEST( p.get() == 0 );
|
||||
BOOST_TEST( p.use_count() == 0 );
|
||||
}
|
||||
|
||||
{
|
||||
boost::shared_ptr< X > p( new X( 5 ) ), q( p );
|
||||
boost::shared_ptr< int const > p2( std::move( q ), &q->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 ) );
|
||||
|
||||
BOOST_TEST( q.get() == 0 );
|
||||
BOOST_TEST( q.use_count() == 0 );
|
||||
|
||||
p.reset();
|
||||
BOOST_TEST( *p2 == 5 );
|
||||
|
||||
boost::shared_ptr< X const > p3( new X( 8 ) ), q3( p3 );
|
||||
p2.reset( std::move( q3 ), &q3->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 ) );
|
||||
|
||||
BOOST_TEST( q3.get() == 0 );
|
||||
BOOST_TEST( q3.use_count() == 0 );
|
||||
|
||||
p3.reset();
|
||||
BOOST_TEST( *p2 == 8 );
|
||||
}
|
||||
|
||||
{
|
||||
boost::shared_ptr< X > p( new X( 5 ) );
|
||||
BOOST_TEST( X::instances == 1 );
|
||||
BOOST_TEST( p.unique() );
|
||||
BOOST_TEST( p->v_ == 5 );
|
||||
|
||||
boost::shared_ptr< X > p2( std::move( p ), p.get() );
|
||||
BOOST_TEST( X::instances == 1 );
|
||||
BOOST_TEST( p.get() == 0 );
|
||||
BOOST_TEST( p2.unique() );
|
||||
BOOST_TEST( p2->v_ == 5 );
|
||||
|
||||
boost::shared_ptr< int const > p3( std::move( p2 ), &p2->v_ );
|
||||
BOOST_TEST( X::instances == 1 );
|
||||
BOOST_TEST( p2.get() == 0 );
|
||||
BOOST_TEST( p3.unique() );
|
||||
BOOST_TEST( *p3 == 5 );
|
||||
|
||||
p3.reset();
|
||||
BOOST_TEST( X::instances == 0 );
|
||||
}
|
||||
|
||||
{
|
||||
boost::shared_ptr< X > p( new X( 5 ) );
|
||||
BOOST_TEST( X::instances == 1 );
|
||||
BOOST_TEST( p.unique() );
|
||||
BOOST_TEST( p->v_ == 5 );
|
||||
|
||||
{
|
||||
boost::shared_ptr< X > p2(p);
|
||||
BOOST_TEST( X::instances == 1 );
|
||||
BOOST_TEST( p.get() == p2.get() );
|
||||
BOOST_TEST( p.use_count() == 2 );
|
||||
BOOST_TEST( p2.use_count() == 2 );
|
||||
|
||||
boost::shared_ptr< int const > p3( std::move( p2 ), &p2->v_ );
|
||||
BOOST_TEST( X::instances == 1 );
|
||||
BOOST_TEST( p.use_count() == 2 );
|
||||
BOOST_TEST( p2.use_count() == 0 );
|
||||
BOOST_TEST( p2.get() == 0 );
|
||||
BOOST_TEST( p3.use_count() == 2 );
|
||||
BOOST_TEST( p3.get() == &p->v_ );
|
||||
}
|
||||
|
||||
BOOST_TEST( X::instances == 1 );
|
||||
BOOST_TEST( p.unique() );
|
||||
BOOST_TEST( p->v_ == 5 );
|
||||
}
|
||||
|
||||
return boost::report_errors();
|
||||
}
|
||||
|
||||
#else // defined( BOOST_NO_CXX11_RVALUE_REFERENCES )
|
||||
|
||||
int main()
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
#endif
|
Reference in New Issue
Block a user