diff --git a/test/Jamfile.v2 b/test/Jamfile.v2 index f0af2cf..4e1d8b4 100644 --- a/test/Jamfile.v2 +++ b/test/Jamfile.v2 @@ -63,3 +63,5 @@ run detail_is_unordered_range_test.cpp ; run hash_forward_list_test.cpp ; run quick.cpp ; + +run hash_number_test2.cpp ; diff --git a/test/hash_number_test2.cpp b/test/hash_number_test2.cpp new file mode 100644 index 0000000..2ae2326 --- /dev/null +++ b/test/hash_number_test2.cpp @@ -0,0 +1,89 @@ +// Copyright 2005-2009 Daniel James. +// Copyright 2021 Peter Dimov. +// Distributed under the Boost Software License, Version 1.0. +// https://www.boost.org/LICENSE_1_0.txt + +#include +#include +#include +#include + +#if defined(BOOST_MSVC) +#pragma warning(disable:4244) // conversion from int to float +#endif + +#if defined(__GNUC__) || defined(__clang__) +#pragma GCC diagnostic ignored "-Wconversion" +#endif + +// This test checks for collisions in a small range of numbers + +template +void collision_test_() +{ + std::set hashes; + + for( int i = -128; i <= 127; ++i ) + { + hashes.insert( boost::hash()( i * M ) ); + } + + BOOST_TEST_EQ( hashes.size(), 256 ); +} + +template +void collision_test() +{ + collision_test_(); + collision_test_(); + collision_test_(); + collision_test_(); + collision_test_(); + collision_test_(); + collision_test_(); + collision_test_(); + collision_test_(); + collision_test_(); + collision_test_(); + collision_test_(); +} + +#define TEST(type) std::cerr << "Testing: " #type " (" << boost::core::type_name() << ")\n"; collision_test(); + +int main() +{ +#ifndef BOOST_NO_INTRINSIC_WCHAR_T + TEST(wchar_t) +#endif +#ifndef BOOST_NO_CXX11_CHAR16_T + TEST(char16_t) +#endif +#ifndef BOOST_NO_CXX11_CHAR32_T + TEST(char32_t) +#endif + TEST(short) + TEST(unsigned short) + TEST(int) + TEST(unsigned int) + TEST(long) + TEST(unsigned long) + +#if !defined(BOOST_NO_LONG_LONG) + TEST(boost::long_long_type) + TEST(boost::ulong_long_type) +#endif + +#if defined(BOOST_HAS_INT128) + TEST(boost::int128_type) + TEST(boost::uint128_type) +#endif + + TEST(float) + TEST(double) + TEST(long double) + + TEST(std::size_t) + TEST(std::ptrdiff_t) + + return boost::report_errors(); +}