1 #ifndef OSMIUM_UTIL_CAST_HPP
2 #define OSMIUM_UTIL_CAST_HPP
41 #include <type_traits>
52 template <
typename A,
typename B>
54 std::integral_constant<bool,
55 std::is_integral<A>::value &&
56 std::is_integral<B>::value &&
57 !std::is_same<A, bool>::value &&
58 !std::is_same<B, bool>::value> {
61 template <typename T, typename F, typename std::enable_if<are_real_integers<T, F>::value && std::is_same<T, F>::value,
int>
::type = 0>
66 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>
68 return static_cast<T
>(value);
71 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>
73 return static_cast<T
>(value);
76 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>
78 assert(value >= std::numeric_limits<T>::min() && value <= std::numeric_limits<T>::max());
79 return static_cast<T
>(value);
82 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>
85 return static_cast<T
>(value);
88 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>
90 assert(value <= std::numeric_limits<T>::max());
91 return static_cast<T
>(value);
94 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>
96 assert(value <= std::numeric_limits<T>::max());
97 return static_cast<T
>(value);
102 #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:62