Merge [51909], [51912], [52937], [53672] to release.

[SVN r55479]
This commit is contained in:
Peter Dimov
2009-08-08 23:21:15 +00:00
parent 8a421c2098
commit 63b17c24ea
11 changed files with 710 additions and 13 deletions
+50 -2
View File
@@ -70,11 +70,43 @@ public:
weak_ptr( weak_ptr<Y> const & r )
#endif
: pn(r.pn) // never throws
: px(r.lock().get()), pn(r.pn) // never throws
{
px = r.lock().get();
}
#if defined( BOOST_HAS_RVALUE_REFS )
template<class Y>
#if !defined( BOOST_SP_NO_SP_CONVERTIBLE )
weak_ptr( weak_ptr<Y> && r, typename detail::sp_enable_if_convertible<Y,T>::type = detail::sp_empty() )
#else
weak_ptr( weak_ptr<Y> && r )
#endif
: px(r.lock().get()), pn(std::move(r.pn)) // never throws
{
r.px = 0;
}
// for better efficiency in the T == Y case
weak_ptr( weak_ptr && r ): px( r.px ), pn(std::move(r.pn)) // never throws
{
r.px = 0;
}
// for better efficiency in the T == Y case
weak_ptr & operator=( weak_ptr && r ) // never throws
{
this_type( std::move( r ) ).swap( *this );
return *this;
}
#endif
template<class Y>
#if !defined( BOOST_SP_NO_SP_CONVERTIBLE )
@@ -99,6 +131,17 @@ public:
return *this;
}
#if defined( BOOST_HAS_RVALUE_REFS )
template<class Y>
weak_ptr & operator=(weak_ptr<Y> && r)
{
this_type( std::move( r ) ).swap( *this );
return *this;
}
#endif
template<class Y>
weak_ptr & operator=(shared_ptr<Y> const & r) // never throws
{
@@ -124,6 +167,11 @@ public:
return pn.use_count() == 0;
}
bool _empty() const // extension, not in std::weak_ptr
{
return pn.empty();
}
void reset() // never throws in 1.30+
{
this_type().swap(*this);