diff --git a/apps/shared/store_controller.cpp b/apps/shared/store_controller.cpp index 1ef6b6a0e..24ee2258a 100644 --- a/apps/shared/store_controller.cpp +++ b/apps/shared/store_controller.cpp @@ -266,7 +266,8 @@ bool StoreController::privateFillColumnWithFormula(Expression formula, Expressio // Fetch the series used in the formula to compute the size of the filled in series char variables[Expression::k_maxNumberOfVariables]; variables[0] = 0; - formula.getVariables(isVariable, variables); + AppsContainer * appsContainer = ((TextFieldDelegateApp *)app())->container(); + formula.getVariables(*(appsContainer->globalContext()), isVariable, variables); int numberOfValuesToCompute = -1; int index = 0; while (variables[index] != 0) { diff --git a/apps/solver/equation_store.cpp b/apps/solver/equation_store.cpp index 765dd69e0..109ca304e 100644 --- a/apps/solver/equation_store.cpp +++ b/apps/solver/equation_store.cpp @@ -107,7 +107,7 @@ EquationStore::Error EquationStore::exactSolve(Poincare::Context * context) { if (e.isUninitialized() || e.type() == ExpressionNode::Type::Undefined) { return Error::EquationUndefined; } - numberOfVariables = definedModelAtIndex(i)->standardForm(context).getVariables(Symbol::isVariableSymbol, m_variables); + numberOfVariables = definedModelAtIndex(i)->standardForm(context).getVariables(*context, Symbol::isVariableSymbol, m_variables); if (numberOfVariables < 0) { return Error::TooManyVariables; } diff --git a/poincare/include/poincare/addition.h b/poincare/include/poincare/addition.h index 3464d08da..e1e40f5af 100644 --- a/poincare/include/poincare/addition.h +++ b/poincare/include/poincare/addition.h @@ -26,8 +26,8 @@ public: // Properties Type type() const override { return Type::Addition; } - int polynomialDegree(char symbolName) const override; - int getPolynomialCoefficients(char symbolName, Expression coefficients[]) const override; + int polynomialDegree(Context & context, char symbolName) const override; + int getPolynomialCoefficients(Context & context, char symbolName, Expression coefficients[]) const override; // Evaluation template static Complex compute(const std::complex c, const std::complex d) { return Complex(c+d); } @@ -81,7 +81,7 @@ public: // Expression Expression shallowReduce(Context & context, Preferences::AngleUnit angleUnit); Expression shallowBeautify(Context & context, Preferences::AngleUnit angleUnit); - int getPolynomialCoefficients(char symbolName, Expression coefficients[]) const; + int getPolynomialCoefficients(Context & context, char symbolName, Expression coefficients[]) const; private: static const Number NumeralFactor(const Expression & e); static inline int NumberOfNonNumeralFactors(const Expression & e); diff --git a/poincare/include/poincare/confidence_interval.h b/poincare/include/poincare/confidence_interval.h index c58e48414..73190ec38 100644 --- a/poincare/include/poincare/confidence_interval.h +++ b/poincare/include/poincare/confidence_interval.h @@ -21,7 +21,7 @@ public: // Properties Type type() const override { return Type::ConfidenceInterval; } - int polynomialDegree(char symbolName) const override { return -1; } + int polynomialDegree(Context & context, char symbolName) const override { return -1; } private: // Layout Layout createLayout(Preferences::PrintFloatMode floatDisplayMode, int numberOfSignificantDigits) const override; diff --git a/poincare/include/poincare/derivative.h b/poincare/include/poincare/derivative.h index 727b9a9b1..fce78d995 100644 --- a/poincare/include/poincare/derivative.h +++ b/poincare/include/poincare/derivative.h @@ -22,7 +22,7 @@ public: // Properties Type type() const override { return Type::Derivative; } - int polynomialDegree(char symbolName) const override; + int polynomialDegree(Context & context, char symbolName) const override; private: // Layout diff --git a/poincare/include/poincare/division.h b/poincare/include/poincare/division.h index ade48ae34..5162499aa 100644 --- a/poincare/include/poincare/division.h +++ b/poincare/include/poincare/division.h @@ -25,7 +25,7 @@ public: // Properties Type type() const override { return Type::Division; } - int polynomialDegree(char symbolName) const override; + int polynomialDegree(Context & context, char symbolName) const override; // Approximation virtual Evaluation approximate(SinglePrecision p, Context& context, Preferences::AngleUnit angleUnit) const override { diff --git a/poincare/include/poincare/equal.h b/poincare/include/poincare/equal.h index 20befcd5b..6883aee27 100644 --- a/poincare/include/poincare/equal.h +++ b/poincare/include/poincare/equal.h @@ -19,7 +19,7 @@ public: // ExpressionNode Type type() const override { return Type::Equal; } - int polynomialDegree(char symbolName) const override { return -1; } + int polynomialDegree(Context & context, char symbolName) const override { return -1; } private: // Simplification Expression shallowReduce(Context & context, Preferences::AngleUnit angleUnit) override; diff --git a/poincare/include/poincare/expression.h b/poincare/include/poincare/expression.h index ed77f3044..5c3961871 100644 --- a/poincare/include/poincare/expression.h +++ b/poincare/include/poincare/expression.h @@ -121,14 +121,14 @@ public: /* polynomialDegree returns: * - (-1) if the expression is not a polynome * - the degree of the polynome otherwise */ - int polynomialDegree(char symbolName) const { return this->node()->polynomialDegree(symbolName); } + int polynomialDegree(Context & context, char symbolName) const { return this->node()->polynomialDegree(context, symbolName); } /* getVariables fills the table variables with the variable present in the * expression and returns the number of entries in filled in variables. * For instance getVariables('x+y+2*w/cos(4)') would result in * variables = « xyw » and would return 3. If the final number of * variables would overflow the maxNumberOfVariables, getVariables return -1 */ static constexpr int k_maxNumberOfVariables = 6; - int getVariables(ExpressionNode::isVariableTest isVariable, char * variables) const { return node()->getVariables(isVariable, variables); } + int getVariables(Context & context, ExpressionNode::isVariableTest isVariable, char * variables) const { return node()->getVariables(context, isVariable, variables); } static bool DependsOnVariables(const Expression e, Context & context); /* getLinearCoefficients return false if the expression is not linear with * the variables hold in 'variables'. Otherwise, it fills 'coefficients' with @@ -213,7 +213,7 @@ protected: void removeChildrenInPlace(int currentNumberOfChildren) = delete; /* Properties */ - int getPolynomialCoefficients(char symbolName, Expression coefficients[]) const { return node()->getPolynomialCoefficients(symbolName, coefficients); } + int getPolynomialCoefficients(Context & context, char symbolName, Expression coefficients[]) const { return node()->getPolynomialCoefficients(context, symbolName, coefficients); } /* Simplification */ Expression denominator(Context & context, Preferences::AngleUnit angleUnit) const { return node()->denominator(context, angleUnit); } @@ -231,7 +231,7 @@ private: /* Properties */ Expression defaultReplaceSymbolWithExpression(char symbol, Expression expression); - int defaultGetPolynomialCoefficients(char symbol, Expression expression[]) const; + int defaultGetPolynomialCoefficients(Context & context, char symbol, Expression expression[]) const; /* Expression roots/extrema solver*/ constexpr static double k_solverPrecision = 1.0E-5; diff --git a/poincare/include/poincare/expression_node.h b/poincare/include/poincare/expression_node.h index 977c7bb85..f91f46ebf 100644 --- a/poincare/include/poincare/expression_node.h +++ b/poincare/include/poincare/expression_node.h @@ -100,10 +100,10 @@ public: virtual bool isNumber() const { return false; } /*!*/ virtual Expression replaceSymbolWithExpression(char symbol, Expression & expression); /*!*/ virtual Expression setSign(Sign s, Context & context, Preferences::AngleUnit angleUnit); - virtual int polynomialDegree(char symbolName) const; - /*!*/ virtual int getPolynomialCoefficients(char symbolName, Expression coefficients[]) const; + virtual int polynomialDegree(Context & context, char symbolName) const; + /*!*/ virtual int getPolynomialCoefficients(Context & context, char symbolName, Expression coefficients[]) const; typedef bool (*isVariableTest)(char c); - virtual int getVariables(isVariableTest isVariable, char * variables) const; + virtual int getVariables(Context & context, isVariableTest isVariable, char * variables) const; virtual float characteristicXRange(Context & context, Preferences::AngleUnit angleUnit) const; bool isOfType(Type * types, int length) const; diff --git a/poincare/include/poincare/integral.h b/poincare/include/poincare/integral.h index 2fed35e8e..df3431225 100644 --- a/poincare/include/poincare/integral.h +++ b/poincare/include/poincare/integral.h @@ -19,7 +19,7 @@ public: // ExpressionNode Type type() const override { return Type::Integral; } - int polynomialDegree(char symbolName) const override; + int polynomialDegree(Context & context, char symbolName) const override; private: // Layout Layout createLayout(Preferences::PrintFloatMode floatDisplayMode, int numberOfSignificantDigits) const override; diff --git a/poincare/include/poincare/matrix.h b/poincare/include/poincare/matrix.h index 66b525af9..6b1930000 100644 --- a/poincare/include/poincare/matrix.h +++ b/poincare/include/poincare/matrix.h @@ -36,7 +36,7 @@ public: // Properties Type type() const override { return Type::Matrix; } - int polynomialDegree(char symbolName) const override; + int polynomialDegree(Context & context, char symbolName) const override; // Approximation Evaluation approximate(SinglePrecision p, Context& context, Preferences::AngleUnit angleUnit) const override { diff --git a/poincare/include/poincare/multiplication.h b/poincare/include/poincare/multiplication.h index b0bba7993..1616d1acc 100644 --- a/poincare/include/poincare/multiplication.h +++ b/poincare/include/poincare/multiplication.h @@ -22,8 +22,8 @@ public: // Properties Type type() const override { return Type::Multiplication; } Sign sign() const override; - int polynomialDegree(char symbolName) const override; - int getPolynomialCoefficients(char symbolName, Expression coefficients[]) const override; + int polynomialDegree(Context & context, char symbolName) const override; + int getPolynomialCoefficients(Context & context, char symbolName, Expression coefficients[]) const override; // Approximation template static Complex compute(const std::complex c, const std::complex d) { return Complex(c*d); } @@ -83,7 +83,7 @@ public: Expression setSign(ExpressionNode::Sign s, Context & context, Preferences::AngleUnit angleUnit); Expression shallowReduce(Context & context, Preferences::AngleUnit angleUnit); Expression shallowBeautify(Context & context, Preferences::AngleUnit angleUnit); - int getPolynomialCoefficients(char symbolName, Expression coefficients[]) const; + int getPolynomialCoefficients(Context & context, char symbolName, Expression coefficients[]) const; Expression denominator(Context & context, Preferences::AngleUnit angleUnit) const; private: // Simplification diff --git a/poincare/include/poincare/opposite.h b/poincare/include/poincare/opposite.h index f4d4fe4c9..60a8a59a0 100644 --- a/poincare/include/poincare/opposite.h +++ b/poincare/include/poincare/opposite.h @@ -24,7 +24,7 @@ public: // Properties Type type() const override { return Type::Opposite; } - int polynomialDegree(char symbolName) const override; + int polynomialDegree(Context & context, char symbolName) const override; Sign sign() const override; // Approximation diff --git a/poincare/include/poincare/parenthesis.h b/poincare/include/poincare/parenthesis.h index ff242ea14..54a93734b 100644 --- a/poincare/include/poincare/parenthesis.h +++ b/poincare/include/poincare/parenthesis.h @@ -20,7 +20,7 @@ public: // Properties Type type() const override { return Type::Parenthesis; } - int polynomialDegree(char symbolName) const override; + int polynomialDegree(Context & context, char symbolName) const override; // Layout Layout createLayout(Preferences::PrintFloatMode floatDisplayMode, int numberOfSignificantDigits) const override; diff --git a/poincare/include/poincare/power.h b/poincare/include/poincare/power.h index f7c06261d..4e130b0df 100644 --- a/poincare/include/poincare/power.h +++ b/poincare/include/poincare/power.h @@ -27,8 +27,8 @@ public: Sign sign() const override; Expression setSign(Sign s, Context & context, Preferences::AngleUnit angleUnit) override; - int polynomialDegree(char symbolName) const override; - int getPolynomialCoefficients(char symbolName, Expression coefficients[]) const override; + int polynomialDegree(Context & context, char symbolName) const override; + int getPolynomialCoefficients(Context & context, char symbolName, Expression coefficients[]) const override; template static Complex compute(const std::complex c, const std::complex d); @@ -70,7 +70,7 @@ public: Power(Expression base, Expression exponent); Power(const PowerNode * n) : Expression(n) {} Expression setSign(ExpressionNode::Sign s, Context & context, Preferences::AngleUnit angleUnit); - int getPolynomialCoefficients(char symbolName, Expression coefficients[]) const; + int getPolynomialCoefficients(Context & context, char symbolName, Expression coefficients[]) const; Expression shallowReduce(Context & context, Preferences::AngleUnit angleUnit); Expression shallowBeautify(Context & context, Preferences::AngleUnit angleUnit); diff --git a/poincare/include/poincare/prediction_interval.h b/poincare/include/poincare/prediction_interval.h index 3413ed2f2..f8931af6c 100644 --- a/poincare/include/poincare/prediction_interval.h +++ b/poincare/include/poincare/prediction_interval.h @@ -23,7 +23,7 @@ public: // Properties Type type() const override { return Type::PredictionInterval; } - int polynomialDegree(char symbolName) const override { return -1; } + int polynomialDegree(Context & context, char symbolName) const override { return -1; } private: // Layout Layout createLayout(Preferences::PrintFloatMode floatDisplayMode, int numberOfSignificantDigits) const override; diff --git a/poincare/include/poincare/store.h b/poincare/include/poincare/store.h index 0991a881b..4fcce4c7d 100644 --- a/poincare/include/poincare/store.h +++ b/poincare/include/poincare/store.h @@ -22,7 +22,7 @@ public: // ExpressionNode Type type() const override { return Type::Store; } - int polynomialDegree(char symbolName) const override { return -1; } + int polynomialDegree(Context & context, char symbolName) const override { return -1; } private: // Simplification diff --git a/poincare/include/poincare/subtraction.h b/poincare/include/poincare/subtraction.h index fdfb5192c..f7a50553c 100644 --- a/poincare/include/poincare/subtraction.h +++ b/poincare/include/poincare/subtraction.h @@ -23,7 +23,7 @@ public: // Properties Type type() const override { return Type::Subtraction; } - int polynomialDegree(char symbolName) const override; + int polynomialDegree(Context & context, char symbolName) const override; // Approximation template static Complex compute(const std::complex c, const std::complex d) { return Complex(c - d); } diff --git a/poincare/include/poincare/symbol.h b/poincare/include/poincare/symbol.h index df47d2134..fbd57ced1 100644 --- a/poincare/include/poincare/symbol.h +++ b/poincare/include/poincare/symbol.h @@ -30,9 +30,9 @@ public: Type type() const override { return Type::Symbol; } Sign sign() const override; Expression replaceSymbolWithExpression(char symbol, Expression & expression) override; - int polynomialDegree(char symbolName) const override; - int getPolynomialCoefficients(char symbolName, Expression coefficients[]) const override; - int getVariables(isVariableTest isVariable, char * variables) const override; + int polynomialDegree(Context & context, char symbolName) const override; + int getPolynomialCoefficients(Context & context, char symbolName, Expression coefficients[]) const override; + int getVariables(Context & context, isVariableTest isVariable, char * variables) const override; float characteristicXRange(Context & context, Preferences::AngleUnit angleUnit) const override; /* Comparison */ @@ -111,7 +111,7 @@ public: // Expression Expression shallowReduce(Context & context, Preferences::AngleUnit angleUnit); Expression replaceSymbolWithExpression(char symbol, Expression & expression); - int getPolynomialCoefficients(char symbolName, Expression coefficients[]) const; + int getPolynomialCoefficients(Context & context, char symbolName, Expression coefficients[]) const; // Symbol char name() const { return node()->name(); } diff --git a/poincare/include/poincare/undefined.h b/poincare/include/poincare/undefined.h index 20b00c22d..14f0626cf 100644 --- a/poincare/include/poincare/undefined.h +++ b/poincare/include/poincare/undefined.h @@ -18,7 +18,7 @@ public: // Properties Type type() const override { return Type::Undefined; } - int polynomialDegree(char symbolName) const override; + int polynomialDegree(Context & context, char symbolName) const override; Expression setSign(Sign s, Context & context, Preferences::AngleUnit angleUnit) override; // Approximation diff --git a/poincare/src/addition.cpp b/poincare/src/addition.cpp index a09374e41..ccf4739c0 100644 --- a/poincare/src/addition.cpp +++ b/poincare/src/addition.cpp @@ -9,10 +9,10 @@ namespace Poincare { -int AdditionNode::polynomialDegree(char symbolName) const { +int AdditionNode::polynomialDegree(Context & context, char symbolName) const { int degree = 0; for (ExpressionNode * e : children()) { - int d = e->polynomialDegree(symbolName); + int d = e->polynomialDegree(context, symbolName); if (d < 0) { return -1; } @@ -21,8 +21,8 @@ int AdditionNode::polynomialDegree(char symbolName) const { return degree; } -int AdditionNode::getPolynomialCoefficients(char symbolName, Expression coefficients[]) const { - return Addition(this).getPolynomialCoefficients(symbolName, coefficients); +int AdditionNode::getPolynomialCoefficients(Context & context, char symbolName, Expression coefficients[]) const { + return Addition(this).getPolynomialCoefficients(context, symbolName, coefficients); } // Private @@ -60,8 +60,8 @@ const Number Addition::NumeralFactor(const Expression & e) { return Rational(1); } -int Addition::getPolynomialCoefficients(char symbolName, Expression coefficients[]) const { - int deg = polynomialDegree(symbolName); +int Addition::getPolynomialCoefficients(Context & context, char symbolName, Expression coefficients[]) const { + int deg = polynomialDegree(context, symbolName); if (deg < 0 || deg > Expression::k_maxPolynomialDegree) { return -1; } @@ -70,7 +70,7 @@ int Addition::getPolynomialCoefficients(char symbolName, Expression coefficients } Expression intermediateCoefficients[Expression::k_maxNumberOfPolynomialCoefficients]; for (int i = 0; i < numberOfChildren(); i++) { - int d = childAtIndex(i).getPolynomialCoefficients(symbolName, intermediateCoefficients); + int d = childAtIndex(i).getPolynomialCoefficients(context, symbolName, intermediateCoefficients); assert(d < Expression::k_maxNumberOfPolynomialCoefficients); for (int j = 0; j < d+1; j++) { static_cast(coefficients[j]).addChildAtIndexInPlace(intermediateCoefficients[j], coefficients[j].numberOfChildren(), coefficients[j].numberOfChildren()); diff --git a/poincare/src/derivative.cpp b/poincare/src/derivative.cpp index 277d09c6c..5788ce054 100644 --- a/poincare/src/derivative.cpp +++ b/poincare/src/derivative.cpp @@ -8,15 +8,15 @@ namespace Poincare { -int DerivativeNode::polynomialDegree(char symbolName) const { - if (childAtIndex(0)->polynomialDegree(symbolName) == 0 - && childAtIndex(1)->polynomialDegree(symbolName) == 0) +int DerivativeNode::polynomialDegree(Context & context, char symbolName) const { + if (childAtIndex(0)->polynomialDegree(context, symbolName) == 0 + && childAtIndex(1)->polynomialDegree(context, symbolName) == 0) { // If no child depends on the symbol, the polynomial degree is 0. return 0; } // If one of the children depends on the symbol, we do not know the degree. - return ExpressionNode::polynomialDegree(symbolName); + return ExpressionNode::polynomialDegree(context, symbolName); } Expression DerivativeNode::shallowReduce(Context & context, Preferences::AngleUnit angleUnit) { diff --git a/poincare/src/division.cpp b/poincare/src/division.cpp index ac6cd7365..1343afd30 100644 --- a/poincare/src/division.cpp +++ b/poincare/src/division.cpp @@ -11,11 +11,11 @@ namespace Poincare { -int DivisionNode::polynomialDegree(char symbolName) const { - if (childAtIndex(1)->polynomialDegree(symbolName) != 0) { +int DivisionNode::polynomialDegree(Context & context, char symbolName) const { + if (childAtIndex(1)->polynomialDegree(context, symbolName) != 0) { return -1; } - return childAtIndex(0)->polynomialDegree(symbolName); + return childAtIndex(0)->polynomialDegree(context, symbolName); } bool DivisionNode::childNeedsParenthesis(const TreeNode * child) const { diff --git a/poincare/src/expression.cpp b/poincare/src/expression.cpp index 6a9c1d3b1..155494c69 100644 --- a/poincare/src/expression.cpp +++ b/poincare/src/expression.cpp @@ -109,7 +109,7 @@ bool Expression::getLinearCoefficients(char * variables, Expression coefficients assert(!recursivelyMatches(IsMatrix, context)); char * x = variables; while (*x != 0) { - int degree = polynomialDegree(*x); + int degree = polynomialDegree(context, *x); if (degree > 1 || degree < 0) { return false; } @@ -193,8 +193,8 @@ Expression Expression::defaultReplaceSymbolWithExpression(char symbol, Expressio return *this; } -int Expression::defaultGetPolynomialCoefficients(char symbol, Expression coefficients[]) const { - int deg = polynomialDegree(symbol); +int Expression::defaultGetPolynomialCoefficients(Context & context, char symbol, Expression coefficients[]) const { + int deg = polynomialDegree(context, symbol); if (deg == 0) { coefficients[0] = clone(); return 0; @@ -203,7 +203,7 @@ int Expression::defaultGetPolynomialCoefficients(char symbol, Expression coeffic } int Expression::getPolynomialReducedCoefficients(char symbolName, Expression coefficients[], Context & context, Preferences::AngleUnit angleUnit) const { - int degree = getPolynomialCoefficients(symbolName, coefficients); + int degree = getPolynomialCoefficients(context, symbolName, coefficients); for (int i = 0; i <= degree; i++) { coefficients[i] = coefficients[i].deepReduce(context, angleUnit); } diff --git a/poincare/src/expression_node.cpp b/poincare/src/expression_node.cpp index 14e9e6151..ad40105fd 100644 --- a/poincare/src/expression_node.cpp +++ b/poincare/src/expression_node.cpp @@ -13,23 +13,23 @@ Expression ExpressionNode::setSign(Sign s, Context & context, Preferences::Angle return Expression(); } -int ExpressionNode::polynomialDegree(char symbolName) const { +int ExpressionNode::polynomialDegree(Context & context, char symbolName) const { for (ExpressionNode * c : children()) { - if (c->polynomialDegree(symbolName) != 0) { + if (c->polynomialDegree(context, symbolName) != 0) { return -1; } } return 0; } -int ExpressionNode::getPolynomialCoefficients(char symbolName, Expression coefficients[]) const { - return Expression(this).defaultGetPolynomialCoefficients(symbolName, coefficients); +int ExpressionNode::getPolynomialCoefficients(Context & context, char symbolName, Expression coefficients[]) const { + return Expression(this).defaultGetPolynomialCoefficients(context, symbolName, coefficients); } -int ExpressionNode::getVariables(isVariableTest isVariable, char * variables) const { +int ExpressionNode::getVariables(Context & context, isVariableTest isVariable, char * variables) const { int numberOfVariables = 0; for (ExpressionNode * c : children()) { - int n = c->getVariables(isVariable, variables); + int n = c->getVariables(context, isVariable, variables); if (n < 0) { return -1; } diff --git a/poincare/src/integral.cpp b/poincare/src/integral.cpp index 0a9318f5d..bf826889e 100644 --- a/poincare/src/integral.cpp +++ b/poincare/src/integral.cpp @@ -9,15 +9,15 @@ namespace Poincare { -int IntegralNode::polynomialDegree(char symbolName) const { - if (childAtIndex(0)->polynomialDegree(symbolName) == 0 - && childAtIndex(1)->polynomialDegree(symbolName) == 0 - && childAtIndex(2)->polynomialDegree(symbolName) == 0) +int IntegralNode::polynomialDegree(Context & context, char symbolName) const { + if (childAtIndex(0)->polynomialDegree(context, symbolName) == 0 + && childAtIndex(1)->polynomialDegree(context, symbolName) == 0 + && childAtIndex(2)->polynomialDegree(context, symbolName) == 0) { // If no child depends on the symbol, the polynomial degree is 0. return 0; } - return ExpressionNode::polynomialDegree(symbolName); + return ExpressionNode::polynomialDegree(context, symbolName); } Layout IntegralNode::createLayout(Preferences::PrintFloatMode floatDisplayMode, int numberOfSignificantDigits) const { diff --git a/poincare/src/matrix.cpp b/poincare/src/matrix.cpp index 9bec5481b..64786a4ad 100644 --- a/poincare/src/matrix.cpp +++ b/poincare/src/matrix.cpp @@ -17,7 +17,7 @@ void MatrixNode::didAddChildAtIndex(int newNumberOfChildren) { setNumberOfColumns(newNumberOfChildren); } -int MatrixNode::polynomialDegree(char symbolName) const { +int MatrixNode::polynomialDegree(Context & context, char symbolName) const { return -1; } diff --git a/poincare/src/multiplication.cpp b/poincare/src/multiplication.cpp index 9dcfba203..982e5c06c 100644 --- a/poincare/src/multiplication.cpp +++ b/poincare/src/multiplication.cpp @@ -28,10 +28,10 @@ ExpressionNode::Sign MultiplicationNode::sign() const { return (Sign)sign; } -int MultiplicationNode::polynomialDegree(char symbolName) const { +int MultiplicationNode::polynomialDegree(Context & context, char symbolName) const { int degree = 0; for (ExpressionNode * c : children()) { - int d = c->polynomialDegree(symbolName); + int d = c->polynomialDegree(context, symbolName); if (d < 0) { return -1; } @@ -40,8 +40,8 @@ int MultiplicationNode::polynomialDegree(char symbolName) const { return degree; } -int MultiplicationNode::getPolynomialCoefficients(char symbolName, Expression coefficients[]) const { - return Multiplication(this).getPolynomialCoefficients(symbolName, coefficients); +int MultiplicationNode::getPolynomialCoefficients(Context & context, char symbolName, Expression coefficients[]) const { + return Multiplication(this).getPolynomialCoefficients(context, symbolName, coefficients); } template @@ -195,8 +195,8 @@ Expression Multiplication::shallowBeautify(Context & context, Preferences::Angle return thisExp; } -int Multiplication::getPolynomialCoefficients(char symbolName, Expression coefficients[]) const { - int deg = polynomialDegree(symbolName); +int Multiplication::getPolynomialCoefficients(Context & context, char symbolName, Expression coefficients[]) const { + int deg = polynomialDegree(context, symbolName); if (deg < 0 || deg > Expression::k_maxPolynomialDegree) { return -1; } @@ -210,7 +210,7 @@ int Multiplication::getPolynomialCoefficients(char symbolName, Expression coeffi // Let's note result = a(0)+a(1)*X+a(2)*X^2+a(3)*x^3+.. for (int i = 0; i < numberOfChildren(); i++) { // childAtIndex(i) = b(0)+b(1)*X+b(2)*X^2+b(3)*x^3+... - int degI = childAtIndex(i).getPolynomialCoefficients(symbolName, intermediateCoefficients); + int degI = childAtIndex(i).getPolynomialCoefficients(context, symbolName, intermediateCoefficients); assert(degI <= Expression::k_maxPolynomialDegree); for (int j = deg; j > 0; j--) { // new coefficients[j] = b(0)*a(j)+b(1)*a(j-1)+b(2)*a(j-2)+... diff --git a/poincare/src/opposite.cpp b/poincare/src/opposite.cpp index 39cc12cfa..f1b1f05b4 100644 --- a/poincare/src/opposite.cpp +++ b/poincare/src/opposite.cpp @@ -13,8 +13,8 @@ extern "C" { namespace Poincare { -int OppositeNode::polynomialDegree(char symbolName) const { - return childAtIndex(0)->polynomialDegree(symbolName); +int OppositeNode::polynomialDegree(Context & context, char symbolName) const { + return childAtIndex(0)->polynomialDegree(context, symbolName); } ExpressionNode::Sign OppositeNode::sign() const { diff --git a/poincare/src/parenthesis.cpp b/poincare/src/parenthesis.cpp index 8b603f24b..893982c64 100644 --- a/poincare/src/parenthesis.cpp +++ b/poincare/src/parenthesis.cpp @@ -3,8 +3,8 @@ namespace Poincare { -int ParenthesisNode::polynomialDegree(char symbolName) const { - return childAtIndex(0)->polynomialDegree(symbolName); +int ParenthesisNode::polynomialDegree(Context & context, char symbolName) const { + return childAtIndex(0)->polynomialDegree(context, symbolName); } Layout ParenthesisNode::createLayout(Preferences::PrintFloatMode floatDisplayMode, int numberOfSignificantDigits) const { diff --git a/poincare/src/power.cpp b/poincare/src/power.cpp index 8e6052257..613bb46e9 100644 --- a/poincare/src/power.cpp +++ b/poincare/src/power.cpp @@ -48,12 +48,12 @@ Expression PowerNode::setSign(Sign s, Context & context, Preferences::AngleUnit return Power(this).setSign(s, context, angleUnit); } -int PowerNode::polynomialDegree(char symbolName) const { - int deg = ExpressionNode::polynomialDegree(symbolName); +int PowerNode::polynomialDegree(Context & context, char symbolName) const { + int deg = ExpressionNode::polynomialDegree(context, symbolName); if (deg == 0) { return deg; } - int op0Deg = childAtIndex(0)->polynomialDegree(symbolName); + int op0Deg = childAtIndex(0)->polynomialDegree(context, symbolName); if (op0Deg < 0) { return -1; } @@ -72,8 +72,8 @@ int PowerNode::polynomialDegree(char symbolName) const { return -1; } -int PowerNode::getPolynomialCoefficients(char symbolName, Expression coefficients[]) const { - return Power(this).getPolynomialCoefficients(symbolName, coefficients); +int PowerNode::getPolynomialCoefficients(Context & context, char symbolName, Expression coefficients[]) const { + return Power(this).getPolynomialCoefficients(context, symbolName, coefficients); } // Private @@ -206,10 +206,10 @@ Expression Power::setSign(ExpressionNode::Sign s, Context & context, Preferences return result; } -int Power::getPolynomialCoefficients(char symbolName, Expression coefficients[]) const { - int deg = polynomialDegree(symbolName); +int Power::getPolynomialCoefficients(Context & context, char symbolName, Expression coefficients[]) const { + int deg = polynomialDegree(context, symbolName); if (deg <= 0) { - return Expression::defaultGetPolynomialCoefficients(symbolName, coefficients); + return Expression::defaultGetPolynomialCoefficients(context, symbolName, coefficients); } /* Here we only consider the case x^4 as privateGetPolynomialCoefficients is * supposed to be called after reducing the expression. */ diff --git a/poincare/src/subtraction.cpp b/poincare/src/subtraction.cpp index 5a12cac31..f60564fc5 100644 --- a/poincare/src/subtraction.cpp +++ b/poincare/src/subtraction.cpp @@ -8,10 +8,10 @@ namespace Poincare { -int SubtractionNode::polynomialDegree(char symbolName) const { +int SubtractionNode::polynomialDegree(Context & context, char symbolName) const { int degree = 0; for (ExpressionNode * e : children()) { - int d = e->polynomialDegree(symbolName); + int d = e->polynomialDegree(context, symbolName); if (d < 0) { return -1; } diff --git a/poincare/src/symbol.cpp b/poincare/src/symbol.cpp index bdf719636..2ce3cbb32 100644 --- a/poincare/src/symbol.cpp +++ b/poincare/src/symbol.cpp @@ -30,18 +30,18 @@ Expression SymbolNode::replaceSymbolWithExpression(char symbol, Expression & exp return Symbol(this).replaceSymbolWithExpression(symbol, expression); } -int SymbolNode::polynomialDegree(char symbol) const { - if (m_name == symbol) { +int SymbolNode::polynomialDegree(Context & context, char symbolName) const { + if (m_name == symbolName) { return 1; } return 0; } -int SymbolNode::getPolynomialCoefficients(char symbolName, Expression coefficients[]) const { - return Symbol(this).getPolynomialCoefficients(symbolName, coefficients); +int SymbolNode::getPolynomialCoefficients(Context & context, char symbolName, Expression coefficients[]) const { + return Symbol(this).getPolynomialCoefficients(context, symbolName, coefficients); } -int SymbolNode::getVariables(isVariableTest isVariable, char * variables) const { +int SymbolNode::getVariables(Context & context, isVariableTest isVariable, char * variables) const { size_t variablesLength = strlen(variables); if (isVariable(m_name)) { char * currentChar = variables; @@ -318,7 +318,7 @@ Expression Symbol::replaceSymbolWithExpression(char symbol, Expression & express return *this; } -int Symbol::getPolynomialCoefficients(char symbolName, Expression coefficients[]) const { +int Symbol::getPolynomialCoefficients(Context & context, char symbolName, Expression coefficients[]) const { if (name() == symbolName) { coefficients[0] = Rational(0); coefficients[1] = Rational(1); diff --git a/poincare/src/trigonometry.cpp b/poincare/src/trigonometry.cpp index 042c68550..b26fbf7ca 100644 --- a/poincare/src/trigonometry.cpp +++ b/poincare/src/trigonometry.cpp @@ -17,7 +17,7 @@ namespace Poincare { float Trigonometry::characteristicXRange(const Expression & e, Context & context, Preferences::AngleUnit angleUnit) { assert(e.numberOfChildren() == 1); - int d = e.childAtIndex(0).polynomialDegree('x'); + int d = e.childAtIndex(0).polynomialDegree(context, 'x'); if (d < 0 || d > 1) { // child(0) is not linear so we cannot easily find an interesting range return e.childAtIndex(0).characteristicXRange(context, angleUnit); diff --git a/poincare/src/undefined.cpp b/poincare/src/undefined.cpp index 2c14278cc..6e2fd0ad3 100644 --- a/poincare/src/undefined.cpp +++ b/poincare/src/undefined.cpp @@ -9,7 +9,7 @@ extern "C" { namespace Poincare { -int UndefinedNode::polynomialDegree(char symbolName) const { +int UndefinedNode::polynomialDegree(Context & context, char symbolName) const { return -1; }