diff --git a/poincare/include/poincare/based_integer.h b/poincare/include/poincare/based_integer.h index a3660e08c..6419be9d9 100644 --- a/poincare/include/poincare/based_integer.h +++ b/poincare/include/poincare/based_integer.h @@ -28,6 +28,7 @@ public: // Expression subclassing Type type() const override { return Type::BasedInteger; } Sign sign(Context * context) const override { return Sign::Positive; } + bool isRationalZero() const override { return integer().isZero(); } // Layout Layout createLayout(Preferences::PrintFloatMode floatDisplayMode, int numberOfSignificantDigits) const override; diff --git a/poincare/include/poincare/decimal.h b/poincare/include/poincare/decimal.h index ee1b0cd5b..ddd4178d5 100644 --- a/poincare/include/poincare/decimal.h +++ b/poincare/include/poincare/decimal.h @@ -43,6 +43,7 @@ public: Type type() const override { return Type::Decimal; } Sign sign(Context * context) const override { return m_negative ? Sign::Negative : Sign::Positive; } Expression setSign(Sign s, ReductionContext reductionContext) override; + bool isRationalZero() const override { return unsignedMantissa().isZero(); } // Approximation Evaluation approximate(SinglePrecision p, Context * context, Preferences::ComplexFormat complexFormat, Preferences::AngleUnit angleUnit) const override { diff --git a/poincare/include/poincare/expression.h b/poincare/include/poincare/expression.h index f94cf79a6..da2f18f67 100644 --- a/poincare/include/poincare/expression.h +++ b/poincare/include/poincare/expression.h @@ -153,7 +153,7 @@ public: ExpressionNode::Sign sign(Context * context) const { return node()->sign(context); } bool isUndefined() const { return node()->type() == ExpressionNode::Type::Undefined || node()->type() == ExpressionNode::Type::Unreal; } bool isNumber() const { return node()->isNumber(); } - bool isRationalZero() const; + bool isRationalZero() const { return node()->isRationalZero(); } bool isRationalOne() const; bool isRandom() const { return node()->isRandom(); } bool isParameteredExpression() const { return node()->isParameteredExpression(); } diff --git a/poincare/include/poincare/expression_node.h b/poincare/include/poincare/expression_node.h index 3393d8d26..741d56274 100644 --- a/poincare/include/poincare/expression_node.h +++ b/poincare/include/poincare/expression_node.h @@ -187,6 +187,7 @@ public: virtual Sign sign(Context * context) const { return Sign::Unknown; } virtual bool isNumber() const { return false; } + virtual bool isRationalZero() const { return false; } virtual bool isRandom() const { return false; } virtual bool isParameteredExpression() const { return false; } /* childAtIndexNeedsUserParentheses checks if parentheses are required by mathematical rules: diff --git a/poincare/include/poincare/float.h b/poincare/include/poincare/float.h index 400e3cc48..3f9011e5b 100644 --- a/poincare/include/poincare/float.h +++ b/poincare/include/poincare/float.h @@ -40,6 +40,7 @@ public: Sign sign(Context * context) const override { return m_value < 0 ? Sign::Negative : Sign::Positive; } Expression setSign(Sign s, ReductionContext reductionContext) override; int simplificationOrderSameType(const ExpressionNode * e, bool ascending, bool canBeInterrupted, bool ignoreParentheses) const override; + bool isRationalZero() const override { return m_value == 0.0; } // Layout int serialize(char * buffer, int bufferSize, Preferences::PrintFloatMode floatDisplayMode, int numberOfSignificantDigits) const override; diff --git a/poincare/include/poincare/rational.h b/poincare/include/poincare/rational.h index c1af28415..6774aa183 100644 --- a/poincare/include/poincare/rational.h +++ b/poincare/include/poincare/rational.h @@ -17,6 +17,7 @@ public: bool isNegative() const { return m_negative; } void setNegative(bool negative) { m_negative = negative; } bool isInteger() const { return denominator().isOne(); } + bool isRationalZero() const override { return isZero(); } // TreeNode size_t size() const override; diff --git a/poincare/src/expression.cpp b/poincare/src/expression.cpp index cc407c892..a389510e2 100644 --- a/poincare/src/expression.cpp +++ b/poincare/src/expression.cpp @@ -79,10 +79,6 @@ Expression Expression::childAtIndex(int i) const { /* Properties */ -bool Expression::isRationalZero() const { - return type() == ExpressionNode::Type::Rational && convert().isZero(); -} - bool Expression::isRationalOne() const { return type() == ExpressionNode::Type::Rational && convert().isOne(); }