diff --git a/poincare/src/approximation_helper.cpp b/poincare/src/approximation_helper.cpp index 295c45590..d0f22e9f8 100644 --- a/poincare/src/approximation_helper.cpp +++ b/poincare/src/approximation_helper.cpp @@ -29,12 +29,11 @@ template std::complex ApproximationHelper::TruncateRealOrImagina template Evaluation ApproximationHelper::Map(const ExpressionNode * expression, Context& context, Preferences::AngleUnit angleUnit, ComplexCompute compute) { assert(expression->numberOfChildren() == 1); Evaluation input = expression->childAtIndex(0)->approximate(T(), context, angleUnit); - if (input.node()->type() == EvaluationNode::Type::Complex) { - const ComplexNode * c = static_cast *>(input.node()); - return compute(*c, angleUnit); + if (input.type() == EvaluationNode::Type::Complex) { + return compute(static_cast &>(input).stdComplex(), angleUnit); } else { - assert(input.node()->type() == EvaluationNode::Type::MatrixComplex); - MatrixComplex m = MatrixComplex(static_cast *>(input.node())); + assert(input.type() == EvaluationNode::Type::MatrixComplex); + MatrixComplex m = static_cast &>(input); MatrixComplex result; for (int i = 0; i < m.numberOfChildren(); i++) { result.addChildAtIndexInPlace(compute(m.complexAtIndex(i), angleUnit), i, i); @@ -50,26 +49,18 @@ template Evaluation ApproximationHelper::MapReduce(const Expressi for (int i = 1; i < expression->numberOfChildren(); i++) { Evaluation intermediateResult; Evaluation nextOperandEvaluation = expression->childAtIndex(i)->approximate(T(), context, angleUnit); - if (result.node()->type() == EvaluationNode::Type::Complex && nextOperandEvaluation.node()->type() == EvaluationNode::Type::Complex) { - const ComplexNode * c = static_cast *>(result.node()); - const ComplexNode * d = static_cast *>(nextOperandEvaluation.node()); - intermediateResult = computeOnComplexes(*c, *d); - } else if (result.node()->type() == EvaluationNode::Type::Complex) { - assert(nextOperandEvaluation.node()->type() == EvaluationNode::Type::MatrixComplex); - const ComplexNode * c = static_cast *>(result.node()); - MatrixComplex n = MatrixComplex(static_cast *>(nextOperandEvaluation.node())); - intermediateResult = computeOnComplexAndMatrix(*c, n); - } else if (nextOperandEvaluation.node()->type() == EvaluationNode::Type::Complex) { - assert(result.node()->type() == EvaluationNode::Type::MatrixComplex); - MatrixComplex m = MatrixComplex(static_cast *>(result.node())); - const ComplexNode * d = static_cast *>(nextOperandEvaluation.node()); - intermediateResult = computeOnMatrixAndComplex(m, *d); + if (result.type() == EvaluationNode::Type::Complex && nextOperandEvaluation.type() == EvaluationNode::Type::Complex) { + intermediateResult = computeOnComplexes(static_cast &>(result).stdComplex(), static_cast &>(nextOperandEvaluation).stdComplex()); + } else if (result.type() == EvaluationNode::Type::Complex) { + assert(nextOperandEvaluation.type() == EvaluationNode::Type::MatrixComplex); + intermediateResult = computeOnComplexAndMatrix(static_cast &>(result).stdComplex(), static_cast &>(nextOperandEvaluation)); + } else if (nextOperandEvaluation.type() == EvaluationNode::Type::Complex) { + assert(result.type() == EvaluationNode::Type::MatrixComplex); + intermediateResult = computeOnMatrixAndComplex(static_cast &>(result), static_cast &>(nextOperandEvaluation).stdComplex()); } else { assert(result.node()->type() == EvaluationNode::Type::MatrixComplex); assert(nextOperandEvaluation.node()->type() == EvaluationNode::Type::MatrixComplex); - MatrixComplex m = MatrixComplex(static_cast *>(result.node())); - MatrixComplex n = MatrixComplex(static_cast *>(nextOperandEvaluation.node())); - intermediateResult = computeOnMatrices(m, n); + intermediateResult = computeOnMatrices(static_cast &>(result), static_cast &>(nextOperandEvaluation)); } result = intermediateResult; if (result.isUndefined()) {