From 259d16e1b893dc69fcefe268e75f673c0743bb38 Mon Sep 17 00:00:00 2001 From: Josh Koon <45607479+joshkoon@users.noreply.github.com> Date: Thu, 21 Feb 2019 10:32:47 -0800 Subject: [PATCH] Convert Rational::Add to + and += operator overrides. --- src/CalcManager/CEngine/Rational.cpp | 14 ++++++++++---- src/CalcManager/CEngine/scicomm.cpp | 5 ++--- src/CalcManager/CEngine/scifunc.cpp | 7 +++---- src/CalcManager/CEngine/scioper.cpp | 8 +++----- src/CalcManager/CEngine/sciset.cpp | 2 +- src/CalcManager/Header Files/Rational.h | 4 +++- 6 files changed, 22 insertions(+), 18 deletions(-) diff --git a/src/CalcManager/CEngine/Rational.cpp b/src/CalcManager/CEngine/Rational.cpp index d82fddf0..b3412f71 100644 --- a/src/CalcManager/CEngine/Rational.cpp +++ b/src/CalcManager/CEngine/Rational.cpp @@ -91,14 +91,14 @@ namespace CalcEngine return Rational{ Number{ -1 * m_p.Sign(), m_p.Exp(), m_p.Mantissa() }, m_q }; } - Rational Rational::Add(Rational const& rhs, int32_t precision) const + Rational& Rational::operator+=(Rational const& rhs) { PRAT lhsRat = this->ToPRAT(); PRAT rhsRat = rhs.ToPRAT(); try { - addrat(&lhsRat, rhsRat, precision); + addrat(&lhsRat, rhsRat, RATIONAL_PRECISION); destroyrat(rhsRat); } catch (DWORD error) @@ -108,10 +108,16 @@ namespace CalcEngine throw(error); } - Rational result = Rational{ lhsRat }; + *this = Rational{ lhsRat }; destroyrat(lhsRat); - return result; + return *this; + } + + Rational operator+(Rational lhs, Rational const& rhs) + { + lhs += rhs; + return lhs; } Rational Rational::Sub(Rational const& rhs, int32_t precision) const diff --git a/src/CalcManager/CEngine/scicomm.cpp b/src/CalcManager/CEngine/scicomm.cpp index b4297ed7..999e6571 100644 --- a/src/CalcManager/CEngine/scicomm.cpp +++ b/src/CalcManager/CEngine/scicomm.cpp @@ -718,7 +718,7 @@ void CCalcEngine::ProcessCommandWorker(WPARAM wParam) { /* MPLUS adds m_currentVal to immediate memory and kills the "mem" */ /* indicator if the result is zero. */ - Rational result = m_memoryValue->Add(m_currentVal, m_precision); + Rational result = *m_memoryValue + m_currentVal; m_memoryValue = make_unique(TruncateNumForIntMath(result)); // Memory should follow the current int mode break; @@ -1053,8 +1053,7 @@ wstring CCalcEngine::GetStringForDisplay(Rational const& rat, uint32_t radix) if ((radix == 10) && fMsb) { // If high bit is set, then get the decimal number in negative 2's compl form. - tempRat = tempRat.Not(m_chopNumbers[m_numwidth], m_precision); - tempRat = -(tempRat.Add(1, m_precision)); + tempRat = -(tempRat.Not(m_chopNumbers[m_numwidth], m_precision) + 1); } result = tempRat.ToString(radix, m_nFE, m_precision); diff --git a/src/CalcManager/CEngine/scifunc.cpp b/src/CalcManager/CEngine/scifunc.cpp index bab7a23f..43d0721f 100644 --- a/src/CalcManager/CEngine/scifunc.cpp +++ b/src/CalcManager/CEngine/scifunc.cpp @@ -39,8 +39,7 @@ CalcEngine::Rational CCalcEngine::SciCalcFunctions(CalcEngine::Rational const& r case IDC_COM: if (m_radix == 10 && !m_fIntegerMode) { - result = RationalMath::Integer(rat, m_precision); - result = -(result.Add(1, m_precision)); + result = -(RationalMath::Integer(rat, m_precision) + 1); } else { @@ -200,10 +199,10 @@ CalcEngine::Rational CCalcEngine::SciCalcFunctions(CalcEngine::Rational const& r shftRat = Rational{ m_bInv ? 60 : 100 }; secondRat = secondRat.Div(shftRat, m_precision); - minuteRat = minuteRat.Add(secondRat, m_precision); + minuteRat += secondRat; minuteRat = minuteRat.Div(shftRat, m_precision); - result = degreeRat.Add(minuteRat, m_precision); + result = degreeRat + minuteRat; } break; } diff --git a/src/CalcManager/CEngine/scioper.cpp b/src/CalcManager/CEngine/scioper.cpp index 6f964000..484d531f 100644 --- a/src/CalcManager/CEngine/scioper.cpp +++ b/src/CalcManager/CEngine/scioper.cpp @@ -65,7 +65,7 @@ CalcEngine::Rational CCalcEngine::DoOperation(int operation, CalcEngine::Rationa break; case IDC_ADD: - result = result.Add(rhs, m_precision); + result += rhs; break; case IDC_SUB: @@ -90,8 +90,7 @@ CalcEngine::Rational CCalcEngine::DoOperation(int operation, CalcEngine::Rationa if (fMsb) { - result = rhs.Not(m_chopNumbers[m_numwidth], m_precision); - result = result.Add(1, m_precision); + result = rhs.Not(m_chopNumbers[m_numwidth], m_precision) + 1; iNumeratorSign = -1; } @@ -101,8 +100,7 @@ CalcEngine::Rational CCalcEngine::DoOperation(int operation, CalcEngine::Rationa if (fMsb) { - temp = temp.Not(m_chopNumbers[m_numwidth], m_precision); - temp = temp.Add(1, m_precision); + temp = temp.Not(m_chopNumbers[m_numwidth], m_precision) + 1; iDenominatorSign = -1; } diff --git a/src/CalcManager/CEngine/sciset.cpp b/src/CalcManager/CEngine/sciset.cpp index 521c1d1d..c890450d 100644 --- a/src/CalcManager/CEngine/sciset.cpp +++ b/src/CalcManager/CEngine/sciset.cpp @@ -26,7 +26,7 @@ void CCalcEngine::SetRadixTypeAndNumWidth(RADIX_TYPE radixtype, NUM_WIDTH numwid // If high bit is set, then get the decimal number in -ve 2'scompl form. auto tempResult = m_currentVal.Not(m_chopNumbers[m_numwidth], m_precision); - m_currentVal = -(tempResult.Add(1, m_precision)); + m_currentVal = -(tempResult + 1); } } diff --git a/src/CalcManager/Header Files/Rational.h b/src/CalcManager/Header Files/Rational.h index a4e99305..fb8de5ac 100644 --- a/src/CalcManager/Header Files/Rational.h +++ b/src/CalcManager/Header Files/Rational.h @@ -30,12 +30,14 @@ namespace CalcEngine Number const& Q() const; Rational operator-() const; - Rational Add(Rational const& rhs, int32_t precision) const; + Rational& operator+=(Rational const& rhs); Rational Sub(Rational const& rhs, int32_t precision) const; Rational Mul(Rational const& rhs, int32_t precision) const; Rational Div(Rational const& rhs, int32_t precision) const; Rational Mod(Rational const& rhs) const; + friend Rational operator+(Rational lhs, Rational const& rhs); + Rational Lsh(Rational const& r, int32_t precision) const; Rational Rsh(Rational const& r, int32_t precision) const;