diff --git a/include/boost/smart_ptr/owner_equal_to.hpp b/include/boost/smart_ptr/owner_equal_to.hpp new file mode 100644 index 0000000..e4200f7 --- /dev/null +++ b/include/boost/smart_ptr/owner_equal_to.hpp @@ -0,0 +1,25 @@ +#ifndef BOOST_SMART_PTR_OWNER_EQUAL_TO_HPP_INCLUDED +#define BOOST_SMART_PTR_OWNER_EQUAL_TO_HPP_INCLUDED + +// Copyright 2020 Peter Dimov +// Distributed under the Boost Software License, Version 1.0. +// https://www.boost.org/LICENSE_1_0.txt + +namespace boost +{ + +template struct owner_equal_to +{ + typedef bool result_type; + typedef T first_argument_type; + typedef T second_argument_type; + + template bool operator()( U const & u, V const & v ) const + { + return u.owner_equals( v ); + } +}; + +} // namespace boost + +#endif // #ifndef BOOST_SMART_PTR_OWNER_EQUAL_TO_HPP_INCLUDED diff --git a/test/Jamfile b/test/Jamfile index 51be6a5..abd9bee 100644 --- a/test/Jamfile +++ b/test/Jamfile @@ -371,3 +371,6 @@ run sp_owner_before_test.cpp ; run sp_owner_equals_test.cpp ; run lsp_owner_before_test.cpp ; run lsp_owner_equals_test.cpp ; + +run owner_equal_to_test.cpp ; +run owner_equal_to_test2.cpp ; diff --git a/test/owner_equal_to_test.cpp b/test/owner_equal_to_test.cpp new file mode 100644 index 0000000..5bce0d2 --- /dev/null +++ b/test/owner_equal_to_test.cpp @@ -0,0 +1,116 @@ +// Copyright 2020 Peter Dimov +// Distributed under the Boost Software License, Version 1.0. +// https://www.boost.org/LICENSE_1_0.txt + +#include +#include +#include +#include + +int main() +{ + boost::owner_equal_to<> const eq; + + { + boost::shared_ptr p1( new int ); + boost::shared_ptr p2( p1 ); + + BOOST_TEST( eq( p1, p2 ) ); + BOOST_TEST( eq( p2, p1 ) ); + + boost::shared_ptr p3( new int ); + + BOOST_TEST( !eq( p1, p3 ) ); + BOOST_TEST( !eq( p3, p1 ) ); + + boost::shared_ptr p4; + boost::shared_ptr p5; + + BOOST_TEST( eq( p4, p5 ) ); + BOOST_TEST( eq( p5, p4 ) ); + + BOOST_TEST( !eq( p4, p3 ) ); + BOOST_TEST( !eq( p3, p4 ) ); + + boost::shared_ptr p6( static_cast(0) ); + + BOOST_TEST( !eq( p4, p6 ) ); + BOOST_TEST( !eq( p6, p4 ) ); + + boost::shared_ptr p7( p1 ); + + BOOST_TEST( eq( p1, p7 ) ); + BOOST_TEST( eq( p7, p1 ) ); + + boost::shared_ptr p8; + + BOOST_TEST( !eq( p1, p8 ) ); + BOOST_TEST( !eq( p8, p1 ) ); + + BOOST_TEST( eq( p4, p8 ) ); + BOOST_TEST( eq( p8, p4 ) ); + + boost::weak_ptr q1( p1 ); + + BOOST_TEST( eq( p1, q1 ) ); + BOOST_TEST( eq( q1, p1 ) ); + + boost::weak_ptr q2( p1 ); + + BOOST_TEST( eq( q1, q2 ) ); + BOOST_TEST( eq( q2, q1 ) ); + + boost::weak_ptr q3( p3 ); + + BOOST_TEST( !eq( p1, q3 ) ); + BOOST_TEST( !eq( q3, p1 ) ); + + BOOST_TEST( !eq( q1, q3 ) ); + BOOST_TEST( !eq( q3, q1 ) ); + + boost::weak_ptr q4; + + BOOST_TEST( eq( p4, q4 ) ); + BOOST_TEST( eq( q4, p4 ) ); + + BOOST_TEST( !eq( q1, q4 ) ); + BOOST_TEST( !eq( q4, q1 ) ); + + boost::weak_ptr q5; + + BOOST_TEST( eq( q4, q5 ) ); + BOOST_TEST( eq( q5, q4 ) ); + + boost::weak_ptr q7( p7 ); + + BOOST_TEST( eq( p1, q7 ) ); + BOOST_TEST( eq( q7, p1 ) ); + + BOOST_TEST( eq( q1, q7 ) ); + BOOST_TEST( eq( q7, 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( eq( q1, q2 ) ); + BOOST_TEST( eq( q2, q1 ) ); + + BOOST_TEST( eq( q1, q7 ) ); + BOOST_TEST( eq( q7, q1 ) ); + + BOOST_TEST( !eq( q1, q3 ) ); + BOOST_TEST( !eq( q3, q1 ) ); + + BOOST_TEST( !eq( q1, q4 ) ); + BOOST_TEST( !eq( q4, q1 ) ); + } + + return boost::report_errors(); +} diff --git a/test/owner_equal_to_test2.cpp b/test/owner_equal_to_test2.cpp new file mode 100644 index 0000000..4a8d629 --- /dev/null +++ b/test/owner_equal_to_test2.cpp @@ -0,0 +1,116 @@ +// 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::owner_equal_to<> const eq; + + { + boost::local_shared_ptr p1( new int ); + boost::local_shared_ptr p2( p1 ); + + BOOST_TEST( eq( p1, p2 ) ); + BOOST_TEST( eq( p2, p1 ) ); + + boost::local_shared_ptr p3( new int ); + + BOOST_TEST( !eq( p1, p3 ) ); + BOOST_TEST( !eq( p3, p1 ) ); + + boost::local_shared_ptr p4; + boost::local_shared_ptr p5; + + BOOST_TEST( eq( p4, p5 ) ); + BOOST_TEST( eq( p5, p4 ) ); + + BOOST_TEST( !eq( p4, p3 ) ); + BOOST_TEST( !eq( p3, p4 ) ); + + boost::local_shared_ptr p6( static_cast(0) ); + + BOOST_TEST( !eq( p4, p6 ) ); + BOOST_TEST( !eq( p6, p4 ) ); + + boost::local_shared_ptr p7( p1 ); + + BOOST_TEST( eq( p1, p7 ) ); + BOOST_TEST( eq( p7, p1 ) ); + + boost::local_shared_ptr p8; + + BOOST_TEST( !eq( p1, p8 ) ); + BOOST_TEST( !eq( p8, p1 ) ); + + BOOST_TEST( eq( p4, p8 ) ); + BOOST_TEST( eq( p8, p4 ) ); +/* + boost::local_weak_ptr q1( p1 ); + + BOOST_TEST( eq( p1, q1 ) ); + BOOST_TEST( eq( q1, p1 ) ); + + boost::local_weak_ptr q2( p1 ); + + BOOST_TEST( eq( q1, q2 ) ); + BOOST_TEST( eq( q2, q1 ) ); + + boost::local_weak_ptr q3( p3 ); + + BOOST_TEST( !eq( p1, q3 ) ); + BOOST_TEST( !eq( q3, p1 ) ); + + BOOST_TEST( !eq( q1, q3 ) ); + BOOST_TEST( !eq( q3, q1 ) ); + + boost::local_weak_ptr q4; + + BOOST_TEST( eq( p4, q4 ) ); + BOOST_TEST( eq( q4, p4 ) ); + + BOOST_TEST( !eq( q1, q4 ) ); + BOOST_TEST( !eq( q4, q1 ) ); + + boost::local_weak_ptr q5; + + BOOST_TEST( eq( q4, q5 ) ); + BOOST_TEST( eq( q5, q4 ) ); + + boost::local_weak_ptr q7( p7 ); + + BOOST_TEST( eq( p1, q7 ) ); + BOOST_TEST( eq( q7, p1 ) ); + + BOOST_TEST( eq( q1, q7 ) ); + BOOST_TEST( eq( q7, 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( eq( q1, q2 ) ); + BOOST_TEST( eq( q2, q1 ) ); + + BOOST_TEST( eq( q1, q7 ) ); + BOOST_TEST( eq( q7, q1 ) ); + + BOOST_TEST( !eq( q1, q3 ) ); + BOOST_TEST( !eq( q3, q1 ) ); + + BOOST_TEST( !eq( q1, q4 ) ); + BOOST_TEST( !eq( q4, q1 ) ); +*/ + } + + return boost::report_errors(); +}