diff --git a/doc/hash.qbk b/doc/hash.qbk index 1e3a9e7..5c925e6 100644 --- a/doc/hash.qbk +++ b/doc/hash.qbk @@ -336,6 +336,8 @@ On Visual C++ versions 6.5 and 7.0, `hash_value` isn't overloaded for built in arrays. __boost_hash, __hash_combine and __hash_range all use a workaround to support built in arrays so this shouldn't be a problem in most cases. +On Visual C++ versions 6.5 and 7.0, function pointers aren't currently supported. + `boost::hash_value(long double)` on GCC on Solaris appears to treat `long double`s as doubles - so the hash function doesn't take into account the full range of values. diff --git a/test/Jamfile b/test/Jamfile index 6725018..aada1dd 100644 --- a/test/Jamfile +++ b/test/Jamfile @@ -24,6 +24,7 @@ rule hash-test ( name ) : [ hash-test hash_number_test ] [ hash-test hash_pointer_test ] + [ hash-test hash_function_pointer_test ] [ hash-test hash_float_test ] [ hash-test hash_string_test ] [ hash-test hash_range_test ] diff --git a/test/Jamfile.v2 b/test/Jamfile.v2 index 7ab939a..1f1446b 100644 --- a/test/Jamfile.v2 +++ b/test/Jamfile.v2 @@ -12,6 +12,7 @@ test-suite functional/hash : [ run hash_number_test.cpp framework ] [ run hash_pointer_test.cpp framework ] + [ run hash_function_pointer_test.cpp framework ] [ run hash_float_test.cpp framework ] [ run hash_string_test.cpp framework ] [ run hash_range_test.cpp framework ] diff --git a/test/hash_function_pointer_test.cpp b/test/hash_function_pointer_test.cpp new file mode 100644 index 0000000..79717d7 --- /dev/null +++ b/test/hash_function_pointer_test.cpp @@ -0,0 +1,54 @@ + +// (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 "./config.hpp" + +#ifdef TEST_STD_INCLUDES +# include +#else +# include +#endif + +#define BOOST_AUTO_TEST_MAIN +#include + +#include +#include +#include + +#include "./compile_time.hpp" + +void void_func1() {} +void void_func2() {} +int int_func1(int) { return 0; } +int int_func2(int) { return 0; } + +BOOST_AUTO_UNIT_TEST(function_pointer_tests) +{ + compile_time_tests((void(**)()) 0); + compile_time_tests((int(**)(int)) 0); + + HASH_NAMESPACE::hash hasher_void; + HASH_NAMESPACE::hash hasher_int; + + BOOST_CHECK(hasher_void(0) == hasher_void(0)); + BOOST_CHECK(hasher_void(&void_func1) == hasher_void(&void_func1)); + BOOST_CHECK(hasher_void(&void_func1) != hasher_void(&void_func2)); + BOOST_CHECK(hasher_void(&void_func1) != hasher_void(0)); + BOOST_CHECK(hasher_int(0) == hasher_int(0)); + BOOST_CHECK(hasher_int(&int_func1) == hasher_int(&int_func1)); + BOOST_CHECK(hasher_int(&int_func1) != hasher_int(&int_func2)); + BOOST_CHECK(hasher_int(&int_func1) != hasher_int(0)); +#if defined(TEST_EXTENSIONS) + BOOST_CHECK(hasher_void(&void_func1) + == HASH_NAMESPACE::hash_value(&void_func1)); + BOOST_CHECK(hasher_int(&int_func1) + == HASH_NAMESPACE::hash_value(&int_func1)); + + // This isn't specified in Peter's proposal: + BOOST_CHECK(hasher_void(0) == 0); +#endif +} diff --git a/test/hash_pointer_test.cpp b/test/hash_pointer_test.cpp index 5511b5b..e24551f 100644 --- a/test/hash_pointer_test.cpp +++ b/test/hash_pointer_test.cpp @@ -43,35 +43,3 @@ BOOST_AUTO_UNIT_TEST(pointer_tests) BOOST_CHECK(x1(0) == 0); #endif } - -void void_func1() {} -void void_func2() {} -int int_func1(int) { return 0; } -int int_func2(int) { return 0; } - -BOOST_AUTO_UNIT_TEST(function_pointer_tests) -{ - compile_time_tests((void(**)()) 0); - compile_time_tests((int(**)(int)) 0); - - HASH_NAMESPACE::hash hasher_void; - HASH_NAMESPACE::hash hasher_int; - - BOOST_CHECK(hasher_void(0) == hasher_void(0)); - BOOST_CHECK(hasher_void(&void_func1) == hasher_void(&void_func1)); - BOOST_CHECK(hasher_void(&void_func1) != hasher_void(&void_func2)); - BOOST_CHECK(hasher_void(&void_func1) != hasher_void(0)); - BOOST_CHECK(hasher_int(0) == hasher_int(0)); - BOOST_CHECK(hasher_int(&int_func1) == hasher_int(&int_func1)); - BOOST_CHECK(hasher_int(&int_func1) != hasher_int(&int_func2)); - BOOST_CHECK(hasher_int(&int_func1) != hasher_int(0)); -#if defined(TEST_EXTENSIONS) - BOOST_CHECK(hasher_void(&void_func1) - == HASH_NAMESPACE::hash_value(&void_func1)); - BOOST_CHECK(hasher_int(&int_func1) - == HASH_NAMESPACE::hash_value(&int_func1)); - - // This isn't specified in Peter's proposal: - BOOST_CHECK(hasher_void(0) == 0); -#endif -}