| 1052 | |
| 1053 | template <class DecimalClass> |
| 1054 | DecimalStatus DecimalRescale(const DecimalClass& value, int32_t original_scale, |
| 1055 | int32_t new_scale, DecimalClass* out) { |
| 1056 | DCHECK_NE(out, nullptr); |
| 1057 | |
| 1058 | if (original_scale == new_scale) { |
| 1059 | *out = value; |
| 1060 | return DecimalStatus::kSuccess; |
| 1061 | } |
| 1062 | |
| 1063 | const int32_t delta_scale = new_scale - original_scale; |
| 1064 | const int32_t abs_delta_scale = std::abs(delta_scale); |
| 1065 | |
| 1066 | DecimalClass multiplier = DecimalClass::GetScaleMultiplier(abs_delta_scale); |
| 1067 | |
| 1068 | const bool rescale_would_cause_data_loss = |
| 1069 | RescaleWouldCauseDataLoss(value, delta_scale, multiplier, out); |
| 1070 | |
| 1071 | // Fail if we overflow or truncate |
| 1072 | if (ARROW_PREDICT_FALSE(rescale_would_cause_data_loss)) { |
| 1073 | return DecimalStatus::kRescaleDataLoss; |
| 1074 | } |
| 1075 | |
| 1076 | return DecimalStatus::kSuccess; |
| 1077 | } |
| 1078 | |
| 1079 | DecimalStatus BasicDecimal32::Rescale(int32_t original_scale, int32_t new_scale, |
| 1080 | BasicDecimal32* out) const { |
no test coverage detected