diff --git a/apps/calculation/calculation.cpp b/apps/calculation/calculation.cpp index a6d1f518d..b6f8c2d5d 100644 --- a/apps/calculation/calculation.cpp +++ b/apps/calculation/calculation.cpp @@ -15,7 +15,8 @@ Calculation::Calculation() : m_exactOutput(nullptr), m_exactOutputLayout(nullptr), m_approximateOutput(nullptr), - m_approximateOutputLayout(nullptr) + m_approximateOutputLayout(nullptr), + m_equalSign(EqualSign::Unknown) { } @@ -142,6 +143,7 @@ void Calculation::tidy() { delete m_approximateOutputLayout; } m_approximateOutputLayout = nullptr; + m_equalSign = EqualSign::Unknown; } Expression * Calculation::exactOutput(Context * context) { @@ -189,7 +191,10 @@ bool Calculation::shouldDisplayApproximateOutput(Context * context) { return input()->isApproximate(*context); } -bool Calculation::exactAndApproximateDisplayedOutputsAreEqual(Poincare::Context * context) { +Calculation::EqualSign Calculation::exactAndApproximateDisplayedOutputsAreEqual(Poincare::Context * context) { + if (m_equalSign != EqualSign::Unknown) { + return m_equalSign; + } char buffer[k_printedExpressionSize]; approximateOutput(context)->writeTextInBuffer(buffer, k_printedExpressionSize, Preferences::sharedPreferences()->numberOfSignificantDigits()); /* Warning: we cannot use directly the m_approximateOutputText but we have to @@ -198,9 +203,9 @@ bool Calculation::exactAndApproximateDisplayedOutputsAreEqual(Poincare::Context * are not identical. (For example, 0.000025 might be displayed "0.00003" * which requires in an approximative equal) */ Expression * approximateOutput = Expression::ParseAndSimplify(buffer, *context); - bool isEqual = approximateOutput->isIdenticalTo(exactOutput(context)); + m_equalSign = approximateOutput->isIdenticalTo(exactOutput(context)) ? EqualSign::Equal : EqualSign::Approximation; delete approximateOutput; - return isEqual; + return m_equalSign; } } diff --git a/apps/calculation/calculation.h b/apps/calculation/calculation.h index eaf4c6234..ff9b1c8cb 100644 --- a/apps/calculation/calculation.h +++ b/apps/calculation/calculation.h @@ -10,6 +10,11 @@ class CalculationStore; class Calculation { public: + enum class EqualSign : uint8_t { + Unknown, + Approximation, + Equal + }; Calculation(); ~Calculation(); // Delete expression and layout, if needed Calculation& operator=(const Calculation& other); @@ -31,7 +36,7 @@ public: bool isEmpty(); void tidy(); bool shouldDisplayApproximateOutput(Poincare::Context * context); - bool exactAndApproximateDisplayedOutputsAreEqual(Poincare::Context * context); + EqualSign exactAndApproximateDisplayedOutputsAreEqual(Poincare::Context * context); constexpr static int k_printedExpressionSize = 2*::TextField::maxBufferSize(); private: /* Buffers holding text expressions have to be longer than the text written @@ -46,6 +51,7 @@ private: Poincare::ExpressionLayout * m_exactOutputLayout; Poincare::Expression * m_approximateOutput; Poincare::ExpressionLayout * m_approximateOutputLayout; + EqualSign m_equalSign; }; } diff --git a/apps/calculation/history_view_cell.cpp b/apps/calculation/history_view_cell.cpp index a1f6881ee..c0546edd3 100644 --- a/apps/calculation/history_view_cell.cpp +++ b/apps/calculation/history_view_cell.cpp @@ -90,7 +90,7 @@ void HistoryViewCell::setCalculation(Calculation * calculation) { * outputView()->layoutSubviews() is going to fail. */ Poincare::ExpressionLayout * outputExpressions[2] = {calculation->approximateOutputLayout(calculationApp->localContext()), calculation->shouldDisplayApproximateOutput(calculationApp->localContext()) ? nullptr : calculation->exactOutputLayout(calculationApp->localContext())}; m_scrollableOutputView.outputView()->setExpressions(outputExpressions); - I18n::Message equalMessage = calculation->exactAndApproximateDisplayedOutputsAreEqual(calculationApp->localContext()) ? I18n::Message::Equal : I18n::Message::AlmostEqual; + I18n::Message equalMessage = calculation->exactAndApproximateDisplayedOutputsAreEqual(calculationApp->localContext()) == Calculation::EqualSign::Equal ? I18n::Message::Equal : I18n::Message::AlmostEqual; m_scrollableOutputView.outputView()->setEqualMessage(equalMessage); }