From 77b1ba4855ec6a1758e4de9d277a1619f53268c5 Mon Sep 17 00:00:00 2001 From: "Shane F. Carr" Date: Fri, 7 Jul 2023 00:35:35 +0200 Subject: [PATCH] Inline trunc_internal --- utils/fixed_decimal/src/decimal.rs | 30 ++++++++++++++++++------------ 1 file changed, 18 insertions(+), 12 deletions(-) diff --git a/utils/fixed_decimal/src/decimal.rs b/utils/fixed_decimal/src/decimal.rs index 774c60acf3e..68e3167d195 100644 --- a/utils/fixed_decimal/src/decimal.rs +++ b/utils/fixed_decimal/src/decimal.rs @@ -1046,12 +1046,6 @@ impl FixedDecimal { /// assert_eq!("1", dec.to_string()); /// ``` pub fn trunc(&mut self, position: i16) { - self.trunc_internal(position, true); - #[cfg(debug_assertions)] - self.check_invariants(); - } - - fn trunc_internal(&mut self, position: i16, strip_trailing_zeros: bool) { self.lower_magnitude = cmp::min(position, 0); if position == i16::MIN { // Nothing more to do @@ -1065,13 +1059,14 @@ impl FixedDecimal { if magnitude <= self.magnitude { self.digits .truncate(crate::ops::i16_abs_sub(self.magnitude, magnitude) as usize); - if strip_trailing_zeros { - self.remove_trailing_zeros_from_digits_list(); - } + self.remove_trailing_zeros_from_digits_list(); } else { self.digits.clear(); self.magnitude = 0; } + + #[cfg(debug_assertions)] + self.check_invariants(); } /// Half Truncates the number on the right to a particular position, deleting @@ -1176,26 +1171,37 @@ impl FixedDecimal { let before_truncate_is_zero = self.is_zero(); let before_truncate_bottom_magnitude = self.nonzero_magnitude_end(); let before_truncate_magnitude = self.magnitude; - self.trunc_internal(position, false); + + self.lower_magnitude = cmp::min(position, 0); + if position == i16::MIN { + // Nothing more to do + #[cfg(debug_assertions)] + self.check_invariants(); + return; + } + let magnitude = position - 1; + self.upper_magnitude = cmp::max(self.upper_magnitude, magnitude); if before_truncate_is_zero || position <= before_truncate_bottom_magnitude { #[cfg(debug_assertions)] self.check_invariants(); + return; } if position <= before_truncate_magnitude { + self.digits + .truncate(crate::ops::i16_abs_sub(self.magnitude, magnitude) as usize); let result = self.increment_abs_by_one(); if result.is_err() { // Do nothing for now. } - #[cfg(debug_assertions)] self.check_invariants(); return; } - debug_assert!(self.digits.is_empty()); + self.digits.clear(); self.digits.push(1); self.magnitude = position; self.upper_magnitude = cmp::max(self.upper_magnitude, position);