| 828 | /// \brief Do a division where the divisor fits into a single 32 bit value. |
| 829 | template <class DecimalClass> |
| 830 | static inline DecimalStatus SingleDivide(const uint32_t* dividend, |
| 831 | int64_t dividend_length, uint32_t divisor, |
| 832 | DecimalClass* remainder, |
| 833 | bool dividend_was_negative, |
| 834 | bool divisor_was_negative, |
| 835 | DecimalClass* result) { |
| 836 | uint64_t r = 0; |
| 837 | constexpr int64_t kDecimalArrayLength = DecimalClass::kBitWidth / sizeof(uint32_t) + 1; |
| 838 | uint32_t result_array[kDecimalArrayLength]; |
| 839 | for (int64_t j = 0; j < dividend_length; j++) { |
| 840 | r <<= 32; |
| 841 | r += dividend[j]; |
| 842 | result_array[j] = static_cast<uint32_t>(r / divisor); |
| 843 | r %= divisor; |
| 844 | } |
| 845 | auto status = BuildFromArray(result, result_array, dividend_length); |
| 846 | if (status != DecimalStatus::kSuccess) { |
| 847 | return status; |
| 848 | } |
| 849 | |
| 850 | *remainder = static_cast<int64_t>(r); |
| 851 | FixDivisionSigns(result, remainder, dividend_was_negative, divisor_was_negative); |
| 852 | return DecimalStatus::kSuccess; |
| 853 | } |
| 854 | |
| 855 | /// \brief Do a decimal division with remainder. |
| 856 | template <class DecimalClass> |
no test coverage detected