diff --git a/src/CalcManager/CEngine/History.cpp b/src/CalcManager/CEngine/History.cpp index 092b4d9a..95347a59 100644 --- a/src/CalcManager/CEngine/History.cpp +++ b/src/CalcManager/CEngine/History.cpp @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. +// Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. #include "pch.h" @@ -12,6 +12,7 @@ constexpr int ASCII_0 = 48; using namespace std; +using namespace CalcEngine; void CHistoryCollector::ReinitHistory() { @@ -51,7 +52,7 @@ CHistoryCollector::~CHistoryCollector() } } -void CHistoryCollector::AddOpndToHistory(wstring_view numStr, PRAT hNoNum, bool fRepetition) +void CHistoryCollector::AddOpndToHistory(wstring_view numStr, Rational const& rat, bool fRepetition) { std::shared_ptr> commands = std::make_shared>(); // Check for negate @@ -92,7 +93,7 @@ void CHistoryCollector::AddOpndToHistory(wstring_view numStr, PRAT hNoNum, bool } auto operandCommand = std::make_shared(commands, fNegative, fDecimal, fSciFmt); - operandCommand->Initialize(hNoNum); + operandCommand->Initialize(rat); int iCommandEnd = AddCommand(operandCommand); m_lastOpStartIndex = IchAddSzToEquationSz(numStr, iCommandEnd); diff --git a/src/CalcManager/CEngine/scicomm.cpp b/src/CalcManager/CEngine/scicomm.cpp index 354fb37d..7dbbf02d 100644 --- a/src/CalcManager/CEngine/scicomm.cpp +++ b/src/CalcManager/CEngine/scicomm.cpp @@ -211,9 +211,7 @@ void CCalcEngine::ProcessCommandWorker(WPARAM wParam) if (!m_HistoryCollector.FOpndAddedToHistory()) { // if the prev command was ) or unop then it is already in history as a opnd form (...) - PRAT curRat = m_currentVal.ToPRAT(); - m_HistoryCollector.AddOpndToHistory(m_numberString, curRat); - destroyrat(curRat); + m_HistoryCollector.AddOpndToHistory(m_numberString, m_currentVal); } /* m_bChangeOp is true if there was an operation done and the */ @@ -310,10 +308,7 @@ DoPrecedenceCheckAgain: { if (!m_HistoryCollector.FOpndAddedToHistory()) { - - PRAT curRat = m_currentVal.ToPRAT(); - m_HistoryCollector.AddOpndToHistory(m_numberString, curRat); - destroyrat(curRat); + m_HistoryCollector.AddOpndToHistory(m_numberString, m_currentVal); } m_HistoryCollector.AddUnaryOpToHistory((INT)wParam, m_bInv, m_angletype); @@ -339,9 +334,7 @@ DoPrecedenceCheckAgain: if(wParam == IDC_PERCENT) { CheckAndAddLastBinOpToHistory(); - PRAT curRat = m_currentVal.ToPRAT(); - m_HistoryCollector.AddOpndToHistory(m_numberString, curRat, true); - destroyrat(curRat); + m_HistoryCollector.AddOpndToHistory(m_numberString, m_currentVal, true /* Add to primary and secondary display */); } /* reset the m_bInv flag and indicators if it is set @@ -464,9 +457,7 @@ DoPrecedenceCheckAgain: if (!m_HistoryCollector.FOpndAddedToHistory()) { - PRAT curRat = m_currentVal.ToPRAT(); - m_HistoryCollector.AddOpndToHistory(m_numberString, curRat); - destroyrat(curRat); + m_HistoryCollector.AddOpndToHistory(m_numberString, m_currentVal); } do { @@ -485,9 +476,7 @@ DoPrecedenceCheckAgain: m_currentVal = m_holdVal; DisplayNum(); // to update the m_numberString m_HistoryCollector.AddBinOpToHistory(m_nOpCode, false); - PRAT curRat = m_currentVal.ToPRAT(); - m_HistoryCollector.AddOpndToHistory(m_numberString, curRat); // Adding the repeated last op to history - destroyrat(curRat); + m_HistoryCollector.AddOpndToHistory(m_numberString, m_currentVal); // Adding the repeated last op to history } // Do the current or last operation. @@ -595,9 +584,7 @@ DoPrecedenceCheckAgain: if (!m_HistoryCollector.FOpndAddedToHistory()) { - PRAT curRat = m_currentVal.ToPRAT(); - m_HistoryCollector.AddOpndToHistory(m_numberString, curRat); - destroyrat(curRat); + m_HistoryCollector.AddOpndToHistory(m_numberString, m_currentVal); } // Get the operation and number and return result. @@ -701,9 +688,7 @@ DoPrecedenceCheckAgain: if (!m_HistoryCollector.FOpndAddedToHistory()) { - PRAT curRat = m_currentVal.ToPRAT(); - m_HistoryCollector.AddOpndToHistory(m_numberString, curRat); - destroyrat(curRat); + m_HistoryCollector.AddOpndToHistory(m_numberString, m_currentVal); } PRAT curRat = m_currentVal.ToPRAT(); diff --git a/src/CalcManager/ExpressionCommand.cpp b/src/CalcManager/ExpressionCommand.cpp index ec177a64..e671182e 100644 --- a/src/CalcManager/ExpressionCommand.cpp +++ b/src/CalcManager/ExpressionCommand.cpp @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. +// Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. #include "pch.h" @@ -7,6 +7,7 @@ #include "ExpressionCommand.h" using namespace std; +using namespace CalcEngine; constexpr wchar_t chNegate = L'-'; constexpr wchar_t chExp = L'e'; @@ -94,25 +95,19 @@ void CBinaryCommand::Accept(_In_ ISerializeCommandVisitor &commandVisitor) commandVisitor.Visit(*this); } -COpndCommand::COpndCommand(_In_ shared_ptr> const &commands, - _In_ bool fNegative, - _In_ bool fDecimal, - _In_ bool fSciFmt) : - m_commands(commands), m_fNegative(fNegative), m_fDecimal(fDecimal), m_fSciFmt(fSciFmt) -{ - m_hnoNum = nullptr; -} +COpndCommand::COpndCommand(shared_ptr> const &commands, bool fNegative, bool fDecimal, bool fSciFmt) : + m_commands(commands), + m_fNegative(fNegative), + m_fDecimal(fDecimal), + m_fSciFmt(fSciFmt), + m_fInitialized(false), + m_value{} +{} - -void COpndCommand::Initialize(_In_ PRAT hNoNum) +void COpndCommand::Initialize(Rational const& rat) { - assert(&m_hnoNum != nullptr); - if (m_hnoNum != nullptr) - { - destroyrat(m_hnoNum); - m_hnoNum = nullptr; - } - DUPRAT(m_hnoNum, hNoNum); + m_value = rat; + m_fInitialized = true; } const shared_ptr> & COpndCommand::GetCommands() const @@ -294,18 +289,16 @@ const wstring & COpndCommand::GetToken(wchar_t decimalSymbol) wstring COpndCommand::GetString(uint32_t radix, int32_t precision, wchar_t decimalSymbol) { - wstring numString{}; - if (m_hnoNum != nullptr) + wstring result{}; + + if (m_fInitialized) { - numString = NumObjToString(m_hnoNum, radix, eNUMOBJ_FMT::FMT_FLOAT, precision); + PRAT valRat = m_value.ToPRAT(); + result = NumObjToString(valRat, radix, eNUMOBJ_FMT::FMT_FLOAT, precision); + destroyrat(valRat); } - return numString; -} - -COpndCommand::~COpndCommand() -{ - destroyrat(m_hnoNum); + return result; } void COpndCommand::Accept(_In_ ISerializeCommandVisitor &commandVisitor) diff --git a/src/CalcManager/ExpressionCommand.h b/src/CalcManager/ExpressionCommand.h index d36c51ab..0953ab26 100644 --- a/src/CalcManager/ExpressionCommand.h +++ b/src/CalcManager/ExpressionCommand.h @@ -1,9 +1,10 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. +// Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. #pragma once #include "ExpressionCommandInterface.h" -#include "Header Files\CalcEngine.h" +#include "Header Files/CalcEngine.h" +#include "Header Files/Rational.h" class CParentheses : public IParenthesisCommand { @@ -48,12 +49,12 @@ private: class COpndCommand : public IOpndCommand { public: - COpndCommand(_In_ std::shared_ptr> const &commands, - _In_ bool fNegative, - _In_ bool fDecimal, - _In_ bool fSciFmt); - ~COpndCommand(); - void Initialize(_In_ PRAT hNoNum); + COpndCommand( + std::shared_ptr> const &commands, + bool fNegative, + bool fDecimal, + bool fSciFmt); + void Initialize(CalcEngine::Rational const& rat); const std::shared_ptr> & GetCommands() const; void SetCommands(std::shared_ptr> const& commands); @@ -73,8 +74,9 @@ private: bool m_fNegative; bool m_fSciFmt; bool m_fDecimal; + bool m_fInitialized; std::wstring m_token; - PRAT m_hnoNum; + CalcEngine::Rational m_value; void ClearAllAndAppendCommand(CalculationManager::Command command); }; diff --git a/src/CalcManager/Header Files/History.h b/src/CalcManager/Header Files/History.h index f885067f..5deb5fff 100644 --- a/src/CalcManager/Header Files/History.h +++ b/src/CalcManager/Header Files/History.h @@ -5,6 +5,7 @@ #include "ICalcDisplay.h" #include "IHistoryDisplay.h" +#include "Rational.h" // maximum depth you can get by precedence. It is just an array's size limit. static constexpr size_t MAXPRECDEPTH = 25; @@ -16,7 +17,7 @@ class CHistoryCollector { public: CHistoryCollector(ICalcDisplay *pCalcDisplay, std::shared_ptr pHistoryDisplay, wchar_t decimalSymbol); // Can throw errors ~CHistoryCollector(); - void AddOpndToHistory(std::wstring_view numStr, PRAT hNoNum, bool fRepetition = false); + void AddOpndToHistory(std::wstring_view numStr, CalcEngine::Rational const& rat, bool fRepetition = false); void RemoveLastOpndFromHistory(); void AddBinOpToHistory(int nOpCode, bool fNoRepetition = true); void ChangeLastBinOp(int nOpCode, bool fPrecInvToHigher);