diff options
Diffstat (limited to 'cutl/details/boost/functional/hash/hash.hpp')
-rw-r--r-- | cutl/details/boost/functional/hash/hash.hpp | 200 |
1 files changed, 97 insertions, 103 deletions
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 <cutl/details/boost/functional/hash/detail/hash_float.hpp> #include <string> #include <cutl/details/boost/limits.hpp> - -#if defined(BOOST_HASH_NO_IMPLICIT_CASTS) -#include <cutl/details/boost/static_assert.hpp> -#endif +#include <cutl/details/boost/type_traits/is_enum.hpp> +#include <cutl/details/boost/type_traits/is_integral.hpp> +#include <cutl/details/boost/utility/enable_if.hpp> #if defined(BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION) #include <cutl/details/boost/type_traits/is_pointer.hpp> #endif -#if !defined(BOOST_NO_0X_HDR_TYPEINDEX) +#if !defined(BOOST_NO_CXX11_HDR_TYPEINDEX) #include <typeindex> #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 <typename T> - 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 <typename T> struct basic_numbers {}; + template <typename T> struct long_numbers; + template <typename T> struct ulong_numbers; + template <typename T> struct float_numbers {}; + + template <> struct basic_numbers<bool> : + cutl_details_boost::hash_detail::enable_hash_value {}; + template <> struct basic_numbers<char> : + cutl_details_boost::hash_detail::enable_hash_value {}; + template <> struct basic_numbers<unsigned char> : + cutl_details_boost::hash_detail::enable_hash_value {}; + template <> struct basic_numbers<signed char> : + cutl_details_boost::hash_detail::enable_hash_value {}; + template <> struct basic_numbers<short> : + cutl_details_boost::hash_detail::enable_hash_value {}; + template <> struct basic_numbers<unsigned short> : + cutl_details_boost::hash_detail::enable_hash_value {}; + template <> struct basic_numbers<int> : + cutl_details_boost::hash_detail::enable_hash_value {}; + template <> struct basic_numbers<unsigned int> : + cutl_details_boost::hash_detail::enable_hash_value {}; + template <> struct basic_numbers<long> : + cutl_details_boost::hash_detail::enable_hash_value {}; + template <> struct basic_numbers<unsigned long> : + cutl_details_boost::hash_detail::enable_hash_value {}; +#if !defined(BOOST_NO_INTRINSIC_WCHAR_T) + template <> struct basic_numbers<wchar_t> : + 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 <typename T> struct long_numbers2 {}; + template <typename T> struct ulong_numbers2 {}; + template <typename T> struct long_numbers : long_numbers2<T> {}; + template <typename T> struct ulong_numbers : ulong_numbers2<T> {}; -#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::long_long_type> : + cutl_details_boost::hash_detail::enable_hash_value {}; + template <> struct ulong_numbers<cutl_details_boost::ulong_long_type> : + cutl_details_boost::hash_detail::enable_hash_value {}; #endif +#if defined(BOOST_HAS_INT128) + template <> struct long_numbers2<cutl_details_boost::int128_type> : + cutl_details_boost::hash_detail::enable_hash_value {}; + template <> struct ulong_numbers2<cutl_details_boost::uint128_type> : + cutl_details_boost::hash_detail::enable_hash_value {}; +#endif + + template <> struct float_numbers<float> : + cutl_details_boost::hash_detail::enable_hash_value {}; + template <> struct float_numbers<double> : + cutl_details_boost::hash_detail::enable_hash_value {}; + template <> struct float_numbers<long double> : + cutl_details_boost::hash_detail::enable_hash_value {}; + } + + template <typename T> + typename cutl_details_boost::hash_detail::basic_numbers<T>::type hash_value(T); + template <typename T> + typename cutl_details_boost::hash_detail::long_numbers<T>::type hash_value(T); + template <typename T> + typename cutl_details_boost::hash_detail::ulong_numbers<T>::type hash_value(T); + + template <typename T> + typename cutl_details_boost::enable_if<cutl_details_boost::is_enum<T>, std::size_t>::type + hash_value(T); + #if !BOOST_WORKAROUND(__DMC__, <= 0x848) template <class T> 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 <class Ch, class A> std::size_t hash_value( std::basic_string<Ch, std::BOOST_HASH_CHAR_TRAITS<Ch>, A> const&); -#if !defined(BOOST_NO_0X_HDR_TYPEINDEX) + template <typename T> + typename cutl_details_boost::hash_detail::float_numbers<T>::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<std::size_t>(v); - } - - inline std::size_t hash_value(char v) - { - return static_cast<std::size_t>(v); - } - - inline std::size_t hash_value(unsigned char v) - { - return static_cast<std::size_t>(v); - } - - inline std::size_t hash_value(signed char v) - { - return static_cast<std::size_t>(v); - } - - inline std::size_t hash_value(short v) - { - return static_cast<std::size_t>(v); - } - - inline std::size_t hash_value(unsigned short v) - { - return static_cast<std::size_t>(v); - } - - inline std::size_t hash_value(int v) - { - return static_cast<std::size_t>(v); - } - - inline std::size_t hash_value(unsigned int v) + template <typename T> + typename cutl_details_boost::hash_detail::basic_numbers<T>::type hash_value(T v) { return static_cast<std::size_t>(v); } - inline std::size_t hash_value(long v) + template <typename T> + typename cutl_details_boost::hash_detail::long_numbers<T>::type hash_value(T v) { - return static_cast<std::size_t>(v); + return hash_detail::hash_value_signed(v); } - inline std::size_t hash_value(unsigned long v) + template <typename T> + typename cutl_details_boost::hash_detail::ulong_numbers<T>::type hash_value(T v) { - return static_cast<std::size_t>(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 T> + typename cutl_details_boost::enable_if<cutl_details_boost::is_enum<T>, std::size_t>::type + hash_value(T v) { return static_cast<std::size_t>(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 T> + typename cutl_details_boost::hash_detail::float_numbers<T>::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 |