7 #ifndef PXR_BASE_GF_NUMERIC_CAST_H
8 #define PXR_BASE_GF_NUMERIC_CAST_H
18 #include <type_traits>
29 template <
class T,
class U>
33 static_assert(std::is_integral_v<T> && !std::is_same_v<T, bool> &&
34 std::is_integral_v<U> && !std::is_same_v<U, bool>);
36 if constexpr (std::is_signed_v<T> == std::is_signed_v<U>) {
39 else if constexpr (std::is_signed_v<T>) {
82 template <
class To,
class From>
91 #if defined(ARCH_COMPILER_MSVC)
99 using FromLimits = std::numeric_limits<From>;
100 using ToLimits = std::numeric_limits<To>;
109 if constexpr (std::is_same_v<From, bool> ||
110 std::is_same_v<To, bool>) {
115 return static_cast<To
>(from);
118 else if constexpr (std::is_integral_v<From> &&
119 std::is_integral_v<To>) {
130 return static_cast<To
>(from);
134 std::is_integral_v<To>) {
136 if (std::isnan(from)) {
141 if (std::isinf(from)) {
154 From low =
static_cast<From
>(ToLimits::lowest()) - static_cast<From>(1);
155 From high =
static_cast<From
>(
ToLimits::max()) + static_cast<From>(1);
166 return static_cast<To
>(from);
173 return static_cast<To
>(from);
176 #if defined(ARCH_COMPILER_MSVC)
183 #endif // PXR_BASE_GF_NUMERIC_CAST_H
#define PXR_NAMESPACE_OPEN_SCOPE
ImageBuf OIIO_API min(Image_or_Const A, Image_or_Const B, ROI roi={}, int nthreads=0)
Value too high to convert.
PXR_NAMESPACE_OPEN_SCOPE constexpr bool GfIntegerCompareLess(T t, U u) noexcept
std::optional< To > GfNumericCast(From from, GfNumericCastFailureType *failType=nullptr)
ImageBuf OIIO_API max(Image_or_Const A, Image_or_Const B, ROI roi={}, int nthreads=0)
#define PXR_NAMESPACE_CLOSE_SCOPE
Value is a floating-point NaN.
Value too low to convert.