Reduce size

This commit is contained in:
Benoit Blanchon
2022-04-06 16:41:04 +02:00
parent 42976551f8
commit ce111d447e
2 changed files with 20 additions and 27 deletions

View File

@@ -117,15 +117,6 @@ struct FloatTraits<T, 8 /*64bits*/> {
return forge(0x7FEFFFFF, 0xFFFFFFFF);
}
template <typename TOut>
static
typename enable_if<is_integral<TOut>::value && sizeof(TOut) < sizeof(T),
T>::type
highest_for() {
// This conversion is safe because the destination type is smaller
return highest();
}
template <typename TOut>
static typename enable_if<is_integral<TOut>::value &&
is_signed<TOut>::value && sizeof(TOut) == 8,
@@ -238,15 +229,6 @@ struct FloatTraits<T, 4 /*32bits*/> {
return forge(0x7f7fffff);
}
template <typename TOut>
static
typename enable_if<is_integral<TOut>::value && sizeof(TOut) < sizeof(T),
T>::type
highest_for() {
// This conversion is safe because the destination type is smaller
return highest();
}
template <typename TOut>
static typename enable_if<is_integral<TOut>::value &&
is_signed<TOut>::value && sizeof(TOut) == 4,

View File

@@ -96,21 +96,32 @@ canConvertNumber(TIn value) {
return value <= TIn(numeric_limits<TOut>::highest());
}
// float32 -> int16
// float32 -> int32
// float32 -> int64
// float32 -> int8
// float32 -> uint32
// float32 -> uint64
// float32 -> int16
// float64 -> int32
// float64 -> int64
// float64 -> uint64
template <typename TOut, typename TIn>
typename enable_if<is_floating_point<TIn>::value && is_integral<TOut>::value,
typename enable_if<is_floating_point<TIn>::value && is_integral<TOut>::value &&
sizeof(TOut) < sizeof(TIn),
bool>::type
canConvertNumber(TIn value) {
return value >= numeric_limits<TOut>::lowest() &&
value <= numeric_limits<TOut>::highest() &&
value <= numeric_limits<TOut>::highest();
}
// float32 -> int32
// float32 -> uint32
// float32 -> int64
// float32 -> uint64
// float64 -> int64
// float64 -> uint64
template <typename TOut, typename TIn>
typename enable_if<is_floating_point<TIn>::value && is_integral<TOut>::value &&
sizeof(TOut) >= sizeof(TIn),
bool>::type
canConvertNumber(TIn value) {
// Avoid error "9.22337e+18 is outside the range of representable values of
// type 'long'"
return value >= numeric_limits<TOut>::lowest() &&
value <= FloatTraits<TIn>::template highest_for<TOut>();
}