diff --git a/hash/test/Jamfile b/hash/test/Jamfile index 815d4ab..dfc797c 100644 --- a/hash/test/Jamfile +++ b/hash/test/Jamfile @@ -32,6 +32,7 @@ rule hash-test ( names + : extras * ) [ hash-test hash_string_test ] [ hash-test hash_range_test ] [ hash-test hash_custom_test ] + [ hash-test hash_global_namespace_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 da47e04..53f915b 100644 --- a/hash/test/Jamfile.v2 +++ b/hash/test/Jamfile.v2 @@ -8,6 +8,11 @@ import testing ; alias framework : /boost/test//boost_unit_test_framework ; +project hash-tests + : requirements + gcc:_GLIBCXX_DEBUG + ; + test-suite functional/hash : [ run hash_fwd_test_1.cpp framework ] @@ -19,6 +24,7 @@ test-suite functional/hash [ run hash_string_test.cpp framework ] [ run hash_range_test.cpp framework ] [ run hash_custom_test.cpp framework ] + [ run hash_global_namespace_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_global_namespace_test.cpp b/hash/test/hash_global_namespace_test.cpp new file mode 100644 index 0000000..1aa44fd --- /dev/null +++ b/hash/test/hash_global_namespace_test.cpp @@ -0,0 +1,93 @@ + +// (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) + +// This test demonstrates an ADL bug in Borland 5.5 where ADL isn't performed +// in the global namespace. + +#include +#include + +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 +{ + std::size_t hash_value(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); + 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, custom(5)); + HASH_NAMESPACE::hash_combine(seed, custom(25)); + HASH_NAMESPACE::hash_combine(seed, 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