1 #ifndef OSMIUM_UTIL_CAST_HPP
2 #define OSMIUM_UTIL_CAST_HPP
42 #include <type_traits>
53 template <
typename A,
typename B>
55 std::integral_constant<bool,
56 std::is_integral<A>::value &&
57 std::is_integral<B>::value &&
58 !std::is_same<A, bool>::value &&
59 !std::is_same<B, bool>::value> {
62 template <typename T, typename F, typename std::enable_if<are_real_integers<T, F>::value && std::is_same<T, F>::value,
int>
::type = 0>
67 template <typename T, typename F, typename std::enable_if<are_real_integers<T, F>::value && !std::is_same<T, F>::value && (
sizeof(T) >
sizeof(F)),
int>::
type = 0>
69 return static_cast<T
>(value);
72 template <typename T, typename F, typename std::enable_if<are_real_integers<T, F>::value && !std::is_same<T, F>::value && std::is_signed<T>::value == std::is_signed<F>::value && (
sizeof(T) ==
sizeof(F)),
int>::
type = 0>
74 return static_cast<T
>(value);
77 template <typename T, typename F, typename std::enable_if<are_real_integers<T, F>::value && !std::is_same<T, F>::value && (
sizeof(T) <
sizeof(F)) && std::is_signed<T>::value && std::is_signed<F>::value,
int>::
type = 0>
79 assert(value >= std::numeric_limits<T>::min() && value <= std::numeric_limits<T>::max());
80 return static_cast<T
>(value);
83 template <typename T, typename F, typename std::enable_if<are_real_integers<T, F>::value && !std::is_same<T, F>::value && (
sizeof(T) <=
sizeof(F)) && std::is_unsigned<T>::value && std::is_signed<F>::value,
int>::
type = 0>
86 return static_cast<T
>(value);
89 template <typename T, typename F, typename std::enable_if<are_real_integers<T, F>::value && !std::is_same<T, F>::value && (
sizeof(T) <
sizeof(F)) && std::is_unsigned<T>::value && std::is_unsigned<F>::value,
int>::
type = 0>
91 assert(value <= std::numeric_limits<T>::max());
92 return static_cast<T
>(value);
95 template <typename T, typename F, typename std::enable_if<are_real_integers<T, F>::value && !std::is_same<T, F>::value && (
sizeof(T) <=
sizeof(F)) && std::is_signed<T>::value && std::is_unsigned<F>::value,
int>::
type = 0>
97 assert(static_cast<int64_t>(value) <= static_cast<int64_t>(std::numeric_limits<T>::max()));
98 return static_cast<T
>(value);
103 #endif // OSMIUM_UTIL_CAST_HPP
type
Definition: entity_bits.hpp:60
Namespace for everything in the Osmium library.
Definition: assembler.hpp:55
T static_cast_with_assert(const F value)
Definition: cast.hpp:63