aboutsummaryrefslogtreecommitdiff
path: root/cutl/details/boost/functional/hash/hash.hpp
diff options
context:
space:
mode:
Diffstat (limited to 'cutl/details/boost/functional/hash/hash.hpp')
-rw-r--r--cutl/details/boost/functional/hash/hash.hpp200
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