diff --git a/hash/test/Jamfile b/hash/test/Jamfile index 51e54f6..f87d49e 100644 --- a/hash/test/Jamfile +++ b/hash/test/Jamfile @@ -33,7 +33,7 @@ rule hash-test ( names + : extras * ) [ hash-test hash_range_test ] [ hash-test hash_custom_test ] [ hash-test hash_global_namespace_test ] -# [ hash-test hash_friend_test ] + [ hash-test hash_friend_test ] [ hash-test hash_built_in_array_test ] [ hash-test hash_value_array_test ] [ hash-test hash_vector_test ] diff --git a/hash/test/Jamfile.v2 b/hash/test/Jamfile.v2 index baa6a1a..b1c714b 100644 --- a/hash/test/Jamfile.v2 +++ b/hash/test/Jamfile.v2 @@ -25,7 +25,7 @@ test-suite functional/hash [ run hash_range_test.cpp framework ] [ run hash_custom_test.cpp framework ] [ run hash_global_namespace_test.cpp framework ] -# [ run hash_friend_test.cpp framework ] + [ run hash_friend_test.cpp framework ] [ run hash_built_in_array_test.cpp framework ] [ run hash_value_array_test.cpp framework ] [ run hash_vector_test.cpp framework ] diff --git a/hash/test/hash_friend_test.cpp b/hash/test/hash_friend_test.cpp new file mode 100644 index 0000000..a064ba6 --- /dev/null +++ b/hash/test/hash_friend_test.cpp @@ -0,0 +1,96 @@ + +// (C) Copyright Daniel James 2005. +// Use, modification and distribution are subject to 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 + +namespace test +{ + template + struct custom + { + int value_; + + std::size_t hash() const + { + return value_ * 10; + } + +#if !defined(BOOST_NO_ARGUMENT_DEPENDENT_LOOKUP) + friend std::size_t hash_value(custom const& x) + { + return x.hash(); + } +#endif + + custom(int x) : value_(x) {} + }; +} + +#if defined(BOOST_NO_ARGUMENT_DEPENDENT_LOOKUP) +namespace boost +{ + template + std::size_t hash_value(test::custom x) + { + return x.hash(); + } +} +#endif + +#include "./config.hpp" + +#ifdef TEST_EXTENSIONS +# ifdef TEST_STD_INCLUDES +# include +# else +# include +# endif +#endif + +#define BOOST_TEST_MAIN +#include + +#ifdef TEST_EXTENSIONS + +#include +#include +#include + +BOOST_AUTO_TEST_CASE(custom_tests) +{ + HASH_NAMESPACE::hash > custom_hasher; + BOOST_CHECK(custom_hasher(10) == 100u); + test::custom x(55); + BOOST_CHECK(custom_hasher(x) == 550u); + + { + using namespace HASH_NAMESPACE; + BOOST_CHECK(custom_hasher(x) == hash_value(x)); + } + + std::vector > custom_vector; + custom_vector.push_back(5); + custom_vector.push_back(25); + custom_vector.push_back(35); + + std::size_t seed = 0; + HASH_NAMESPACE::hash_combine(seed, test::custom(5)); + HASH_NAMESPACE::hash_combine(seed, test::custom(25)); + HASH_NAMESPACE::hash_combine(seed, test::custom(35)); + + std::size_t seed2 = 0; + HASH_NAMESPACE::hash_combine(seed2, 50u); + HASH_NAMESPACE::hash_combine(seed2, 250u); + HASH_NAMESPACE::hash_combine(seed2, 350u); + + BOOST_CHECK(seed == + HASH_NAMESPACE::hash_range(custom_vector.begin(), custom_vector.end())); + BOOST_CHECK(seed == seed2); +} + +#endif // TEST_EXTENSIONS +