diff --git a/include/boost/smart_ptr/atomic_shared_ptr.hpp b/include/boost/smart_ptr/atomic_shared_ptr.hpp index d1efa8e..7c48507 100644 --- a/include/boost/smart_ptr/atomic_shared_ptr.hpp +++ b/include/boost/smart_ptr/atomic_shared_ptr.hpp @@ -97,7 +97,13 @@ public: return false; } - shared_ptr load( int = 0 ) const BOOST_SP_NOEXCEPT + shared_ptr load() const BOOST_SP_NOEXCEPT + { + boost::detail::spinlock::scoped_lock lock( l_ ); + return p_; + } + + template shared_ptr load( M ) const BOOST_SP_NOEXCEPT { boost::detail::spinlock::scoped_lock lock( l_ ); return p_; @@ -109,13 +115,19 @@ public: return p_; } - void store( shared_ptr r, int = 0 ) BOOST_SP_NOEXCEPT + void store( shared_ptr r ) BOOST_SP_NOEXCEPT { boost::detail::spinlock::scoped_lock lock( l_ ); p_.swap( r ); } - shared_ptr exchange( shared_ptr r, int = 0 ) BOOST_SP_NOEXCEPT + template void store( shared_ptr r, M ) BOOST_SP_NOEXCEPT + { + boost::detail::spinlock::scoped_lock lock( l_ ); + p_.swap( r ); + } + + shared_ptr exchange( shared_ptr r ) BOOST_SP_NOEXCEPT { { boost::detail::spinlock::scoped_lock lock( l_ ); @@ -133,44 +145,82 @@ public: #endif } - bool compare_exchange_weak( shared_ptr& v, const shared_ptr& w, int, int ) BOOST_SP_NOEXCEPT + template shared_ptr exchange( shared_ptr r, M ) BOOST_SP_NOEXCEPT + { + { + boost::detail::spinlock::scoped_lock lock( l_ ); + p_.swap( r ); + } + +#if !defined( BOOST_NO_CXX11_RVALUE_REFERENCES ) + + return std::move( r ); + +#else + + return r; + +#endif + } + + template bool compare_exchange_weak( shared_ptr& v, const shared_ptr& w, M, M ) BOOST_SP_NOEXCEPT { return compare_exchange( v, w ); } - bool compare_exchange_weak( shared_ptr& v, const shared_ptr& w, int = 0 ) BOOST_SP_NOEXCEPT + template bool compare_exchange_weak( shared_ptr& v, const shared_ptr& w, M ) BOOST_SP_NOEXCEPT { return compare_exchange( v, w ); } - bool compare_exchange_strong( shared_ptr& v, const shared_ptr& w, int, int ) BOOST_SP_NOEXCEPT + bool compare_exchange_weak( shared_ptr& v, const shared_ptr& w ) BOOST_SP_NOEXCEPT { return compare_exchange( v, w ); } - bool compare_exchange_strong( shared_ptr& v, const shared_ptr& w, int = 0 ) BOOST_SP_NOEXCEPT + template bool compare_exchange_strong( shared_ptr& v, const shared_ptr& w, M, M ) BOOST_SP_NOEXCEPT + { + return compare_exchange( v, w ); + } + + template bool compare_exchange_strong( shared_ptr& v, const shared_ptr& w, M ) BOOST_SP_NOEXCEPT + { + return compare_exchange( v, w ); + } + + bool compare_exchange_strong( shared_ptr& v, const shared_ptr& w ) BOOST_SP_NOEXCEPT { return compare_exchange( v, w ); } #if !defined( BOOST_NO_CXX11_RVALUE_REFERENCES ) - bool compare_exchange_weak( shared_ptr& v, shared_ptr&& w, int, int ) BOOST_SP_NOEXCEPT + template bool compare_exchange_weak( shared_ptr& v, shared_ptr&& w, M, M ) BOOST_SP_NOEXCEPT { return compare_exchange( v, std::move( w ) ); } - bool compare_exchange_weak( shared_ptr& v, shared_ptr&& w, int = 0 ) BOOST_SP_NOEXCEPT + template bool compare_exchange_weak( shared_ptr& v, shared_ptr&& w, M ) BOOST_SP_NOEXCEPT { return compare_exchange( v, std::move( w ) ); } - bool compare_exchange_strong( shared_ptr& v, shared_ptr&& w, int, int ) BOOST_SP_NOEXCEPT + bool compare_exchange_weak( shared_ptr& v, shared_ptr&& w ) BOOST_SP_NOEXCEPT { return compare_exchange( v, std::move( w ) ); } - bool compare_exchange_strong( shared_ptr& v, shared_ptr&& w, int = 0 ) BOOST_SP_NOEXCEPT + template bool compare_exchange_strong( shared_ptr& v, shared_ptr&& w, M, M ) BOOST_SP_NOEXCEPT + { + return compare_exchange( v, std::move( w ) ); + } + + template bool compare_exchange_strong( shared_ptr& v, shared_ptr&& w, M ) BOOST_SP_NOEXCEPT + { + return compare_exchange( v, std::move( w ) ); + } + + bool compare_exchange_strong( shared_ptr& v, shared_ptr&& w ) BOOST_SP_NOEXCEPT { return compare_exchange( v, std::move( w ) ); } diff --git a/include/boost/smart_ptr/shared_ptr.hpp b/include/boost/smart_ptr/shared_ptr.hpp index e8a302c..4ac0699 100644 --- a/include/boost/smart_ptr/shared_ptr.hpp +++ b/include/boost/smart_ptr/shared_ptr.hpp @@ -1080,7 +1080,7 @@ template shared_ptr atomic_load( shared_ptr const * p ) BOOST_SP_ return *p; } -template inline shared_ptr atomic_load_explicit( shared_ptr const * p, /*memory_order mo*/ int ) BOOST_SP_NOEXCEPT +template inline shared_ptr atomic_load_explicit( shared_ptr const * p, /*memory_order mo*/ M ) BOOST_SP_NOEXCEPT { return atomic_load( p ); } @@ -1091,7 +1091,7 @@ template void atomic_store( shared_ptr * p, shared_ptr r ) BOOST_ p->swap( r ); } -template inline void atomic_store_explicit( shared_ptr * p, shared_ptr r, /*memory_order mo*/ int ) BOOST_SP_NOEXCEPT +template inline void atomic_store_explicit( shared_ptr * p, shared_ptr r, /*memory_order mo*/ M ) BOOST_SP_NOEXCEPT { atomic_store( p, r ); // std::move( r ) } @@ -1107,7 +1107,7 @@ template shared_ptr atomic_exchange( shared_ptr * p, shared_ptr shared_ptr inline atomic_exchange_explicit( shared_ptr * p, shared_ptr r, /*memory_order mo*/ int ) BOOST_SP_NOEXCEPT +template shared_ptr inline atomic_exchange_explicit( shared_ptr * p, shared_ptr r, /*memory_order mo*/ M ) BOOST_SP_NOEXCEPT { return atomic_exchange( p, r ); // std::move( r ) } @@ -1137,7 +1137,7 @@ template bool atomic_compare_exchange( shared_ptr * p, shared_ptr } } -template inline bool atomic_compare_exchange_explicit( shared_ptr * p, shared_ptr * v, shared_ptr w, /*memory_order success*/ int, /*memory_order failure*/ int ) BOOST_SP_NOEXCEPT +template inline bool atomic_compare_exchange_explicit( shared_ptr * p, shared_ptr * v, shared_ptr w, /*memory_order success*/ M, /*memory_order failure*/ M ) BOOST_SP_NOEXCEPT { return atomic_compare_exchange( p, v, w ); // std::move( w ) }