///////////////////////////////////////////////////////////////////////////// // // Copyright 2021-2023 Peter Dimov // Copyright 2024 Ion Gaztanaga // Distributed under the Boost Software License, Version 1.0. // https://www.boost.org/LICENSE_1_0.txt // // The original C++11 implementation was done by Peter Dimov // The C++03 porting was done by Ion Gaztanaga // // See http://www.boost.org/libs/intrusive for documentation. // ///////////////////////////////////////////////////////////////////////////// #ifndef BOOST_INTRUSIVE_DETAIL_HASH_INTEGRAL_HPP #define BOOST_INTRUSIVE_DETAIL_HASH_INTEGRAL_HPP #include #include "hash_mix.hpp" #include #include #include namespace boost { namespace intrusive { namespace detail { template sizeof(std::size_t)), 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; template struct hash_integral_impl { static std::size_t fn( T v ) { return static_cast( v ); } }; template struct hash_integral_impl { static std::size_t fn( T v ) { typedef typename make_unsigned::type U; if( v >= 0 ) { return hash_integral_impl::fn( static_cast( v ) ); } else { return ~hash_integral_impl::fn( static_cast( ~static_cast( v ) ) ); } } }; template struct hash_integral_impl { static std::size_t fn( T v ) { std::size_t seed = 0; seed = static_cast( v >> 32 ) + (hash_mix)( seed ); seed = static_cast( v & 0xFFFFFFFF ) + (hash_mix)( seed ); return seed; } }; template struct hash_integral_impl { static std::size_t fn( T v ) { std::size_t seed = 0; seed = static_cast( v >> 96 ) + (hash_mix)( seed ); seed = static_cast( v >> 64 ) + (hash_mix)( seed ); seed = static_cast( v >> 32 ) + (hash_mix)( seed ); seed = static_cast( v ) + (hash_mix)( seed ); return seed; } }; template struct hash_integral_impl { static std::size_t fn( T v ) { std::size_t seed = 0; seed = static_cast( v >> 64 ) + (hash_mix)( seed ); seed = static_cast( v ) + (hash_mix)( seed ); return seed; } }; template typename enable_if_c::value, std::size_t>::type hash_value( T v ) { return hash_integral_impl::fn( v ); } } // namespace detail } // namespace intrusive } // namespace boost #endif // #ifndef BOOST_INTRUSIVE_DETAIL_HASH_INTEGRAL_HPP