From e4cb5e131f7baac58d3483dc4adaae6143314a5f Mon Sep 17 00:00:00 2001 From: Peter Dimov Date: Mon, 7 Nov 2011 18:46:46 +0000 Subject: [PATCH] Add hash_value for intrusive_ptr. Refs #6087. [SVN r75392] --- include/boost/smart_ptr/intrusive_ptr.hpp | 9 +++ test/Jamfile.v2 | 1 + test/ip_hash_test.cpp | 75 +++++++++++++++++++++++ 3 files changed, 85 insertions(+) create mode 100644 test/ip_hash_test.cpp diff --git a/include/boost/smart_ptr/intrusive_ptr.hpp b/include/boost/smart_ptr/intrusive_ptr.hpp index 2fa4670..a575223 100644 --- a/include/boost/smart_ptr/intrusive_ptr.hpp +++ b/include/boost/smart_ptr/intrusive_ptr.hpp @@ -285,6 +285,15 @@ template std::basic_ostream & operator<< (std:: #endif // !defined(BOOST_NO_IOSTREAM) +// hash_value + +template< class T > struct hash; + +template< class T > std::size_t hash_value( boost::intrusive_ptr const & p ) +{ + return boost::hash< T* >()( p.get() ); +} + } // namespace boost #endif // #ifndef BOOST_SMART_PTR_INTRUSIVE_PTR_HPP_INCLUDED diff --git a/test/Jamfile.v2 b/test/Jamfile.v2 index 16bda20..ad7d8fd 100644 --- a/test/Jamfile.v2 +++ b/test/Jamfile.v2 @@ -67,5 +67,6 @@ import testing ; [ compile make_shared_fp_test.cpp ] [ run sp_hash_test.cpp ] [ run get_deleter_array_test.cpp ] + [ run ip_hash_test.cpp ] ; } diff --git a/test/ip_hash_test.cpp b/test/ip_hash_test.cpp new file mode 100644 index 0000000..be38b3d --- /dev/null +++ b/test/ip_hash_test.cpp @@ -0,0 +1,75 @@ +// +// ip_hash_test.cpp +// +// Copyright 2011 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 + +class base +{ +private: + + int use_count_; + + base(base const &); + base & operator=(base const &); + +protected: + + base(): use_count_(0) + { + } + + virtual ~base() + { + } + +public: + + long use_count() const + { + return use_count_; + } + + inline friend void intrusive_ptr_add_ref(base * p) + { + ++p->use_count_; + } + + inline friend void intrusive_ptr_release(base * p) + { + if(--p->use_count_ == 0) delete p; + } +}; + +struct X: public base +{ +}; + +int main() +{ + boost::hash< boost::intrusive_ptr > hasher; + + boost::intrusive_ptr p1, p2( p1 ), p3( new X ), p4( p3 ), p5( new X ); + + 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(); +}