From ed6115361006240e3c7b02295599e4534cc55a13 Mon Sep 17 00:00:00 2001 From: Boris Kolpackov Date: Sat, 19 Oct 2013 08:57:20 +0200 Subject: Update internal Boost subset to 1.54.0 --- cutl/details/boost/functional/hash/hash.hpp | 200 ++++++++++++++-------------- 1 file changed, 97 insertions(+), 103 deletions(-) (limited to 'cutl/details/boost/functional/hash/hash.hpp') diff --git a/cutl/details/boost/functional/hash/hash.hpp b/cutl/details/boost/functional/hash/hash.hpp index 3ea7bb5..cb4a869 100644 --- a/cutl/details/boost/functional/hash/hash.hpp +++ b/cutl/details/boost/functional/hash/hash.hpp @@ -15,16 +15,15 @@ #include #include #include - -#if defined(BOOST_HASH_NO_IMPLICIT_CASTS) -#include -#endif +#include +#include +#include #if defined(BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION) #include #endif -#if !defined(BOOST_NO_0X_HDR_TYPEINDEX) +#if !defined(BOOST_NO_CXX11_HDR_TYPEINDEX) #include #endif @@ -37,38 +36,82 @@ namespace cutl_details_boost { -#if defined(BOOST_HASH_NO_IMPLICIT_CASTS) - - // If you get a static assertion here, it's because hash_value - // isn't declared for your type. - template - std::size_t hash_value(T const&) { - BOOST_STATIC_ASSERT((T*) 0 && false); - return 0; - } + namespace hash_detail + { + struct enable_hash_value { typedef std::size_t type; }; + + template struct basic_numbers {}; + template struct long_numbers; + template struct ulong_numbers; + template struct float_numbers {}; + + template <> struct basic_numbers : + cutl_details_boost::hash_detail::enable_hash_value {}; + template <> struct basic_numbers : + cutl_details_boost::hash_detail::enable_hash_value {}; + template <> struct basic_numbers : + cutl_details_boost::hash_detail::enable_hash_value {}; + template <> struct basic_numbers : + cutl_details_boost::hash_detail::enable_hash_value {}; + template <> struct basic_numbers : + cutl_details_boost::hash_detail::enable_hash_value {}; + template <> struct basic_numbers : + cutl_details_boost::hash_detail::enable_hash_value {}; + template <> struct basic_numbers : + cutl_details_boost::hash_detail::enable_hash_value {}; + template <> struct basic_numbers : + cutl_details_boost::hash_detail::enable_hash_value {}; + template <> struct basic_numbers : + cutl_details_boost::hash_detail::enable_hash_value {}; + template <> struct basic_numbers : + cutl_details_boost::hash_detail::enable_hash_value {}; +#if !defined(BOOST_NO_INTRINSIC_WCHAR_T) + template <> struct basic_numbers : + cutl_details_boost::hash_detail::enable_hash_value {}; #endif - std::size_t hash_value(bool); - std::size_t hash_value(char); - std::size_t hash_value(unsigned char); - std::size_t hash_value(signed char); - std::size_t hash_value(short); - std::size_t hash_value(unsigned short); - std::size_t hash_value(int); - std::size_t hash_value(unsigned int); - std::size_t hash_value(long); - std::size_t hash_value(unsigned long); + // long_numbers is defined like this to allow for separate + // specialization for long_long and int128_type, in case + // they conflict. + template struct long_numbers2 {}; + template struct ulong_numbers2 {}; + template struct long_numbers : long_numbers2 {}; + template struct ulong_numbers : ulong_numbers2 {}; -#if !defined(BOOST_NO_INTRINSIC_WCHAR_T) - std::size_t hash_value(wchar_t); -#endif - #if !defined(BOOST_NO_LONG_LONG) - std::size_t hash_value(cutl_details_boost::long_long_type); - std::size_t hash_value(cutl_details_boost::ulong_long_type); + template <> struct long_numbers : + cutl_details_boost::hash_detail::enable_hash_value {}; + template <> struct ulong_numbers : + cutl_details_boost::hash_detail::enable_hash_value {}; #endif +#if defined(BOOST_HAS_INT128) + template <> struct long_numbers2 : + cutl_details_boost::hash_detail::enable_hash_value {}; + template <> struct ulong_numbers2 : + cutl_details_boost::hash_detail::enable_hash_value {}; +#endif + + template <> struct float_numbers : + cutl_details_boost::hash_detail::enable_hash_value {}; + template <> struct float_numbers : + cutl_details_boost::hash_detail::enable_hash_value {}; + template <> struct float_numbers : + cutl_details_boost::hash_detail::enable_hash_value {}; + } + + template + typename cutl_details_boost::hash_detail::basic_numbers::type hash_value(T); + template + typename cutl_details_boost::hash_detail::long_numbers::type hash_value(T); + template + typename cutl_details_boost::hash_detail::ulong_numbers::type hash_value(T); + + template + typename cutl_details_boost::enable_if, std::size_t>::type + hash_value(T); + #if !BOOST_WORKAROUND(__DMC__, <= 0x848) template std::size_t hash_value(T* const&); #else @@ -83,15 +126,14 @@ namespace cutl_details_boost std::size_t hash_value(T (&x)[N]); #endif - std::size_t hash_value(float v); - std::size_t hash_value(double v); - std::size_t hash_value(long double v); - template std::size_t hash_value( std::basic_string, A> const&); -#if !defined(BOOST_NO_0X_HDR_TYPEINDEX) + template + typename cutl_details_boost::hash_detail::float_numbers::type hash_value(T); + +#if !defined(BOOST_NO_CXX11_HDR_TYPEINDEX) std::size_t hash_value(std::type_index); #endif @@ -141,74 +183,30 @@ namespace cutl_details_boost } } - inline std::size_t hash_value(bool v) - { - return static_cast(v); - } - - inline std::size_t hash_value(char v) - { - return static_cast(v); - } - - inline std::size_t hash_value(unsigned char v) - { - return static_cast(v); - } - - inline std::size_t hash_value(signed char v) - { - return static_cast(v); - } - - inline std::size_t hash_value(short v) - { - return static_cast(v); - } - - inline std::size_t hash_value(unsigned short v) - { - return static_cast(v); - } - - inline std::size_t hash_value(int v) - { - return static_cast(v); - } - - inline std::size_t hash_value(unsigned int v) + template + typename cutl_details_boost::hash_detail::basic_numbers::type hash_value(T v) { return static_cast(v); } - inline std::size_t hash_value(long v) + template + typename cutl_details_boost::hash_detail::long_numbers::type hash_value(T v) { - return static_cast(v); + return hash_detail::hash_value_signed(v); } - inline std::size_t hash_value(unsigned long v) + template + typename cutl_details_boost::hash_detail::ulong_numbers::type hash_value(T v) { - return static_cast(v); + return hash_detail::hash_value_unsigned(v); } -#if !defined(BOOST_NO_INTRINSIC_WCHAR_T) - inline std::size_t hash_value(wchar_t v) + template + typename cutl_details_boost::enable_if, std::size_t>::type + hash_value(T v) { return static_cast(v); } -#endif - -#if !defined(BOOST_NO_LONG_LONG) - inline std::size_t hash_value(cutl_details_boost::long_long_type v) - { - return hash_detail::hash_value_signed(v); - } - - inline std::size_t hash_value(cutl_details_boost::ulong_long_type v) - { - return hash_detail::hash_value_unsigned(v); - } -#endif // Implementation by Alberto Barbati and Dave Harris. #if !BOOST_WORKAROUND(__DMC__, <= 0x848) @@ -324,22 +322,13 @@ namespace cutl_details_boost return hash_range(v.begin(), v.end()); } - inline std::size_t hash_value(float v) - { - return cutl_details_boost::hash_detail::float_hash_value(v); - } - - inline std::size_t hash_value(double v) - { - return cutl_details_boost::hash_detail::float_hash_value(v); - } - - inline std::size_t hash_value(long double v) + template + typename cutl_details_boost::hash_detail::float_numbers::type hash_value(T v) { return cutl_details_boost::hash_detail::float_hash_value(v); } -#if !defined(BOOST_NO_0X_HDR_TYPEINDEX) +#if !defined(BOOST_NO_CXX11_HDR_TYPEINDEX) inline std::size_t hash_value(std::type_index v) { return v.hash_code(); @@ -450,7 +439,12 @@ namespace cutl_details_boost BOOST_HASH_SPECIALIZE(cutl_details_boost::ulong_long_type) #endif -#if !defined(BOOST_NO_0X_HDR_TYPEINDEX) +#if defined(BOOST_HAS_INT128) + BOOST_HASH_SPECIALIZE(cutl_details_boost::int128_type) + BOOST_HASH_SPECIALIZE(cutl_details_boost::uint128_type) +#endif + +#if !defined(BOOST_NO_CXX11_HDR_TYPEINDEX) BOOST_HASH_SPECIALIZE(std::type_index) #endif -- cgit v1.1