diff --git a/hash/test/Jamfile.v2 b/hash/test/Jamfile.v2 index 47f0a95..fc731d2 100644 --- a/hash/test/Jamfile.v2 +++ b/hash/test/Jamfile.v2 @@ -42,6 +42,7 @@ test-suite functional/hash [ run hash_type_index_test.cpp ] [ run hash_std_array_test.cpp ] [ run hash_std_tuple_test.cpp ] + [ run hash_std_smart_ptr_test.cpp ] [ run link_test.cpp link_test_2.cpp ] [ run link_ext_test.cpp link_no_ext_test.cpp ] [ run extensions_hpp_test.cpp ] diff --git a/hash/test/hash_std_smart_ptr_test.cpp b/hash/test/hash_std_smart_ptr_test.cpp new file mode 100644 index 0000000..83e705b --- /dev/null +++ b/hash/test/hash_std_smart_ptr_test.cpp @@ -0,0 +1,80 @@ + +// Copyright 2012 Daniel James. +// 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 "./config.hpp" + +#ifdef TEST_STD_INCLUDES +# include +#else +# include +#endif + +#include +#include "./compile_time.hpp" + +#if defined(TEST_EXTENSIONS) && !defined(BOOST_NO_CXX11_HDR_TUPLE) +#define TEST_SMART_PTRS +#include +#endif + +#ifdef TEST_SMART_PTRS + +void shared_ptr_tests() +{ + std::shared_ptr x; + compile_time_tests(&x); + + HASH_NAMESPACE::hash > x1; + HASH_NAMESPACE::hash > x2; + + std::shared_ptr ptr1(new int(10)); + std::shared_ptr ptr2; + + BOOST_TEST(x1(x) == x2(ptr2)); + BOOST_TEST(x1(x) != x2(ptr1)); + ptr2.reset(new int(10)); + BOOST_TEST(x1(ptr1) == x2(ptr1)); + BOOST_TEST(x1(ptr1) != x2(ptr2)); + ptr2 = ptr1; + BOOST_TEST(x1(ptr1) == x2(ptr2)); +#if defined(TEST_EXTENSIONS) + BOOST_TEST(x1(x) == HASH_NAMESPACE::hash_value(x)); + BOOST_TEST(x1(ptr1) == HASH_NAMESPACE::hash_value(ptr2)); +#endif +} + +void unique_ptr_tests() +{ + std::unique_ptr x; + compile_time_tests(&x); + + HASH_NAMESPACE::hash > x1; + HASH_NAMESPACE::hash > x2; + + std::unique_ptr ptr1(new int(10)); + std::unique_ptr ptr2; + + BOOST_TEST(x1(x) == x2(ptr2)); + BOOST_TEST(x1(x) != x2(ptr1)); + ptr2.reset(new int(10)); + BOOST_TEST(x1(ptr1) == x2(ptr1)); + BOOST_TEST(x1(ptr1) != x2(ptr2)); + +#if defined(TEST_EXTENSIONS) + BOOST_TEST(x1(x) == HASH_NAMESPACE::hash_value(x)); +#endif +} + +#endif + +int main() +{ +#ifdef TEST_SMART_PTRS + shared_ptr_tests(); + unique_ptr_tests(); +#endif + + return boost::report_errors(); +} diff --git a/include/boost/functional/hash/detail/container_fwd_0x.hpp b/include/boost/functional/hash/detail/container_fwd_0x.hpp index 442ec6c..4e2dd7e 100644 --- a/include/boost/functional/hash/detail/container_fwd_0x.hpp +++ b/include/boost/functional/hash/detail/container_fwd_0x.hpp @@ -38,4 +38,18 @@ namespace std { # endif #endif +// std::shared_ptr/std::unique_ptr + +#if !defined(BOOST_NO_CXX11_HDR_MEMORY) +# if (defined(BOOST_DETAIL_NO_CONTAINER_FWD) && \ + !defined(BOOST_DETAIL_TEST_FORCE_CONTAINER_FWD)) +# include +# else +namespace std { + template class shared_ptr; + template class unique_ptr; +} +# endif +#endif + #endif diff --git a/include/boost/functional/hash/extensions.hpp b/include/boost/functional/hash/extensions.hpp index 9c4a6be..dc59b45 100644 --- a/include/boost/functional/hash/extensions.hpp +++ b/include/boost/functional/hash/extensions.hpp @@ -177,6 +177,18 @@ namespace boost # undef BOOST_HASH_TUPLE_F #endif +#endif + +#if !defined(BOOST_NO_CXX11_HDR_MEMORY) + template + inline std::size_t hash_value(std::shared_ptr const& x) { + return boost::hash_value(x.get()); + } + + template + inline std::size_t hash_value(std::unique_ptr const& x) { + return boost::hash_value(x.get()); + } #endif //