diff --git a/poincare/include/poincare/expression.h b/poincare/include/poincare/expression.h index e5a48e375..0413eed06 100644 --- a/poincare/include/poincare/expression.h +++ b/poincare/include/poincare/expression.h @@ -150,7 +150,6 @@ private: /* Evaluation Engine */ virtual Evaluation * privateEvaluate(SinglePrecision p, Context& context, AngleUnit angleUnit) const = 0; virtual Evaluation * privateEvaluate(DoublePrecision p, Context& context, AngleUnit angleUnit) const = 0; - void recursivelySetAsParentOfChildren(); private: Expression * m_parent; }; diff --git a/poincare/include/poincare/matrix_data.h b/poincare/include/poincare/matrix_data.h index 5dc3d1eb8..5390c7791 100644 --- a/poincare/include/poincare/matrix_data.h +++ b/poincare/include/poincare/matrix_data.h @@ -12,7 +12,7 @@ class Complex; class MatrixData { public: MatrixData(ListData * listData, bool clone); - MatrixData(Expression ** newOperands, int numberOfOperands, int m_numberOfRows, int m_numberOfColumns, bool cloneOperands); + MatrixData(Expression ** newOperands, int numberOfOperands, int m_numberOfRows, int m_numberOfColumns, bool cloneOperands, Expression * parent); ~MatrixData(); MatrixData(const MatrixData& other) = delete; MatrixData(MatrixData&& other) = delete; diff --git a/poincare/src/complex_matrix.cpp b/poincare/src/complex_matrix.cpp index f76508af0..55abfb82b 100644 --- a/poincare/src/complex_matrix.cpp +++ b/poincare/src/complex_matrix.cpp @@ -21,6 +21,7 @@ ComplexMatrix::ComplexMatrix(const Complex * complexes, int numberOfRows, m_values = new Complex[numberOfRows*numberOfColumns]; for (int i = 0; i < numberOfRows*numberOfColumns; i++) { m_values[i] = complexes[i]; + m_values[i].setParent(this); } } diff --git a/poincare/src/expression.cpp b/poincare/src/expression.cpp index d18ab884d..26c82b4ab 100644 --- a/poincare/src/expression.cpp +++ b/poincare/src/expression.cpp @@ -32,9 +32,6 @@ Expression * Expression::parse(char const * string) { } poincare_expression_yy_delete_buffer(buf); - if (expression) { - expression->recursivelySetAsParentOfChildren(); - } return expression; } @@ -152,18 +149,6 @@ template T Expression::epsilon() { return epsilon; } -void Expression::recursivelySetAsParentOfChildren() { - if (this->type() == Type::Complex) { - // TODO: this case should be useless once complex is a leaf expression! - return; - } - for (int i=0; i(operand(i)); - child->setParent(this); - child->recursivelySetAsParentOfChildren(); - } -} - } template Poincare::Evaluation * Poincare::Expression::evaluate(Context& context, AngleUnit angleUnit) const; diff --git a/poincare/src/expression_matrix.cpp b/poincare/src/expression_matrix.cpp index f394b67b7..eb0479ed9 100644 --- a/poincare/src/expression_matrix.cpp +++ b/poincare/src/expression_matrix.cpp @@ -18,7 +18,7 @@ ExpressionMatrix::ExpressionMatrix(MatrixData * matrixData) : ExpressionMatrix::ExpressionMatrix(Expression ** newOperands, int numberOfOperands, int numberOfRows, int numberOfColumns, bool cloneOperands) { - m_matrixData = new MatrixData(newOperands, numberOfOperands, numberOfRows, numberOfColumns, cloneOperands); + m_matrixData = new MatrixData(newOperands, numberOfOperands, numberOfRows, numberOfColumns, cloneOperands, this); } ExpressionMatrix::~ExpressionMatrix() { diff --git a/poincare/src/matrix_data.cpp b/poincare/src/matrix_data.cpp index 0489429be..1cb1e63ba 100644 --- a/poincare/src/matrix_data.cpp +++ b/poincare/src/matrix_data.cpp @@ -23,7 +23,7 @@ MatrixData::MatrixData(ListData * listData, bool clone) : } } -MatrixData::MatrixData(Expression ** newOperands, int numberOfOperands, int numberOfRows, int numberOfColumns, bool cloneOperands) : +MatrixData::MatrixData(Expression ** newOperands, int numberOfOperands, int numberOfRows, int numberOfColumns, bool cloneOperands, Expression * parent) : m_numberOfRows(numberOfRows), m_numberOfColumns(numberOfColumns) { @@ -35,6 +35,7 @@ MatrixData::MatrixData(Expression ** newOperands, int numberOfOperands, int numb } else { m_operands[i] = i < numberOfOperands ? newOperands[i] : defaultExpression(); } + const_cast(m_operands[i])->setParent(parent); } } diff --git a/poincare/src/static_hierarchy.cpp b/poincare/src/static_hierarchy.cpp index 1db3bbb92..acb42998c 100644 --- a/poincare/src/static_hierarchy.cpp +++ b/poincare/src/static_hierarchy.cpp @@ -44,12 +44,12 @@ void StaticHierarchy::build(const Expression * const * operands, int numberOf assert(numberOfOperands <= T); for (int i=0; i < numberOfOperands; i++) { assert(operands[i] != nullptr); - const_cast(operands[i])->setParent(this); if (cloneOperands) { m_operands[i] = operands[i]->clone(); } else { m_operands[i] = operands[i]; } + const_cast(m_operands[i])->setParent(this); } }