From 8f03d672ce4d799d00ea5b9eb7b29025e9335f8d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89milie=20Feral?= Date: Fri, 6 Oct 2017 18:14:46 +0200 Subject: [PATCH] [poincare] Implement Subtraction::simplify Change-Id: If6494c80c3c2c2132fb3f584c720f7b978917a8c --- poincare/include/poincare/subtraction.h | 2 ++ poincare/src/subtraction.cpp | 14 ++++++++++++++ 2 files changed, 16 insertions(+) diff --git a/poincare/include/poincare/subtraction.h b/poincare/include/poincare/subtraction.h index 34659ac55..79ee0f1cc 100644 --- a/poincare/include/poincare/subtraction.h +++ b/poincare/include/poincare/subtraction.h @@ -13,6 +13,8 @@ public: Type type() const override; Expression * clone() const override; template static Complex compute(const Complex c, const Complex d); + /* Simplification */ + void immediateSimplify() override; private: template static Evaluation * computeOnMatrixAndComplex(Evaluation * m, const Complex * c) { return EvaluationEngine::elementWiseOnComplexAndComplexMatrix(c, m, compute); diff --git a/poincare/src/subtraction.cpp b/poincare/src/subtraction.cpp index e499759ef..3c5c779f0 100644 --- a/poincare/src/subtraction.cpp +++ b/poincare/src/subtraction.cpp @@ -4,6 +4,9 @@ extern "C" { } #include +#include +#include +#include #include #include #include "layout/horizontal_layout.h" @@ -25,6 +28,17 @@ Complex Subtraction::compute(const Complex c, const Complex d) { return Complex::Cartesian(c.a()-d.a(), c.b() - d.b()); } +void Subtraction::immediateSimplify() { + const Expression * multOperands[2] = {new Rational(Integer(-1)), operand(1)}; + Multiplication * m = new Multiplication(multOperands, 2, false); + const Expression * addOperands[2] = {operand(0), m}; + Addition * a = new Addition(addOperands, 2, false); + m->immediateSimplify(); + detachOperands(); + replaceWith(a, true); + a->immediateSimplify(); +} + template Evaluation * Subtraction::computeOnComplexAndMatrix(const Complex * c, Evaluation * m) { Evaluation * opposite = computeOnMatrixAndComplex(m, c); Complex * operands = new Complex[opposite->numberOfRows() * opposite->numberOfColumns()];