diff --git a/apps/calculation/calculation.cpp b/apps/calculation/calculation.cpp index 098b602d0..02da02862 100644 --- a/apps/calculation/calculation.cpp +++ b/apps/calculation/calculation.cpp @@ -13,29 +13,14 @@ Calculation::Calculation() : m_inputText(), m_exactOutputText(), m_approximateOutputText(), - m_input(nullptr), - m_exactOutput(nullptr), - m_approximateOutput(nullptr), + m_input(), + m_exactOutput(), + m_approximateOutput(), m_height(-1), m_equalSign(EqualSign::Unknown) { } -Calculation::~Calculation() { - if (m_input != nullptr) { - delete m_input; - m_input = nullptr; - } - if (m_exactOutput != nullptr) { - delete m_exactOutput; - m_exactOutput = nullptr; - } - if (m_approximateOutput != nullptr) { - delete m_approximateOutput; - m_approximateOutput = nullptr; - } -} - Calculation& Calculation::operator=(const Calculation& other) { const char * otherInputText = other.m_inputText; const char * otherExactOutputText = other.m_exactOutputText; @@ -115,18 +100,15 @@ const char * Calculation::approximateOutputText() { return m_approximateOutputText; } -Expression * Calculation::input() { - if (m_input == nullptr) { +Expression Calculation::input() { + if (!m_input.isDefined()) { m_input = Expression::parse(m_inputText); } return m_input; } LayoutRef Calculation::createInputLayout() { - if (input() != nullptr) { - return input()->createLayout(Preferences::PrintFloatMode::Decimal, PrintFloat::k_numberOfStoredSignificantDigits); - } - return LayoutRef(nullptr); + return input().createLayout(Preferences::PrintFloatMode::Decimal, PrintFloat::k_numberOfStoredSignificantDigits); } bool Calculation::isEmpty() { @@ -144,7 +126,8 @@ bool Calculation::isEmpty() { } void Calculation::tidy() { - if (m_input != nullptr) { +// TODO: we might want to do something here? To empty the pool? +/* if (m_input != nullptr) { delete m_input; } m_input = nullptr; @@ -155,52 +138,41 @@ void Calculation::tidy() { if (m_approximateOutput != nullptr) { delete m_approximateOutput; } - m_approximateOutput = nullptr; + m_approximateOutput = nullptr;*/ m_height = -1; m_equalSign = EqualSign::Unknown; } Expression * Calculation::exactOutput(Context * context) { - if (m_exactOutput == nullptr) { + if (!m_exactOutput.isDefined()) { /* Because the angle unit might have changed, we do not simplify again. We * thereby avoid turning cos(Pi/4) into sqrt(2)/2 and displaying * 'sqrt(2)/2 = 0.999906' (which is totally wrong) instead of * 'cos(pi/4) = 0.999906' (which is true in degree). */ m_exactOutput = Expression::parse(m_exactOutputText); - if (m_exactOutput == nullptr) { - m_exactOutput = new Undefined(); + if (!m_exactOutput.isDefined()) { + m_exactOutput = Undefined(); } } return m_exactOutput; } LayoutRef Calculation::createExactOutputLayout(Context * context) { - if (exactOutput(context) != nullptr) { - return PoincareHelpers::CreateLayout(exactOutput(context)); - } - return LayoutRef(nullptr); + return PoincareHelpers::CreateLayout(exactOutput(context)); } Expression * Calculation::approximateOutput(Context * context) { - if (m_approximateOutput == nullptr) { + if (!m_approximateOutput.isDefined()) { /* To ensure that the expression 'm_output' is a matrix or a complex, we * call 'evaluate'. */ - Expression * exp = Expression::parse(m_approximateOutputText); - if (exp != nullptr) { - m_approximateOutput = PoincareHelpers::Approximate(exp, *context); - delete exp; - } else { - m_approximateOutput = new Undefined(); - } + Expression exp = Expression::parse(m_approximateOutputText); + m_approximateOutput = PoincareHelpers::Approximate(exp, *context); } return m_approximateOutput; } LayoutRef Calculation::createApproximateOutputLayout(Context * context) { - if (approximateOutput(context) != nullptr) { - return PoincareHelpers::CreateLayout(approximateOutput(context)); - } - return LayoutRef(nullptr); + return PoincareHelpers::CreateLayout(approximateOutput(context)); } bool Calculation::shouldOnlyDisplayApproximateOutput(Context * context) { @@ -210,14 +182,14 @@ bool Calculation::shouldOnlyDisplayApproximateOutput(Context * context) { if (strcmp(m_exactOutputText, "undef") == 0) { return true; } - return input()->isApproximate(*context); + return input().isApproximate(*context); } Calculation::EqualSign Calculation::exactAndApproximateDisplayedOutputsAreEqual(Poincare::Context * context) { if (m_equalSign != EqualSign::Unknown) { return m_equalSign; } - m_equalSign = exactOutput(context)->isEqualToItsApproximationLayout(approximateOutput(context), k_printedExpressionSize, Preferences::sharedPreferences()->angleUnit(), Preferences::sharedPreferences()->displayMode(), Preferences::sharedPreferences()->numberOfSignificantDigits(), *context) ? EqualSign::Equal : EqualSign::Approximation; + m_equalSign = exactOutput(context).isEqualToItsApproximationLayout(approximateOutput(context), k_printedExpressionSize, Preferences::sharedPreferences()->angleUnit(), Preferences::sharedPreferences()->displayMode(), Preferences::sharedPreferences()->numberOfSignificantDigits(), *context) ? EqualSign::Equal : EqualSign::Approximation; return m_equalSign; } diff --git a/apps/calculation/calculation.h b/apps/calculation/calculation.h index 7e3325780..0a5ba38c0 100644 --- a/apps/calculation/calculation.h +++ b/apps/calculation/calculation.h @@ -16,22 +16,21 @@ public: Equal }; Calculation(); - ~Calculation(); // Delete expression and layout, if needed Calculation& operator=(const Calculation& other); Calculation(const Calculation& other) = delete; Calculation(Calculation&& other) = delete; Calculation& operator=(Calculation&& other) = delete; /* c.reset() is the equivalent of c = Calculation() without copy assingment. */ void reset(); - void setContent(const char * c, Poincare::Context * context, Poincare::Expression * ansExpression); + void setContent(const char * c, Poincare::Context * context, Poincare::Expression ansExpression); KDCoordinate height(Poincare::Context * context); const char * inputText(); const char * exactOutputText(); const char * approximateOutputText(); - Poincare::Expression * input(); + Poincare::Expression input(); Poincare::LayoutRef createInputLayout(); - Poincare::Expression * approximateOutput(Poincare::Context * context); - Poincare::Expression * exactOutput(Poincare::Context * context); + Poincare::Expression approximateOutput(Poincare::Context * context); + Poincare::Expression exactOutput(Poincare::Context * context); Poincare::LayoutRef createExactOutputLayout(Poincare::Context * context); Poincare::LayoutRef createApproximateOutputLayout(Poincare::Context * context); bool isEmpty(); @@ -47,9 +46,9 @@ private: char m_inputText[k_printedExpressionSize]; char m_exactOutputText[k_printedExpressionSize]; char m_approximateOutputText[k_printedExpressionSize]; - Poincare::Expression * m_input; - Poincare::Expression * m_exactOutput; - Poincare::Expression * m_approximateOutput; + Poincare::Expression m_input; + Poincare::Expression m_exactOutput; + Poincare::Expression m_approximateOutput; KDCoordinate m_height; EqualSign m_equalSign; };