From 91f3aa0386ed16b78747bdaac8e2ec7d1a3b6ac4 Mon Sep 17 00:00:00 2001 From: Peter Dimov Date: Mon, 1 Jun 2020 01:35:25 +0300 Subject: [PATCH] Add local_shared_ptr::owner_equals --- include/boost/smart_ptr/local_shared_ptr.hpp | 7 ++ test/Jamfile | 1 + test/lsp_owner_equals_test.cpp | 113 +++++++++++++++++++ 3 files changed, 121 insertions(+) create mode 100644 test/lsp_owner_equals_test.cpp diff --git a/include/boost/smart_ptr/local_shared_ptr.hpp b/include/boost/smart_ptr/local_shared_ptr.hpp index 1bf1fdf..30f3f32 100644 --- a/include/boost/smart_ptr/local_shared_ptr.hpp +++ b/include/boost/smart_ptr/local_shared_ptr.hpp @@ -494,6 +494,13 @@ public: { return std::less< boost::detail::local_counted_base* >()( pn, r.pn ); } + + // owner_equals + + template bool owner_equals( local_shared_ptr const & r ) const BOOST_SP_NOEXCEPT + { + return pn == r.pn; + } }; template inline bool operator==( local_shared_ptr const & a, local_shared_ptr const & b ) BOOST_SP_NOEXCEPT diff --git a/test/Jamfile b/test/Jamfile index d094b52..51be6a5 100644 --- a/test/Jamfile +++ b/test/Jamfile @@ -370,3 +370,4 @@ compile sp_pedantic_test.cpp run sp_owner_before_test.cpp ; run sp_owner_equals_test.cpp ; run lsp_owner_before_test.cpp ; +run lsp_owner_equals_test.cpp ; diff --git a/test/lsp_owner_equals_test.cpp b/test/lsp_owner_equals_test.cpp new file mode 100644 index 0000000..8044576 --- /dev/null +++ b/test/lsp_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 + +int main() +{ + { + boost::local_shared_ptr p1( new int ); + boost::local_shared_ptr p2( p1 ); + + BOOST_TEST( p1.owner_equals( p2 ) ); + BOOST_TEST( p2.owner_equals( p1 ) ); + + boost::local_shared_ptr p3( new int ); + + BOOST_TEST( !p1.owner_equals( p3 ) ); + BOOST_TEST( !p3.owner_equals( p1 ) ); + + boost::local_shared_ptr p4; + boost::local_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::local_shared_ptr p6( static_cast(0) ); + + BOOST_TEST( !p4.owner_equals( p6 ) ); + BOOST_TEST( !p6.owner_equals( p4 ) ); + + boost::local_shared_ptr p7( p1 ); + + BOOST_TEST( p1.owner_equals( p7 ) ); + BOOST_TEST( p7.owner_equals( p1 ) ); + + boost::local_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::local_weak_ptr q1( p1 ); + + BOOST_TEST( p1.owner_equals( q1 ) ); + BOOST_TEST( q1.owner_equals( p1 ) ); + + boost::local_weak_ptr q2( p1 ); + + BOOST_TEST( q1.owner_equals( q2 ) ); + BOOST_TEST( q2.owner_equals( q1 ) ); + + boost::local_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::local_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::local_weak_ptr q5; + + BOOST_TEST( q4.owner_equals( q5 ) ); + BOOST_TEST( q5.owner_equals( q4 ) ); + + boost::local_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(); +}