From 46f00ea9935a3be7b8d1f14a2d4a0db0a3705b58 Mon Sep 17 00:00:00 2001 From: Peter Dimov Date: Tue, 15 Dec 2015 19:13:20 +0200 Subject: [PATCH] Fix hash support for shared_ptr, --- include/boost/smart_ptr/shared_ptr.hpp | 2 +- test/Jamfile.v2 | 3 +++ test/sp_hash_test2.cpp | 34 ++++++++++++++++++++++++++ test/sp_hash_test3.cpp | 34 ++++++++++++++++++++++++++ 4 files changed, 72 insertions(+), 1 deletion(-) create mode 100644 test/sp_hash_test2.cpp create mode 100644 test/sp_hash_test3.cpp diff --git a/include/boost/smart_ptr/shared_ptr.hpp b/include/boost/smart_ptr/shared_ptr.hpp index 47bc33d..bcefda8 100644 --- a/include/boost/smart_ptr/shared_ptr.hpp +++ b/include/boost/smart_ptr/shared_ptr.hpp @@ -1065,7 +1065,7 @@ template< class T > struct hash; template< class T > std::size_t hash_value( boost::shared_ptr const & p ) BOOST_NOEXCEPT { - return boost::hash< T* >()( p.get() ); + return boost::hash< typename boost::shared_ptr::element_type* >()( p.get() ); } } // namespace boost diff --git a/test/Jamfile.v2 b/test/Jamfile.v2 index 62fab50..963eebc 100644 --- a/test/Jamfile.v2 +++ b/test/Jamfile.v2 @@ -181,5 +181,8 @@ import testing ; [ run weak_from_this_test2.cpp ] [ run sp_bml_unique_ptr_test.cpp ] + + [ run sp_hash_test2.cpp ] + [ run sp_hash_test3.cpp ] ; } diff --git a/test/sp_hash_test2.cpp b/test/sp_hash_test2.cpp new file mode 100644 index 0000000..c1cbf70 --- /dev/null +++ b/test/sp_hash_test2.cpp @@ -0,0 +1,34 @@ +// +// sp_hash_test2.cpp +// +// Copyright 2011, 2015 Peter Dimov +// +// Distributed under the Boost Software License, Version 1.0. +// See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt +// + +#include +#include +#include + +int main() +{ + boost::hash< boost::shared_ptr > hasher; + + boost::shared_ptr< int[] > p1, p2( p1 ), p3( new int[1] ), p4( p3 ), p5( new int[1] ); + + BOOST_TEST_EQ( p1, p2 ); + BOOST_TEST_EQ( hasher( p1 ), hasher( p2 ) ); + + BOOST_TEST_NE( p1, p3 ); + BOOST_TEST_NE( hasher( p1 ), hasher( p3 ) ); + + BOOST_TEST_EQ( p3, p4 ); + BOOST_TEST_EQ( hasher( p3 ), hasher( p4 ) ); + + BOOST_TEST_NE( p3, p5 ); + BOOST_TEST_NE( hasher( p3 ), hasher( p5 ) ); + + return boost::report_errors(); +} diff --git a/test/sp_hash_test3.cpp b/test/sp_hash_test3.cpp new file mode 100644 index 0000000..4d4acad --- /dev/null +++ b/test/sp_hash_test3.cpp @@ -0,0 +1,34 @@ +// +// sp_hash_test3.cpp +// +// Copyright 2011, 2015 Peter Dimov +// +// Distributed under the Boost Software License, Version 1.0. +// See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt +// + +#include +#include +#include + +int main() +{ + boost::hash< boost::shared_ptr > hasher; + + boost::shared_ptr< int[1] > p1, p2( p1 ), p3( new int[1] ), p4( p3 ), p5( new int[1] ); + + BOOST_TEST_EQ( p1, p2 ); + BOOST_TEST_EQ( hasher( p1 ), hasher( p2 ) ); + + BOOST_TEST_NE( p1, p3 ); + BOOST_TEST_NE( hasher( p1 ), hasher( p3 ) ); + + BOOST_TEST_EQ( p3, p4 ); + BOOST_TEST_EQ( hasher( p3 ), hasher( p4 ) ); + + BOOST_TEST_NE( p3, p5 ); + BOOST_TEST_NE( hasher( p3 ), hasher( p5 ) ); + + return boost::report_errors(); +}