diff --git a/poincare/include/poincare/multiplication.h b/poincare/include/poincare/multiplication.h index 6bd01888a..32b1c224b 100644 --- a/poincare/include/poincare/multiplication.h +++ b/poincare/include/poincare/multiplication.h @@ -19,6 +19,8 @@ public: template static Evaluation * computeOnMatrices(Evaluation * m, Evaluation * n); static bool HaveSameNonRationalFactors(const Expression * e1, const Expression * e2); + /* Simplification */ + void immediateSimplify() override; private: template static Evaluation * computeOnMatrixAndComplex(Evaluation * m, const Complex * c) { return EvaluationEngine::elementWiseOnComplexAndComplexMatrix(c, m, compute); @@ -33,7 +35,6 @@ private: return LayoutEngine::createInfixLayout(this, floatDisplayMode, complexFormat, "*"); } /* Simplification */ - void immediateSimplify() override; void factorizeChildren(Expression * e1, Expression * e2); void distributeOnChildAtIndex(int index); static bool TermsHaveIdenticalBase(const Expression * e1, const Expression * e2); diff --git a/poincare/include/poincare/opposite.h b/poincare/include/poincare/opposite.h index 1d4820086..a3910b8f8 100644 --- a/poincare/include/poincare/opposite.h +++ b/poincare/include/poincare/opposite.h @@ -13,6 +13,8 @@ public: Expression * clone() const override; Type type() const override; template static Complex compute(const Complex c, AngleUnit angleUnit); + /* Simplification */ + void immediateSimplify() override; private: virtual Evaluation * privateEvaluate(SinglePrecision p, Context& context, AngleUnit angleUnit) const override { return EvaluationEngine::map(this, context, angleUnit, compute); diff --git a/poincare/src/opposite.cpp b/poincare/src/opposite.cpp index de73243b0..4fe2247c9 100644 --- a/poincare/src/opposite.cpp +++ b/poincare/src/opposite.cpp @@ -1,6 +1,8 @@ #include #include #include +#include +#include extern "C" { #include #include @@ -26,6 +28,14 @@ Complex Opposite::compute(const Complex c, AngleUnit angleUnit) { return Complex::Cartesian(-c.a(), -c.b()); } +void Opposite::immediateSimplify() { + const Expression * multOperands[2] = {new Rational(Integer(-1)), operand(0)}; + detachOperand(operand(0)); + Multiplication * m = new Multiplication(multOperands, 2, false); + replaceWith(m, true); + m->immediateSimplify(); +} + ExpressionLayout * Opposite::privateCreateLayout(FloatDisplayMode floatDisplayMode, ComplexFormat complexFormat) const { assert(floatDisplayMode != FloatDisplayMode::Default); assert(complexFormat != ComplexFormat::Default);