From 2fecd35fd219ec9c9393f570c63beff135d72114 Mon Sep 17 00:00:00 2001 From: Josh Koon <45607479+joshkoon@users.noreply.github.com> Date: Thu, 21 Feb 2019 11:13:00 -0800 Subject: [PATCH] Convert Rational::And, ::Or, ::Xor to use &=, &, |=, |, ^=, ^ operator overrides --- src/CalcManager/CEngine/Rational.cpp | 156 +++++++++++++----------- src/CalcManager/CEngine/scidisp.cpp | 2 +- src/CalcManager/CEngine/scifunc.cpp | 2 +- src/CalcManager/CEngine/scioper.cpp | 9 +- src/CalcManager/CEngine/sciset.cpp | 4 +- src/CalcManager/Header Files/Rational.h | 11 +- 6 files changed, 103 insertions(+), 81 deletions(-) diff --git a/src/CalcManager/CEngine/Rational.cpp b/src/CalcManager/CEngine/Rational.cpp index 6d45f153..7b63903d 100644 --- a/src/CalcManager/CEngine/Rational.cpp +++ b/src/CalcManager/CEngine/Rational.cpp @@ -55,7 +55,7 @@ namespace CalcEngine uint32_t hi = HIDWORD(ui); uint32_t lo = LODWORD(ui); - Rational temp = (Rational{ hi } << 32).Or(lo, precision); + Rational temp = (Rational{ hi } << 32) | lo; m_p = Number{ temp.P() }; m_q = Number{ temp.Q() }; @@ -252,6 +252,73 @@ namespace CalcEngine return *this; } + Rational& Rational::operator&=(Rational const& rhs) + { + PRAT lhsRat = this->ToPRAT(); + PRAT rhsRat = rhs.ToPRAT(); + + try + { + andrat(&lhsRat, rhsRat, RATIONAL_BASE, RATIONAL_PRECISION); + destroyrat(rhsRat); + } + catch (DWORD error) + { + destroyrat(lhsRat); + destroyrat(rhsRat); + throw(error); + } + + *this = Rational{ lhsRat }; + destroyrat(lhsRat); + + return *this; + } + + Rational& Rational::operator|=(Rational const& rhs) + { + PRAT lhsRat = this->ToPRAT(); + PRAT rhsRat = rhs.ToPRAT(); + try + { + orrat(&lhsRat, rhsRat, RATIONAL_BASE, RATIONAL_PRECISION); + destroyrat(rhsRat); + } + catch (DWORD error) + { + destroyrat(lhsRat); + destroyrat(rhsRat); + throw(error); + } + + *this = Rational{ lhsRat }; + destroyrat(lhsRat); + + return *this; + } + + Rational& Rational::operator^=(Rational const& rhs) + { + PRAT lhsRat = this->ToPRAT(); + PRAT rhsRat = rhs.ToPRAT(); + try + { + xorrat(&lhsRat, rhsRat, RATIONAL_BASE, RATIONAL_PRECISION); + destroyrat(rhsRat); + } + catch (DWORD error) + { + destroyrat(lhsRat); + destroyrat(rhsRat); + throw(error); + } + + *this = Rational{ lhsRat }; + destroyrat(lhsRat); + + return *this; + } + Rational operator+(Rational lhs, Rational const& rhs) { lhs += rhs; @@ -294,76 +361,27 @@ namespace CalcEngine return lhs; } + Rational operator&(Rational lhs, Rational const& rhs) + { + lhs &= rhs; + return lhs; + } + + Rational operator|(Rational lhs, Rational const& rhs) + { + lhs |= rhs; + return lhs; + } + + Rational operator^(Rational lhs, Rational const& rhs) + { + lhs ^= rhs; + return lhs; + } + Rational Rational::Not(Rational const& chopNum, int32_t precision) const { - return this->Xor(chopNum, precision); - } - - Rational Rational::And(Rational const& rhs, int32_t precision) const - { - PRAT lhsRat = this->ToPRAT(); - PRAT rhsRat = rhs.ToPRAT(); - - try - { - andrat(&lhsRat, rhsRat, RATIONAL_BASE, precision); - destroyrat(rhsRat); - } - catch (DWORD error) - { - destroyrat(lhsRat); - destroyrat(rhsRat); - throw(error); - } - - Rational result = Rational{ lhsRat }; - destroyrat(lhsRat); - - return result; - } - - Rational Rational::Or(Rational const& rhs, int32_t precision) const - { - PRAT lhsRat = this->ToPRAT(); - PRAT rhsRat = rhs.ToPRAT(); - try - { - orrat(&lhsRat, rhsRat, RATIONAL_BASE, precision); - destroyrat(rhsRat); - } - catch (DWORD error) - { - destroyrat(lhsRat); - destroyrat(rhsRat); - throw(error); - } - - Rational result = Rational{ lhsRat }; - destroyrat(lhsRat); - - return result; - } - - Rational Rational::Xor(Rational const& rhs, int32_t precision) const - { - PRAT lhsRat = this->ToPRAT(); - PRAT rhsRat = rhs.ToPRAT(); - try - { - xorrat(&lhsRat, rhsRat, RATIONAL_BASE, precision); - destroyrat(rhsRat); - } - catch (DWORD error) - { - destroyrat(lhsRat); - destroyrat(rhsRat); - throw(error); - } - - Rational result = Rational{ lhsRat }; - destroyrat(lhsRat); - - return result; + return *this ^ chopNum; } bool Rational::IsZero() const diff --git a/src/CalcManager/CEngine/scidisp.cpp b/src/CalcManager/CEngine/scidisp.cpp index 617d28d8..5128a5fc 100644 --- a/src/CalcManager/CEngine/scidisp.cpp +++ b/src/CalcManager/CEngine/scidisp.cpp @@ -68,7 +68,7 @@ CalcEngine::Rational CCalcEngine::TruncateNumForIntMath(CalcEngine::Rational con result = result.Not(m_chopNumbers[m_numwidth], m_precision); } - result = result.And(m_chopNumbers[m_numwidth], m_precision); + result &= m_chopNumbers[m_numwidth]; return result; } diff --git a/src/CalcManager/CEngine/scifunc.cpp b/src/CalcManager/CEngine/scifunc.cpp index 58207e0f..f398c40d 100644 --- a/src/CalcManager/CEngine/scifunc.cpp +++ b/src/CalcManager/CEngine/scifunc.cpp @@ -43,7 +43,7 @@ CalcEngine::Rational CCalcEngine::SciCalcFunctions(CalcEngine::Rational const& r } else { - result = rat.Xor(m_chopNumbers[m_numwidth], m_precision); + result = rat ^ m_chopNumbers[m_numwidth]; } break; diff --git a/src/CalcManager/CEngine/scioper.cpp b/src/CalcManager/CEngine/scioper.cpp index 1593e6c2..93b33995 100644 --- a/src/CalcManager/CEngine/scioper.cpp +++ b/src/CalcManager/CEngine/scioper.cpp @@ -18,15 +18,15 @@ CalcEngine::Rational CCalcEngine::DoOperation(int operation, CalcEngine::Rationa switch (operation) { case IDC_AND: - result = result.And(rhs, m_precision); + result &= rhs; break; case IDC_OR: - result = result.Or(rhs, m_precision); + result |= rhs; break; case IDC_XOR: - result = result.Xor(rhs, m_precision); + result ^= rhs; break; case IDC_RSHF: @@ -49,8 +49,7 @@ CalcEngine::Rational CCalcEngine::DoOperation(int operation, CalcEngine::Rationa auto tempRat = m_chopNumbers[m_numwidth] >> holdVal; tempRat = Integer(tempRat, m_precision); - tempRat = tempRat.Xor(m_chopNumbers[m_numwidth], m_precision); - result = result.Or(tempRat, m_precision); + result |= tempRat ^ m_chopNumbers[m_numwidth]; } break; } diff --git a/src/CalcManager/CEngine/sciset.cpp b/src/CalcManager/CEngine/sciset.cpp index c890450d..0078f05a 100644 --- a/src/CalcManager/CEngine/sciset.cpp +++ b/src/CalcManager/CEngine/sciset.cpp @@ -89,11 +89,11 @@ bool CCalcEngine::TryToggleBit(CalcEngine::Rational& rat, DWORD wbitno) { // This is the same work around happenning in SciCalcFunctions. Ought to move to intrat function itself. // Basic bug is there which doesn't treat 0/ n as 0, or -0 as 0 etc. - result = Rational{}; + result = 0; } auto pow = Pow(2, static_cast(wbitno), m_precision); - rat = result.Xor(pow, m_precision); + rat = result ^ pow; return true; } diff --git a/src/CalcManager/Header Files/Rational.h b/src/CalcManager/Header Files/Rational.h index 9c9acdb3..1a02cb8f 100644 --- a/src/CalcManager/Header Files/Rational.h +++ b/src/CalcManager/Header Files/Rational.h @@ -39,6 +39,10 @@ namespace CalcEngine Rational& operator<<=(Rational const& rhs); Rational& operator>>=(Rational const& rhs); + Rational& operator&=(Rational const& rhs); + Rational& operator|=(Rational const& rhs); + Rational& operator^=(Rational const& rhs); + friend Rational operator+(Rational lhs, Rational const& rhs); friend Rational operator-(Rational lhs, Rational const& rhs); friend Rational operator*(Rational lhs, Rational const& rhs); @@ -48,10 +52,11 @@ namespace CalcEngine friend Rational operator<<(Rational lhs, Rational const& rhs); friend Rational operator>>(Rational lhs, Rational const& rhs); + friend Rational operator&(Rational lhs, Rational const& rhs); + friend Rational operator|(Rational lhs, Rational const& rhs); + friend Rational operator^(Rational lhs, Rational const& rhs); + Rational Not(Rational const& chopNum, int32_t precision) const; - Rational And(Rational const& r, int32_t precision) const; - Rational Or(Rational const& r, int32_t precision) const; - Rational Xor(Rational const& r, int32_t precision) const; bool IsZero() const; bool IsLess(Rational const& r, int32_t precision) const;