|
26 | 26 |
|
27 | 27 | #include <array> |
28 | 28 | #include <bit> |
29 | | -#include <cassert> |
30 | 29 | #include <charconv> |
31 | 30 | #include <climits> |
32 | 31 | #include <cmath> |
@@ -270,6 +269,19 @@ void AdjustIntegerStringWithScale(int32_t scale, std::string* str) { |
270 | 269 | str->at(is_negative_offset + 1) = '.'; |
271 | 270 | } |
272 | 271 |
|
| 272 | +bool RescaleWouldCauseDataLoss(const Decimal& value, int32_t delta_scale, |
| 273 | + const Decimal& multiplier, Decimal* result) { |
| 274 | + if (delta_scale < 0) { |
| 275 | + auto res = value.Divide(multiplier); |
| 276 | + ICEBERG_DCHECK(res, "Decimal::Divide failed"); |
| 277 | + *result = res->first; |
| 278 | + return res->second != 0; |
| 279 | + } |
| 280 | + |
| 281 | + *result = value * multiplier; |
| 282 | + return (value < 0) ? *result > value : *result < value; |
| 283 | +} |
| 284 | + |
273 | 285 | } // namespace |
274 | 286 |
|
275 | 287 | Decimal::Decimal(std::string_view str) { |
@@ -463,23 +475,6 @@ Result<Decimal> Decimal::FromString(std::string_view str, int32_t* precision, |
463 | 475 | return result; |
464 | 476 | } |
465 | 477 |
|
466 | | -namespace { |
467 | | - |
468 | | -static bool RescaleWouldCauseDataLoss(const Decimal& value, int32_t delta_scale, |
469 | | - const Decimal& multiplier, Decimal* result) { |
470 | | - if (delta_scale < 0) { |
471 | | - auto res = value.Divide(multiplier); |
472 | | - ICEBERG_DCHECK(res, "Decimal::Divide failed"); |
473 | | - *result = res->first; |
474 | | - return res->second != 0; |
475 | | - } |
476 | | - |
477 | | - *result = value * multiplier; |
478 | | - return (value < 0) ? *result > value : *result < value; |
479 | | -} |
480 | | - |
481 | | -} // namespace |
482 | | - |
483 | 478 | Result<Decimal> Decimal::FromBigEndian(const uint8_t* bytes, int32_t length) { |
484 | 479 | static constexpr int32_t kMinDecimalBytes = 1; |
485 | 480 | static constexpr int32_t kMaxDecimalBytes = 16; |
|
0 commit comments