diff --git a/poincare/include/poincare/function.h b/poincare/include/poincare/function.h index 5d07e5763..116cb4463 100644 --- a/poincare/include/poincare/function.h +++ b/poincare/include/poincare/function.h @@ -2,6 +2,7 @@ #define POINCARE_FUNCTION_H #include +#include namespace Poincare { @@ -24,6 +25,8 @@ public: float characteristicXRange(Context & context, Preferences::AngleUnit angleUnit) const override; private: + template + VariableContext xContext(Context & parentContext) const; // Layout Layout createLayout(Preferences::PrintFloatMode floatDisplayMode, int numberOfSignificantDigits) const override; int serialize(char * buffer, int bufferSize, Preferences::PrintFloatMode floatDisplayMode, int numberOfSignificantDigits) const override; diff --git a/poincare/src/function.cpp b/poincare/src/function.cpp index bc3afd5eb..5cd279ea2 100644 --- a/poincare/src/function.cpp +++ b/poincare/src/function.cpp @@ -9,32 +9,43 @@ namespace Poincare { int FunctionNode::polynomialDegree(Context & context, const char * symbolName) const { Expression e = context.expressionForSymbol(Function(this)); - return e.polynomialDegree(context, symbolName); +/*TODO Context should be float or double ?*/ + VariableContext newContext = xContext(context); + return e.polynomialDegree(newContext, symbolName); } int FunctionNode::getPolynomialCoefficients(Context & context, const char * symbolName, Expression coefficients[]) const { Expression e = context.expressionForSymbol(Function(this)); - return e.getPolynomialCoefficients(context, symbolName, coefficients); + VariableContext newContext = xContext(context); + return e.getPolynomialCoefficients(newContext, symbolName, coefficients); } int FunctionNode::getVariables(Context & context, isVariableTest isVariable, char * variables[], int maxSizeVariable) const { Expression e = context.expressionForSymbol(Function(this)); - return e.getVariables(context, isVariable, variables, maxSizeVariable); + VariableContext newContext = xContext(context); + return e.getVariables(newContext, isVariable, variables, maxSizeVariable); } float FunctionNode::characteristicXRange(Context & context, Preferences::AngleUnit angleUnit) const { Expression e = context.expressionForSymbol(Function(this)); - return e.characteristicXRange(context, angleUnit); + VariableContext newContext = xContext(context); + return e.characteristicXRange(newContext, angleUnit); +} + +template +VariableContext FunctionNode::xContext(Context & parentContext) const { + const char x[] = {Symbol::SpecialSymbols::UnknownX, 0}; + VariableContext xContext = VariableContext(x, &parentContext); + xContext.setExpressionForSymbolName(Expression(childAtIndex(0)), x, xContext); + return xContext; } Layout FunctionNode::createLayout(Preferences::PrintFloatMode floatDisplayMode, int numberOfSignificantDigits) const { - char nameString[2] = {name(), 0}; //TODO Fix this when longer name - return LayoutHelper::Prefix(Function(this), floatDisplayMode, numberOfSignificantDigits, nameString); + return LayoutHelper::Prefix(Function(this), floatDisplayMode, numberOfSignificantDigits, name()); } int FunctionNode::serialize(char * buffer, int bufferSize, Preferences::PrintFloatMode floatDisplayMode, int numberOfSignificantDigits) const { - char nameString[2] = {name(), 0}; //TODO Fix this when longer name - return SerializationHelper::Prefix(this, buffer, bufferSize, floatDisplayMode, numberOfSignificantDigits, nameString); + return SerializationHelper::Prefix(this, buffer, bufferSize, floatDisplayMode, numberOfSignificantDigits, name()); } Expression FunctionNode::shallowReduce(Context & context, Preferences::AngleUnit angleUnit) { @@ -43,18 +54,20 @@ Expression FunctionNode::shallowReduce(Context & context, Preferences::AngleUnit Evaluation FunctionNode::approximate(SinglePrecision p, Context& context, Preferences::AngleUnit angleUnit) const { Expression e = context.expressionForSymbol(Function(this)); - return e.approximateToEvaluation(context, angleUnit); + VariableContext newContext = xContext(context); + return e.approximateToEvaluation(newContext, angleUnit); } Evaluation FunctionNode::approximate(DoublePrecision p, Context& context, Preferences::AngleUnit angleUnit) const { Expression e = context.expressionForSymbol(Function(this)); - return e.approximateToEvaluation(context, angleUnit); + VariableContext newContext = xContext(context); + return e.approximateToEvaluation(newContext, angleUnit); } Function::Function(const char * name) : Function(TreePool::sharedPool()->createTreeNode()) { - setName(name); + static_cast(Expression::node())->setName(name, strlen(name)); } Expression Function::shallowReduce(Context & context, Preferences::AngleUnit angleUnit) {