From f326f16ffbeb2a06d3017a0576eb564772d8ec1b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89milie=20Feral?= Date: Thu, 6 Sep 2018 14:06:21 +0200 Subject: [PATCH] [solver] Fix Equation with new Poincare APi --- apps/solver/equation.cpp | 29 ++++++++++++----------------- apps/solver/equation.h | 4 ++-- poincare/include/poincare/equal.h | 4 ++-- poincare/src/equal.cpp | 10 +++++----- 4 files changed, 21 insertions(+), 26 deletions(-) diff --git a/apps/solver/equation.cpp b/apps/solver/equation.cpp index 91420d39b..b32b288d7 100644 --- a/apps/solver/equation.cpp +++ b/apps/solver/equation.cpp @@ -6,7 +6,7 @@ namespace Solver { Equation::Equation() : Shared::ExpressionModel(), - m_standardForm(nullptr) + m_standardForm() { } @@ -27,33 +27,28 @@ void Equation::setContent(const char * c) { void Equation::tidy() { ExpressionModel::tidy(); - if (m_standardForm) { - delete m_standardForm; - m_standardForm = nullptr; - } + tidyStandardForm(); } -Expression * Equation::standardForm(Context * context) const { - if (m_standardForm == nullptr) { - Expression * e = expression(context); - if (e->type() == ExpressionNode::Type::Equal) { - m_standardForm = static_cast(e)->standardEquation(*context, Preferences::sharedPreferences()->angleUnit()); - } else if (e->type() == ExpressionNode::Type::Rational && static_cast(e)->isOne()) { +Expression Equation::standardForm(Context * context) const { + if (m_standardForm.isUninitialized()) { + const Expression e = expression(context); + if (e.type() == ExpressionNode::Type::Equal) { + m_standardForm = static_cast(e).standardEquation(*context, Preferences::sharedPreferences()->angleUnit()); + } else if (e.type() == ExpressionNode::Type::Rational && static_cast(e).isOne()) { // The equality was reduced which means the equality was always true. - m_standardForm = RationalReference(0); + m_standardForm = Rational(0); } else { // The equality has an undefined operand - assert(e->type() == ExpressionNode::Type::Undefined); + assert(e.type() == ExpressionNode::Type::Undefined); } } return m_standardForm; } void Equation::tidyStandardForm() { - if (m_standardForm) { - delete m_standardForm; - m_standardForm = nullptr; - } + // Free the pool of the m_standardForm + m_standardForm = Expression(); } } diff --git a/apps/solver/equation.h b/apps/solver/equation.h index c888314d5..c4a7c1c63 100644 --- a/apps/solver/equation.h +++ b/apps/solver/equation.h @@ -18,10 +18,10 @@ public: bool shouldBeClearedBeforeRemove() override { return false; } - Poincare::Expression * standardForm(Poincare::Context * context) const; + Poincare::Expression standardForm(Poincare::Context * context) const; private: void tidyStandardForm(); - mutable Poincare::Expression * m_standardForm; + mutable Poincare::Expression m_standardForm; }; } diff --git a/poincare/include/poincare/equal.h b/poincare/include/poincare/equal.h index 170dca933..b50bf750c 100644 --- a/poincare/include/poincare/equal.h +++ b/poincare/include/poincare/equal.h @@ -20,8 +20,6 @@ public: // ExpressionNode Type type() const override { return Type::Equal; } int polynomialDegree(char symbolName) const override { return -1; } - // For the equation A = B, create the reduced expression A-B - Expression standardEquation(Context & context, Preferences::AngleUnit angleUnit) const; private: // Simplification Expression shallowReduce(Context & context, Preferences::AngleUnit angleUnit) override; @@ -42,6 +40,8 @@ public: replaceChildAtIndexInPlace(1, child2); } + // For the equation A = B, create the reduced expression A-B + Expression standardEquation(Context & context, Preferences::AngleUnit angleUnit) const; // Expression Expression shallowReduce(Context & context, Preferences::AngleUnit angleUnit); }; diff --git a/poincare/src/equal.cpp b/poincare/src/equal.cpp index a13a2bd62..4adebe95e 100644 --- a/poincare/src/equal.cpp +++ b/poincare/src/equal.cpp @@ -19,11 +19,6 @@ extern "C" { } namespace Poincare { -Expression EqualNode::standardEquation(Context & context, Preferences::AngleUnit angleUnit) const { - Expression sub = Subtraction(Expression(childAtIndex(0)).clone(), Expression(childAtIndex(1)).clone()); - return sub.deepReduce(context, angleUnit); -} - Expression EqualNode::shallowReduce(Context & context, Preferences::AngleUnit angleUnit) { return Equal(this).shallowReduce(context, angleUnit); } @@ -45,6 +40,11 @@ Evaluation EqualNode::templatedApproximate(Context& context, Preferences::Ang return Complex::Undefined(); } +Expression Equal::standardEquation(Context & context, Preferences::AngleUnit angleUnit) const { + Expression sub = Subtraction(childAtIndex(0).clone(), childAtIndex(1).clone()); + return sub.deepReduce(context, angleUnit); +} + Expression Equal::shallowReduce(Context & context, Preferences::AngleUnit angleUnit) { { Expression e = Expression::defaultShallowReduce(context, angleUnit);