From 9d09674f08910891db1aafb3d965894f1eedf000 Mon Sep 17 00:00:00 2001 From: Peter Dimov Date: Thu, 12 Oct 2023 14:24:00 +0300 Subject: [PATCH] Work around libstdc++ not considering __int128 integral --- .../container_hash/detail/hash_integral.hpp | 50 +++++++++++++++++-- 1 file changed, 47 insertions(+), 3 deletions(-) diff --git a/include/boost/container_hash/detail/hash_integral.hpp b/include/boost/container_hash/detail/hash_integral.hpp index ecac3c4..c75c616 100644 --- a/include/boost/container_hash/detail/hash_integral.hpp +++ b/include/boost/container_hash/detail/hash_integral.hpp @@ -15,9 +15,53 @@ namespace boost namespace hash_detail { +// libstdc++ doesn't provide support for __int128 in the standard traits + +template struct is_integral: public std::is_integral +{ +}; + +template struct is_unsigned: public std::is_unsigned +{ +}; + +template struct make_unsigned: public std::make_unsigned +{ +}; + +#if defined(__SIZEOF_INT128__) + +template<> struct is_integral<__int128_t>: public std::true_type +{ +}; + +template<> struct is_integral<__uint128_t>: public std::true_type +{ +}; + +template<> struct is_unsigned<__int128_t>: public std::false_type +{ +}; + +template<> struct is_unsigned<__uint128_t>: public std::true_type +{ +}; + +template<> struct make_unsigned<__int128_t> +{ + typedef __uint128_t type; +}; + +template<> struct make_unsigned<__uint128_t> +{ + typedef __uint128_t type; +}; + +#endif + template sizeof(std::size_t)), - bool is_unsigned = std::is_unsigned::value, + bool is_unsigned = is_unsigned::value, std::size_t size_t_bits = sizeof(std::size_t) * CHAR_BIT, std::size_t type_bits = sizeof(T) * CHAR_BIT> struct hash_integral_impl; @@ -34,7 +78,7 @@ template struct hash_in { static std::size_t fn( T v ) { - typedef typename std::make_unsigned::type U; + typedef typename make_unsigned::type U; if( v >= 0 ) { @@ -91,7 +135,7 @@ template struct hash_integral_impl } // namespace hash_detail template -typename std::enable_if::value, std::size_t>::type +typename std::enable_if::value, std::size_t>::type hash_value( T v ) { return hash_detail::hash_integral_impl::fn( v );