mirror of
https://github.com/bolero-MURAKAMI/Sprout.git
synced 2025-07-12 14:54:10 +00:00
fix complex, rational
This commit is contained in:
parent
cdb10c0fbe
commit
6b3f7ad894
19 changed files with 1568 additions and 1360 deletions
|
@ -10,27 +10,76 @@
|
|||
#include <sprout/type_traits/enabler_if.hpp>
|
||||
|
||||
namespace sprout {
|
||||
namespace hash_detail {
|
||||
struct enable_hash_value {
|
||||
public:
|
||||
typedef std::size_t type;
|
||||
};
|
||||
|
||||
template<typename T, typename Enable = void>
|
||||
struct basic_numbers {};
|
||||
template<typename T>
|
||||
struct basic_numbers<
|
||||
T,
|
||||
typename std::enable_if<
|
||||
(std::is_integral<T>::value && sizeof(T) <= sizeof(std::size_t))
|
||||
>::type
|
||||
>
|
||||
: public sprout::hash_detail::enable_hash_value
|
||||
{};
|
||||
|
||||
template<typename T, typename Enable = void>
|
||||
struct long_numbers {};
|
||||
template<typename T>
|
||||
struct long_numbers<
|
||||
T,
|
||||
typename std::enable_if<
|
||||
(std::is_integral<T>::value && std::is_signed<T>::value && sizeof(T) > sizeof(std::size_t))
|
||||
>::type
|
||||
>
|
||||
: public sprout::hash_detail::enable_hash_value
|
||||
{};
|
||||
|
||||
template<typename T, typename Enable = void>
|
||||
struct ulong_numbers {};
|
||||
template<typename T>
|
||||
struct ulong_numbers<
|
||||
T,
|
||||
typename std::enable_if<
|
||||
(std::is_integral<T>::value && std::is_unsigned<T>::value && sizeof(T) > sizeof(std::size_t))
|
||||
>::type
|
||||
>
|
||||
: public sprout::hash_detail::enable_hash_value
|
||||
{};
|
||||
|
||||
template<typename T, typename Enable = void>
|
||||
struct float_numbers {};
|
||||
template<typename T>
|
||||
struct float_numbers<
|
||||
T,
|
||||
typename std::enable_if<
|
||||
(std::is_floating_point<T>::value)
|
||||
>::type
|
||||
>
|
||||
: public sprout::hash_detail::enable_hash_value
|
||||
{};
|
||||
} // namespace hash_detail
|
||||
|
||||
//
|
||||
// hash_value
|
||||
//
|
||||
inline SPROUT_CONSTEXPR std::size_t hash_value(bool v);
|
||||
inline SPROUT_CONSTEXPR std::size_t hash_value(char v);
|
||||
inline SPROUT_CONSTEXPR std::size_t hash_value(unsigned char v);
|
||||
inline SPROUT_CONSTEXPR std::size_t hash_value(signed char v);
|
||||
inline SPROUT_CONSTEXPR std::size_t hash_value(char16_t v);
|
||||
inline SPROUT_CONSTEXPR std::size_t hash_value(char32_t v);
|
||||
inline SPROUT_CONSTEXPR std::size_t hash_value(wchar_t v);
|
||||
inline SPROUT_CONSTEXPR std::size_t hash_value(short v);
|
||||
inline SPROUT_CONSTEXPR std::size_t hash_value(unsigned short v);
|
||||
inline SPROUT_CONSTEXPR std::size_t hash_value(int v);
|
||||
inline SPROUT_CONSTEXPR std::size_t hash_value(unsigned int v);
|
||||
inline SPROUT_CONSTEXPR std::size_t hash_value(long v);
|
||||
inline SPROUT_CONSTEXPR std::size_t hash_value(unsigned long v);
|
||||
inline SPROUT_CONSTEXPR std::size_t hash_value(long long v);
|
||||
inline SPROUT_CONSTEXPR std::size_t hash_value(unsigned long long v);
|
||||
//inline SPROUT_CONSTEXPR std::size_t hash_value(float v);
|
||||
//inline SPROUT_CONSTEXPR std::size_t hash_value(double v);
|
||||
//inline SPROUT_CONSTEXPR std::size_t hash_value(long double v);
|
||||
template<typename T>
|
||||
inline SPROUT_CONSTEXPR typename sprout::hash_detail::basic_numbers<T>::type
|
||||
hash_value(T);
|
||||
template<typename T>
|
||||
inline SPROUT_CONSTEXPR typename sprout::hash_detail::long_numbers<T>::type
|
||||
hash_value(T);
|
||||
template<typename T>
|
||||
inline SPROUT_CONSTEXPR typename sprout::hash_detail::ulong_numbers<T>::type
|
||||
hash_value(T);
|
||||
// template<typename T>
|
||||
// inline SPROUT_CONSTEXPR typename sprout::hash_detail::float_numbers<T>::type
|
||||
// hash_value(T);
|
||||
template<
|
||||
typename T,
|
||||
typename sprout::enabler_if<std::is_pointer<typename std::remove_reference<T>::type>::value>::type
|
||||
|
@ -104,51 +153,26 @@ namespace sprout {
|
|||
//
|
||||
// hash_value
|
||||
//
|
||||
inline SPROUT_CONSTEXPR std::size_t hash_value(bool v) {
|
||||
template<typename T>
|
||||
inline SPROUT_CONSTEXPR typename sprout::hash_detail::basic_numbers<T>::type
|
||||
hash_value(T v) {
|
||||
return static_cast<std::size_t>(v);
|
||||
}
|
||||
inline SPROUT_CONSTEXPR std::size_t hash_value(char v) {
|
||||
return static_cast<std::size_t>(v);
|
||||
}
|
||||
inline SPROUT_CONSTEXPR std::size_t hash_value(unsigned char v) {
|
||||
return static_cast<std::size_t>(v);
|
||||
}
|
||||
inline SPROUT_CONSTEXPR std::size_t hash_value(signed char v) {
|
||||
return static_cast<std::size_t>(v);
|
||||
}
|
||||
inline SPROUT_CONSTEXPR std::size_t hash_value(char16_t v) {
|
||||
return static_cast<std::size_t>(v);
|
||||
}
|
||||
inline SPROUT_CONSTEXPR std::size_t hash_value(char32_t v) {
|
||||
return static_cast<std::size_t>(v);
|
||||
}
|
||||
inline SPROUT_CONSTEXPR std::size_t hash_value(wchar_t v) {
|
||||
return static_cast<std::size_t>(v);
|
||||
}
|
||||
inline SPROUT_CONSTEXPR std::size_t hash_value(short v) {
|
||||
return static_cast<std::size_t>(v);
|
||||
}
|
||||
inline SPROUT_CONSTEXPR std::size_t hash_value(unsigned short v) {
|
||||
return static_cast<std::size_t>(v);
|
||||
}
|
||||
inline SPROUT_CONSTEXPR std::size_t hash_value(int v) {
|
||||
return static_cast<std::size_t>(v);
|
||||
}
|
||||
inline SPROUT_CONSTEXPR std::size_t hash_value(unsigned int v) {
|
||||
return static_cast<std::size_t>(v);
|
||||
}
|
||||
inline SPROUT_CONSTEXPR std::size_t hash_value(long v) {
|
||||
return static_cast<std::size_t>(v);
|
||||
}
|
||||
inline SPROUT_CONSTEXPR std::size_t hash_value(unsigned long v) {
|
||||
return static_cast<std::size_t>(v);
|
||||
}
|
||||
inline SPROUT_CONSTEXPR std::size_t hash_value(long long v) {
|
||||
template<typename T>
|
||||
inline SPROUT_CONSTEXPR typename sprout::hash_detail::long_numbers<T>::type
|
||||
hash_value(T v) {
|
||||
return sprout::hash_detail::hash_value_signed(v);
|
||||
}
|
||||
inline SPROUT_CONSTEXPR std::size_t hash_value(unsigned long long v) {
|
||||
template<typename T>
|
||||
inline SPROUT_CONSTEXPR typename sprout::hash_detail::ulong_numbers<T>::type
|
||||
hash_value(T v) {
|
||||
return sprout::hash_detail::hash_value_unsigned(v);
|
||||
}
|
||||
// template<typename T>
|
||||
// inline SPROUT_CONSTEXPR typename sprout::hash_detail::float_numbers<T>::type
|
||||
// hash_value(T v) {
|
||||
// return sprout::hash_detail::hash_value_float(v);
|
||||
// }
|
||||
template<
|
||||
typename T,
|
||||
typename sprout::enabler_if<std::is_pointer<typename std::remove_reference<T>::type>::value>::type = sprout::enabler
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue