From b286131642a1ae75045be2895c8c3241ebabe85b Mon Sep 17 00:00:00 2001 From: Daniel James Date: Wed, 22 Aug 2012 11:40:27 +0000 Subject: [PATCH] Hash: Quick attempt at supporting enums. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Thanks to Filip Konvička. [SVN r80139] --- hash/test/Jamfile.v2 | 1 + hash/test/hash_enum_test.cpp | 59 ++++++++++++++++++++++++++ include/boost/functional/hash/hash.hpp | 13 ++++++ 3 files changed, 73 insertions(+) create mode 100644 hash/test/hash_enum_test.cpp 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..d17b608 --- /dev/null +++ b/hash/test/hash_enum_test.cpp @@ -0,0 +1,59 @@ + +// 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 +#include + +namespace test { + enum enum_override { enum_override1, enum_override2 }; + std::size_t hash_value(enum_override x) { return -896532; } + + enum enum1 { enum1a }; + enum enum2 { enum2a, enum2b }; + enum enum3 { enum3a = 574, enum3b }; + enum enum4 { enum4a = -12574, enum4b }; +} + +int main() { + boost::hash hash1; + boost::hash hash2; + boost::hash hash3; + boost::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)); + + boost::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/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)