diff --git a/test/Jamfile.v2 b/test/Jamfile.v2 index 4e1d8b4..667fbfe 100644 --- a/test/Jamfile.v2 +++ b/test/Jamfile.v2 @@ -65,3 +65,4 @@ run hash_forward_list_test.cpp ; run quick.cpp ; run hash_number_test2.cpp ; +run hash_integral_test.cpp ; diff --git a/test/hash_integral_test.cpp b/test/hash_integral_test.cpp new file mode 100644 index 0000000..dac6324 --- /dev/null +++ b/test/hash_integral_test.cpp @@ -0,0 +1,75 @@ +// 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 +#include + +#if defined(BOOST_MSVC) +#pragma warning(disable: 4127) // conditional expression is constant +#endif + +// This test checks that small numbers hash to themselves even if +// their type is wider than size_t + +template +void identity_test() +{ + if( boost::is_signed::value ) + { + for( int i = -128; i <= 127; ++i ) + { + BOOST_TEST_EQ( boost::hash()( static_cast( i ) ), static_cast( i ) ); + } + } + else + { + for( int i = 0; i <= 255; ++i ) + { + BOOST_TEST_EQ( boost::hash()( static_cast( i ) ), static_cast( i ) ); + } + } +} + +#define TEST(type) std::cerr << "Testing: " #type " (" << boost::core::type_name() << ")\n"; identity_test(); + +int main() +{ + TEST(char) + TEST(signed char) + TEST(unsigned char) +#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(std::size_t) + TEST(std::ptrdiff_t) + + return boost::report_errors(); +}