diff --git a/include/boost/smart_ptr/shared_ptr.hpp b/include/boost/smart_ptr/shared_ptr.hpp index 6674b15..3a60199 100644 --- a/include/boost/smart_ptr/shared_ptr.hpp +++ b/include/boost/smart_ptr/shared_ptr.hpp @@ -777,6 +777,16 @@ public: return pn < rhs.pn; } + template bool owner_equals( shared_ptr const & rhs ) const BOOST_SP_NOEXCEPT + { + return pn == rhs.pn; + } + + template bool owner_equals( weak_ptr const & rhs ) const BOOST_SP_NOEXCEPT + { + return pn == rhs.pn; + } + void * _internal_get_deleter( boost::detail::sp_typeinfo_ const & ti ) const BOOST_SP_NOEXCEPT { return pn.get_deleter( ti ); diff --git a/include/boost/smart_ptr/weak_ptr.hpp b/include/boost/smart_ptr/weak_ptr.hpp index 07ba189..ddc8bfb 100644 --- a/include/boost/smart_ptr/weak_ptr.hpp +++ b/include/boost/smart_ptr/weak_ptr.hpp @@ -237,6 +237,16 @@ public: return pn < rhs.pn; } + template bool owner_equals( weak_ptr const & rhs ) const BOOST_SP_NOEXCEPT + { + return pn == rhs.pn; + } + + template bool owner_equals( shared_ptr const & rhs ) const BOOST_SP_NOEXCEPT + { + return pn == rhs.pn; + } + // Tasteless as this may seem, making all members public allows member templates // to work in the absence of member template friends. (Matthew Langston) diff --git a/test/Jamfile b/test/Jamfile index 7066d2f..c047faa 100644 --- a/test/Jamfile +++ b/test/Jamfile @@ -368,3 +368,4 @@ compile sp_pedantic_test.cpp clang:on ; run sp_owner_before_test.cpp ; +run sp_owner_equals_test.cpp ; diff --git a/test/sp_owner_equals_test.cpp b/test/sp_owner_equals_test.cpp new file mode 100644 index 0000000..e9a5842 --- /dev/null +++ b/test/sp_owner_equals_test.cpp @@ -0,0 +1,113 @@ +// Copyright 2020 Peter Dimov +// Distributed under the Boost Software License, Version 1.0. +// https://www.boost.org/LICENSE_1_0.txt + +#include +#include +#include + +int main() +{ + { + boost::shared_ptr p1( new int ); + boost::shared_ptr p2( p1 ); + + BOOST_TEST( p1.owner_equals( p2 ) ); + BOOST_TEST( p2.owner_equals( p1 ) ); + + boost::shared_ptr p3( new int ); + + BOOST_TEST( !p1.owner_equals( p3 ) ); + BOOST_TEST( !p3.owner_equals( p1 ) ); + + boost::shared_ptr p4; + boost::shared_ptr p5; + + BOOST_TEST( p4.owner_equals( p5 ) ); + BOOST_TEST( p5.owner_equals( p4 ) ); + + BOOST_TEST( !p4.owner_equals( p3 ) ); + BOOST_TEST( !p3.owner_equals( p4 ) ); + + boost::shared_ptr p6( static_cast(0) ); + + BOOST_TEST( !p4.owner_equals( p6 ) ); + BOOST_TEST( !p6.owner_equals( p4 ) ); + + boost::shared_ptr p7( p1 ); + + BOOST_TEST( p1.owner_equals( p7 ) ); + BOOST_TEST( p7.owner_equals( p1 ) ); + + boost::shared_ptr p8; + + BOOST_TEST( !p1.owner_equals( p8 ) ); + BOOST_TEST( !p8.owner_equals( p1 ) ); + + BOOST_TEST( p4.owner_equals( p8 ) ); + BOOST_TEST( p8.owner_equals( p4 ) ); + + boost::weak_ptr q1( p1 ); + + BOOST_TEST( p1.owner_equals( q1 ) ); + BOOST_TEST( q1.owner_equals( p1 ) ); + + boost::weak_ptr q2( p1 ); + + BOOST_TEST( q1.owner_equals( q2 ) ); + BOOST_TEST( q2.owner_equals( q1 ) ); + + boost::weak_ptr q3( p3 ); + + BOOST_TEST( !p1.owner_equals( q3 ) ); + BOOST_TEST( !q3.owner_equals( p1 ) ); + + BOOST_TEST( !q1.owner_equals( q3 ) ); + BOOST_TEST( !q3.owner_equals( q1 ) ); + + boost::weak_ptr q4; + + BOOST_TEST( p4.owner_equals( q4 ) ); + BOOST_TEST( q4.owner_equals( p4 ) ); + + BOOST_TEST( !q1.owner_equals( q4 ) ); + BOOST_TEST( !q4.owner_equals( q1 ) ); + + boost::weak_ptr q5; + + BOOST_TEST( q4.owner_equals( q5 ) ); + BOOST_TEST( q5.owner_equals( q4 ) ); + + boost::weak_ptr q7( p7 ); + + BOOST_TEST( p1.owner_equals( q7 ) ); + BOOST_TEST( q7.owner_equals( p1 ) ); + + BOOST_TEST( q1.owner_equals( q7 ) ); + BOOST_TEST( q7.owner_equals( q1 ) ); + + p1.reset(); + p2.reset(); + p3.reset(); + p7.reset(); + + BOOST_TEST( q1.expired() ); + BOOST_TEST( q2.expired() ); + BOOST_TEST( q3.expired() ); + BOOST_TEST( q7.expired() ); + + BOOST_TEST( q1.owner_equals( q2 ) ); + BOOST_TEST( q2.owner_equals( q1 ) ); + + BOOST_TEST( q1.owner_equals( q7 ) ); + BOOST_TEST( q7.owner_equals( q1 ) ); + + BOOST_TEST( !q1.owner_equals( q3 ) ); + BOOST_TEST( !q3.owner_equals( q1 ) ); + + BOOST_TEST( !q1.owner_equals( q4 ) ); + BOOST_TEST( !q4.owner_equals( q1 ) ); + } + + return boost::report_errors(); +}