diff --git a/poincare/include/poincare/division_remainder.h b/poincare/include/poincare/division_remainder.h index c8be715b2..66049634f 100644 --- a/poincare/include/poincare/division_remainder.h +++ b/poincare/include/poincare/division_remainder.h @@ -51,4 +51,3 @@ public: } #endif - diff --git a/poincare/include/poincare/expression.h b/poincare/include/poincare/expression.h index 8e9aa48e4..f243b42b0 100644 --- a/poincare/include/poincare/expression.h +++ b/poincare/include/poincare/expression.h @@ -29,6 +29,7 @@ class Expression : public TreeByReference { friend class Determinant; friend class Division; friend class DivisionQuotient; + friend class DivisionRemainder; friend class Sine; friend class Tangent; diff --git a/poincare/src/division_remainder.cpp b/poincare/src/division_remainder.cpp index 77d0d83d4..fb3058832 100644 --- a/poincare/src/division_remainder.cpp +++ b/poincare/src/division_remainder.cpp @@ -38,9 +38,11 @@ Evaluation DivisionRemainderNode::templatedApproximate(Context& context, Pref return Complex(std::round(f1-f2*std::floor(f1/f2))); } Expression DivisionRemainder::shallowReduce(Context & context, Preferences::AngleUnit angleUnit) { - Expression e = Expression::defaultShallowReduce(context, angleUnit); - if (e.isUndefinedOrAllocationFailure()) { - return e; + { + Expression e = Expression::defaultShallowReduce(context, angleUnit); + if (e.isUndefinedOrAllocationFailure()) { + return e; + } } Expression c0 = childAtIndex(0); Expression c1 = childAtIndex(1); @@ -52,13 +54,17 @@ Expression DivisionRemainder::shallowReduce(Context & context, Preferences::Angl if (c0.type() == ExpressionNode::Type::Rational) { Rational r0 = static_cast(c0); if (!r0.integerDenominator().isOne()) { - return Undefined(); + Expression result = Undefined(); + replaceWithInPlace(result); + return result; } } if (c1.type() == ExpressionNode::Type::Rational) { Rational r1 = static_cast(c1); if (!r1.integerDenominator().isOne()) { - return Undefined(); + Expression result = Undefined(); + replaceWithInPlace(result); + return result; } } if (c0.type() != ExpressionNode::Type::Rational || c1.type() != ExpressionNode::Type::Rational) { @@ -70,11 +76,15 @@ Expression DivisionRemainder::shallowReduce(Context & context, Preferences::Angl Integer a = r0.signedIntegerNumerator(); Integer b = r1.signedIntegerNumerator(); if (b.isZero()) { - return Infinity(a.isNegative()); + Expression result = Infinity(a.isNegative()); + replaceWithInPlace(result); + return result; } Integer result = Integer::Division(a, b).remainder; assert(!result.isInfinity()); - return Rational(result); + Expression rationalResult = Rational(result); + replaceWithInPlace(rationalResult); + return rationalResult; } }