From 1c27af1e2e2a503e0a9631f14178f863b994a031 Mon Sep 17 00:00:00 2001 From: Peter Dimov Date: Sun, 17 Oct 2021 23:54:39 +0300 Subject: [PATCH] Add hash_reference_values.cpp --- test/Jamfile.v2 | 2 + test/hash_reference_values.cpp | 331 +++++++++++++++++++++++++++++++++ 2 files changed, 333 insertions(+) create mode 100644 test/hash_reference_values.cpp diff --git a/test/Jamfile.v2 b/test/Jamfile.v2 index 3acc39a..c46e8ff 100644 --- a/test/Jamfile.v2 +++ b/test/Jamfile.v2 @@ -84,3 +84,5 @@ test-suite container_hash/hash_no_generic_float explicit container_hash/hash_no_generic_float ; build-project ../examples ; + +run hash_reference_values.cpp ; diff --git a/test/hash_reference_values.cpp b/test/hash_reference_values.cpp new file mode 100644 index 0000000..1dba6a2 --- /dev/null +++ b/test/hash_reference_values.cpp @@ -0,0 +1,331 @@ +// 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 +#include +#include +#include +#include +#include + +// This test checks whether hash values have changed + +template std::size_t hv( T const& t ) +{ + return boost::hash()( t ); +} + +int main() +{ + // char + BOOST_TEST_EQ( hv('\x00'), 0 ); + BOOST_TEST_EQ( hv('A'), 'A' ); + BOOST_TEST_EQ( hv('\x7F'), 0x7F ); + + // signed char + BOOST_TEST_EQ( hv((signed char)0), 0 ); + BOOST_TEST_EQ( hv((signed char)+1), +1 ); + BOOST_TEST_EQ( hv((signed char)-1), (std::size_t)-1 ); + BOOST_TEST_EQ( hv((signed char)+127), 127 ); + BOOST_TEST_EQ( hv((signed char)-128), (std::size_t)-128 ); + + // unsigned char + BOOST_TEST_EQ( hv((unsigned char)0), 0 ); + BOOST_TEST_EQ( hv((unsigned char)1), 1 ); + BOOST_TEST_EQ( hv((unsigned char)255), 255 ); + + // short + BOOST_TEST_EQ( hv((short)0), 0 ); + BOOST_TEST_EQ( hv((short)+1), 1 ); + BOOST_TEST_EQ( hv((short)-1), (std::size_t)-1 ); + BOOST_TEST_EQ( hv((short)+32767), 32767 ); + BOOST_TEST_EQ( hv((short)-32768), (std::size_t)-32768 ); + + // unsigned short + BOOST_TEST_EQ( hv((unsigned short)0), 0 ); + BOOST_TEST_EQ( hv((unsigned short)1), 1 ); + BOOST_TEST_EQ( hv((unsigned short)65535), 65535 ); + + // int + BOOST_TEST_EQ( hv(0), 0 ); + BOOST_TEST_EQ( hv(+1), 1 ); + BOOST_TEST_EQ( hv(-1), (std::size_t)-1 ); + BOOST_TEST_EQ( hv(+32767), 32767 ); + BOOST_TEST_EQ( hv(-32768), (std::size_t)-32768 ); + + // unsigned int + BOOST_TEST_EQ( hv((unsigned)0), 0 ); + BOOST_TEST_EQ( hv((unsigned)1), 1 ); + BOOST_TEST_EQ( hv((unsigned)65535), 65535 ); + BOOST_TEST_EQ( hv((unsigned)-1), (std::size_t)(unsigned)-1 ); + + // long + BOOST_TEST_EQ( hv(0L), 0 ); + BOOST_TEST_EQ( hv(+1L), 1 ); + BOOST_TEST_EQ( hv(-1L), (std::size_t)-1 ); + BOOST_TEST_EQ( hv(+32767L), 32767 ); + BOOST_TEST_EQ( hv(-32768L), (std::size_t)-32768 ); + + // unsigned long + BOOST_TEST_EQ( hv(0UL), 0 ); + BOOST_TEST_EQ( hv(1UL), 1 ); + BOOST_TEST_EQ( hv(65535UL), 65535 ); + BOOST_TEST_EQ( hv((unsigned long)-1), (std::size_t)(unsigned long)-1 ); + + // long long + BOOST_TEST_EQ( hv(0LL), 0 ); + BOOST_TEST_EQ( hv(+1LL), 1 ); + BOOST_TEST_EQ( hv(-1LL), (std::size_t)-1 ); + BOOST_TEST_EQ( hv(+32767LL), 32767 ); + BOOST_TEST_EQ( hv(-32768LL), (std::size_t)-32768 ); + + // unsigned long long + BOOST_TEST_EQ( hv(0ULL), 0 ); + BOOST_TEST_EQ( hv(1ULL), 1 ); + BOOST_TEST_EQ( hv(65535ULL), 65535 ); +#if SIZE_MAX == 4294967295U + BOOST_TEST_EQ( hv((unsigned long long)-1), 3221225537U ); +#else + BOOST_TEST_EQ( hv((unsigned long long)-1), (std::size_t)-1 ); +#endif + +#if defined(BOOST_HAS_INT128) + + typedef boost::int128_type int128; + + BOOST_TEST_EQ( hv((int128)0), 0 ); + BOOST_TEST_EQ( hv((int128)1), 1 ); + BOOST_TEST_EQ( hv((int128)-1), (std::size_t)-1 ); + BOOST_TEST_EQ( hv((int128)+32767), 32767 ); + BOOST_TEST_EQ( hv((int128)-32768), (std::size_t)-32768 ); + + typedef boost::uint128_type uint128; + + BOOST_TEST_EQ( hv((uint128)0), 0 ); + BOOST_TEST_EQ( hv((uint128)1), 1 ); + BOOST_TEST_EQ( hv((uint128)65535), 65535 ); + BOOST_TEST_EQ( hv((uint128)-1), 13835058055282163777ULL ); + +#endif + + // float + BOOST_TEST_EQ( hv(0.0f), 0 ); + BOOST_TEST_EQ( hv(-0.0f), 0 ); + BOOST_TEST_EQ( hv(1.0f), 1065353216U ); + BOOST_TEST_EQ( hv(-1.0f), 3212836864U ); + BOOST_TEST_EQ( hv(3.14f), 1078523331U ); + BOOST_TEST_EQ( hv(-3.14f), 3226006979U ); + BOOST_TEST_EQ( hv(1e-38f), 7136238U ); + BOOST_TEST_EQ( hv(-1e-38f), 2154619886U ); + BOOST_TEST_EQ( hv(1e+38f), 2123789977U ); + BOOST_TEST_EQ( hv(-1e+38f), 4271273625U ); + BOOST_TEST_EQ( hv(std::numeric_limits::infinity()), 2139095040U ); + BOOST_TEST_EQ( hv(-std::numeric_limits::infinity()), 4286578688U ); + + // double + BOOST_TEST_EQ( hv(0.0), 0 ); + BOOST_TEST_EQ( hv(-0.0), 0 ); + +#if SIZE_MAX == 4294967295U + + BOOST_TEST_EQ( hv(1.0), 1072693248U ); + BOOST_TEST_EQ( hv(-1.0), 3220176896U ); + BOOST_TEST_EQ( hv(3.14), 2660156064U ); + BOOST_TEST_EQ( hv(-3.14), 512672416U ); + BOOST_TEST_EQ( hv(1e-308), 1553872728U ); + BOOST_TEST_EQ( hv(-1e-308), 3701356376U ); + BOOST_TEST_EQ( hv(1e+308), 2577739707U ); + BOOST_TEST_EQ( hv(-1e+308), 430256059U ); + BOOST_TEST_EQ( hv(std::numeric_limits::infinity()), 2146435072U ); + BOOST_TEST_EQ( hv(-std::numeric_limits::infinity()), 4293918720U ); + +#else + + BOOST_TEST_EQ( hv(1.0), 4607182418800017408ULL ); + BOOST_TEST_EQ( hv(-1.0), 13830554455654793216ULL ); + BOOST_TEST_EQ( hv(3.14), 4614253070214989087ULL ); + BOOST_TEST_EQ( hv(-3.14), 13837625107069764895ULL ); + BOOST_TEST_EQ( hv(1e-308), 2024022533073106ULL ); + BOOST_TEST_EQ( hv(-1e-308), 9225396059387848914ULL ); + BOOST_TEST_EQ( hv(1e+308), 9214871658872686752ULL ); + BOOST_TEST_EQ( hv(-1e+308), 18438243695727462560ULL ); + BOOST_TEST_EQ( hv(std::numeric_limits::infinity()), 9218868437227405312ULL ); + BOOST_TEST_EQ( hv(-std::numeric_limits::infinity()), 18442240474082181120ULL ); + +#endif + + // long double + BOOST_TEST_EQ( hv(0.0L), 0 ); + BOOST_TEST_EQ( hv(-0.0L), 0 ); + +#if SIZE_MAX == 4294967295U + + BOOST_TEST_EQ( hv(1.0L), 1072693248U ); + BOOST_TEST_EQ( hv(-1.0L), 3220176896U ); + BOOST_TEST_EQ( hv(3.14L), 2660156064U ); + BOOST_TEST_EQ( hv(-3.14L), 512672416U ); + BOOST_TEST_EQ( hv(std::numeric_limits::infinity()), 2146435072U ); + BOOST_TEST_EQ( hv(-std::numeric_limits::infinity()), 4293918720U ); + +#else + + BOOST_TEST_EQ( hv(1.0L), 4607182418800017408ULL ); + BOOST_TEST_EQ( hv(-1.0L), 13830554455654793216ULL ); + BOOST_TEST_EQ( hv(3.14L), 4614253070214989087ULL ); + BOOST_TEST_EQ( hv(-3.14L), 13837625107069764895ULL ); + BOOST_TEST_EQ( hv(std::numeric_limits::infinity()), 9218868437227405312ULL ); + BOOST_TEST_EQ( hv(-std::numeric_limits::infinity()), 18442240474082181120ULL ); + +#endif + + // C array + { + int a1[] = { 0 }; + int a2[] = { 0, 0 }; + int a3[] = { 0, 0, 0 }; + +#if SIZE_MAX == 4294967295U + + BOOST_TEST_EQ( hv(a1), 3864292196U ); + BOOST_TEST_EQ( hv(a2), 2842917718U ); + BOOST_TEST_EQ( hv(a3), 325752138U ); + +#else + + BOOST_TEST_EQ( hv(a1), 3864292196ULL ); + BOOST_TEST_EQ( hv(a2), 14642545639667855512ULL ); + BOOST_TEST_EQ( hv(a3), 17867750819888810972ULL ); + +#endif + } + + // string +#if SIZE_MAX == 4294967295U + + BOOST_TEST_EQ( hv(std::string()), 0 ); + BOOST_TEST_EQ( hv(std::string("abc")), 1849538372U ); + BOOST_TEST_EQ( hv(std::string("\0", 1)), 3864292196U ); + BOOST_TEST_EQ( hv(std::string("\0\0", 2)), 2842917718U ); + BOOST_TEST_EQ( hv(std::string("\0\0\0", 3)), 325752138U ); + +#else + + BOOST_TEST_EQ( hv(std::string()), 0 ); + BOOST_TEST_EQ( hv(std::string("abc")), 6420922261882292859ULL ); + BOOST_TEST_EQ( hv(std::string("\0", 1)), 3864292196ULL ); + BOOST_TEST_EQ( hv(std::string("\0\0", 2)), 14642545639667855512ULL ); + BOOST_TEST_EQ( hv(std::string("\0\0\0", 3)), 17867750819888810972ULL ); + +#endif + + // pointer + BOOST_TEST_EQ( hv((void*)0), 0 ); + BOOST_TEST_EQ( hv((void*)0x200014A0), 603985716U ); + + // pair +#if SIZE_MAX == 4294967295U + + BOOST_TEST_EQ( hv(std::make_pair(0, 0)), 2842917718U ); + BOOST_TEST_EQ( hv(std::make_pair(1, 2)), 2507434894U ); + BOOST_TEST_EQ( hv(std::make_pair(-1, -2)), 1874100199 ); + +#else + + BOOST_TEST_EQ( hv(std::make_pair(0, 0)), 14642545639667855512ULL ); + BOOST_TEST_EQ( hv(std::make_pair(1, 2)), 3370697991563800380ULL ); + BOOST_TEST_EQ( hv(std::make_pair(-1, -2)), 4139767141999124554ULL ); + +#endif + + // vector +#if SIZE_MAX == 4294967295U + + BOOST_TEST_EQ( hv(std::vector(0)), 0 ); + BOOST_TEST_EQ( hv(std::vector(1)), 3864292196U ); + BOOST_TEST_EQ( hv(std::vector(2)), 2842917718U ); + BOOST_TEST_EQ( hv(std::vector(3)), 325752138U ); + +#else + + BOOST_TEST_EQ( hv(std::vector(0)), 0 ); + BOOST_TEST_EQ( hv(std::vector(1)), 3864292196ULL ); + BOOST_TEST_EQ( hv(std::vector(2)), 14642545639667855512ULL ); + BOOST_TEST_EQ( hv(std::vector(3)), 17867750819888810972ULL ); + +#endif + + // vector +#if SIZE_MAX == 4294967295U + + BOOST_TEST_EQ( hv(std::vector(0)), 0 ); + BOOST_TEST_EQ( hv(std::vector(1)), 3864292196U ); + BOOST_TEST_EQ( hv(std::vector(2)), 2842917718U ); + BOOST_TEST_EQ( hv(std::vector(3)), 325752138U ); + +#else + + BOOST_TEST_EQ( hv(std::vector(0)), 0 ); + BOOST_TEST_EQ( hv(std::vector(1)), 3864292196ULL ); + BOOST_TEST_EQ( hv(std::vector(2)), 14642545639667855512ULL ); + BOOST_TEST_EQ( hv(std::vector(3)), 17867750819888810972ULL ); + +#endif + + // vector> +#if SIZE_MAX == 4294967295U + + BOOST_TEST_EQ( hv(std::vector >(0)), 0 ); + BOOST_TEST_EQ( hv(std::vector >(1)), 3864292196U ); + BOOST_TEST_EQ( hv(std::vector >(2)), 2842917718U ); + BOOST_TEST_EQ( hv(std::vector >(3)), 325752138U ); + +#else + + BOOST_TEST_EQ( hv(std::vector >(0)), 0 ); + BOOST_TEST_EQ( hv(std::vector >(1)), 3864292196ULL ); + BOOST_TEST_EQ( hv(std::vector >(2)), 14642545639667855512ULL ); + BOOST_TEST_EQ( hv(std::vector >(3)), 17867750819888810972ULL ); + +#endif + + // list +#if SIZE_MAX == 4294967295U + + BOOST_TEST_EQ( hv(std::list(0)), 0 ); + BOOST_TEST_EQ( hv(std::list(1)), 3864292196U ); + BOOST_TEST_EQ( hv(std::list(2)), 2842917718U ); + BOOST_TEST_EQ( hv(std::list(3)), 325752138U ); + +#else + + BOOST_TEST_EQ( hv(std::list(0)), 0 ); + BOOST_TEST_EQ( hv(std::list(1)), 3864292196ULL ); + BOOST_TEST_EQ( hv(std::list(2)), 14642545639667855512ULL ); + BOOST_TEST_EQ( hv(std::list(3)), 17867750819888810972ULL ); + +#endif + + // list +#if SIZE_MAX == 4294967295U + + BOOST_TEST_EQ( hv(std::list(0)), 0 ); + BOOST_TEST_EQ( hv(std::list(1)), 3864292196U ); + BOOST_TEST_EQ( hv(std::list(2)), 2842917718U ); + BOOST_TEST_EQ( hv(std::list(3)), 325752138U ); + +#else + + BOOST_TEST_EQ( hv(std::list(0)), 0 ); + BOOST_TEST_EQ( hv(std::list(1)), 3864292196ULL ); + BOOST_TEST_EQ( hv(std::list(2)), 14642545639667855512ULL ); + BOOST_TEST_EQ( hv(std::list(3)), 17867750819888810972ULL ); + +#endif + + return boost::report_errors(); +}