3494 {
3495
3496 auto minval = NumericLimits<TO>::Minimum();
3497 auto maxval = NumericLimits<TO>::Maximum();
3498 auto unsigned_in = static_cast<typename MakeUnsigned<FROM>::type>(val);
3499 auto unsigned_min = static_cast<typename MakeUnsigned<TO>::type>(minval);
3500 auto unsigned_max = static_cast<typename MakeUnsigned<TO>::type>(maxval);
3501 auto signed_in = static_cast<typename MakeSigned<FROM>::type>(val);
3502 auto signed_min = static_cast<typename MakeSigned<TO>::type>(minval);
3503 auto signed_max = static_cast<typename MakeSigned<TO>::type>(maxval);
3504
3505 if (!NumericLimits<FROM>::IsSigned() && !NumericLimits<TO>::IsSigned() &&
3506 (unsigned_in < unsigned_min || unsigned_in > unsigned_max)) {
3507 ThrowNumericCastError(val, static_cast<TO>(unsigned_min), static_cast<TO>(unsigned_max));
3508 }
3509
3510 if (NumericLimits<FROM>::IsSigned() && NumericLimits<TO>::IsSigned() &&
3511 (signed_in < signed_min || signed_in > signed_max)) {
3512 ThrowNumericCastError(val, static_cast<TO>(signed_min), static_cast<TO>(signed_max));
3513 }
3514
3515 if (NumericLimits<FROM>::IsSigned() != NumericLimits<TO>::IsSigned() &&
3516 (signed_in < signed_min || unsigned_in > unsigned_max)) {
3517 ThrowNumericCastError(val, static_cast<TO>(signed_min), static_cast<TO>(unsigned_max));
3518 }
3519
3520 return static_cast<TO>(val);
3521 }