diff --git a/hash/test/Jamfile.v2 b/hash/test/Jamfile.v2 index 07df1a0..0f41d3e 100644 --- a/hash/test/Jamfile.v2 +++ b/hash/test/Jamfile.v2 @@ -22,6 +22,7 @@ test-suite functional/hash [ run hash_fwd_test_1.cpp ] [ run hash_fwd_test_2.cpp ] [ run hash_number_test.cpp ] + [ run hash_enum_test.cpp ] [ run hash_pointer_test.cpp ] [ run hash_function_pointer_test.cpp ] [ run hash_float_test.cpp ] diff --git a/hash/test/hash_enum_test.cpp b/hash/test/hash_enum_test.cpp new file mode 100644 index 0000000..30444e5 --- /dev/null +++ b/hash/test/hash_enum_test.cpp @@ -0,0 +1,63 @@ + +// 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" + +namespace test { + enum enum_override { enum_override1, enum_override2 }; + std::size_t hash_value(enum_override) { return 896532; } + + enum enum1 { enum1a }; + enum enum2 { enum2a, enum2b }; + enum enum3 { enum3a = 574, enum3b }; + enum enum4 { enum4a = -12574, enum4b }; +} + +int main() { + compile_time_tests((test::enum1*) 0); + compile_time_tests((test::enum2*) 0); + compile_time_tests((test::enum3*) 0); + compile_time_tests((test::enum4*) 0); + compile_time_tests((test::enum_override*) 0); + + HASH_NAMESPACE::hash hash1; + HASH_NAMESPACE::hash hash2; + HASH_NAMESPACE::hash hash3; + HASH_NAMESPACE::hash hash4; + + BOOST_TEST(hash1(test::enum1a) == hash1(test::enum1a)); + + BOOST_TEST(hash2(test::enum2a) == hash2(test::enum2a)); + BOOST_TEST(hash2(test::enum2a) != hash2(test::enum2b)); + BOOST_TEST(hash2(test::enum2b) == hash2(test::enum2b)); + + BOOST_TEST(hash3(test::enum3a) == hash3(test::enum3a)); + BOOST_TEST(hash3(test::enum3a) != hash3(test::enum3b)); + BOOST_TEST(hash3(test::enum3b) == hash3(test::enum3b)); + + BOOST_TEST(hash4(test::enum4a) == hash4(test::enum4a)); + BOOST_TEST(hash4(test::enum4a) != hash4(test::enum4b)); + BOOST_TEST(hash4(test::enum4b) == hash4(test::enum4b)); + + HASH_NAMESPACE::hash hash_override; + + BOOST_TEST(hash_override(test::enum_override1) == + hash_override(test::enum_override1)); + BOOST_TEST(hash_override(test::enum_override1) == + hash_override(test::enum_override2)); + BOOST_TEST(hash_override(test::enum_override1) == + hash_override(test::enum_override1)); + + return boost::report_errors(); +} diff --git a/hash/test/hash_function_pointer_test.cpp b/hash/test/hash_function_pointer_test.cpp index 73719e2..a73b718 100644 --- a/hash/test/hash_function_pointer_test.cpp +++ b/hash/test/hash_function_pointer_test.cpp @@ -12,10 +12,6 @@ #endif #include - -#include -#include - #include "./compile_time.hpp" void void_func1() { static int x = 1; ++x; } diff --git a/hash/test/hash_number_test.cpp b/hash/test/hash_number_test.cpp index b233c71..2645dfa 100644 --- a/hash/test/hash_number_test.cpp +++ b/hash/test/hash_number_test.cpp @@ -16,8 +16,6 @@ #include #include -#include -#include #include "./compile_time.hpp" diff --git a/hash/test/hash_pointer_test.cpp b/hash/test/hash_pointer_test.cpp index 5fcbc27..b255a28 100644 --- a/hash/test/hash_pointer_test.cpp +++ b/hash/test/hash_pointer_test.cpp @@ -12,11 +12,7 @@ #endif #include - #include -#include -#include - #include "./compile_time.hpp" void pointer_tests() diff --git a/hash/test/hash_range_test.cpp b/hash/test/hash_range_test.cpp index 8743e1e..f5fdb2a 100644 --- a/hash/test/hash_range_test.cpp +++ b/hash/test/hash_range_test.cpp @@ -18,10 +18,7 @@ int main() {} #endif #include - #include -#include -#include #include void hash_range_tests() diff --git a/hash/test/hash_string_test.cpp b/hash/test/hash_string_test.cpp index b3b8394..29ff28e 100644 --- a/hash/test/hash_string_test.cpp +++ b/hash/test/hash_string_test.cpp @@ -12,11 +12,7 @@ #endif #include - -#include -#include #include - #include "./compile_time.hpp" void string_tests() diff --git a/include/boost/functional/hash/hash.hpp b/include/boost/functional/hash/hash.hpp index c179fab..647fd68 100644 --- a/include/boost/functional/hash/hash.hpp +++ b/include/boost/functional/hash/hash.hpp @@ -15,6 +15,8 @@ #include #include #include +#include +#include #if defined(BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION) #include @@ -90,6 +92,10 @@ namespace boost template typename boost::hash_detail::ulong_numbers::type hash_value(T); + template + typename boost::enable_if, std::size_t>::type + hash_value(T); + #if !BOOST_WORKAROUND(__DMC__, <= 0x848) template std::size_t hash_value(T* const&); #else @@ -179,6 +185,13 @@ namespace boost return hash_detail::hash_value_unsigned(v); } + template + typename boost::enable_if, std::size_t>::type + hash_value(T v) + { + return static_cast(v); + } + // Implementation by Alberto Barbati and Dave Harris. #if !BOOST_WORKAROUND(__DMC__, <= 0x848) template std::size_t hash_value(T* const& v)