[poincare] Implement Subtraction::simplify

Change-Id: If6494c80c3c2c2132fb3f584c720f7b978917a8c
This commit is contained in:
Émilie Feral
2017-10-06 18:14:46 +02:00
parent 3ee128062c
commit 8f03d672ce
2 changed files with 16 additions and 0 deletions

View File

@@ -13,6 +13,8 @@ public:
Type type() const override;
Expression * clone() const override;
template<typename T> static Complex<T> compute(const Complex<T> c, const Complex<T> d);
/* Simplification */
void immediateSimplify() override;
private:
template<typename T> static Evaluation<T> * computeOnMatrixAndComplex(Evaluation<T> * m, const Complex<T> * c) {
return EvaluationEngine::elementWiseOnComplexAndComplexMatrix(c, m, compute<T>);

View File

@@ -4,6 +4,9 @@ extern "C" {
}
#include <poincare/subtraction.h>
#include <poincare/multiplication.h>
#include <poincare/rational.h>
#include <poincare/addition.h>
#include <poincare/opposite.h>
#include <poincare/complex_matrix.h>
#include "layout/horizontal_layout.h"
@@ -25,6 +28,17 @@ Complex<T> Subtraction::compute(const Complex<T> c, const Complex<T> d) {
return Complex<T>::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<typename T> Evaluation<T> * Subtraction::computeOnComplexAndMatrix(const Complex<T> * c, Evaluation<T> * m) {
Evaluation<T> * opposite = computeOnMatrixAndComplex(m, c);
Complex<T> * operands = new Complex<T>[opposite->numberOfRows() * opposite->numberOfColumns()];