diff --git a/apps/shared/cartesian_function.cpp b/apps/shared/cartesian_function.cpp index a87bf018c..a85bc818d 100644 --- a/apps/shared/cartesian_function.cpp +++ b/apps/shared/cartesian_function.cpp @@ -146,4 +146,18 @@ CartesianFunction::CartesianFunctionRecordDataBuffer * CartesianFunction::record return reinterpret_cast(const_cast(d.buffer)); } +template +T CartesianFunction::templatedApproximateAtAbscissa(T x, Poincare::Context * context) const { + if (isCircularlyDefined(context)) { + return NAN; + } + constexpr int bufferSize = CodePoint::MaxCodePointCharLength + 1; + char unknownX[bufferSize]; + Poincare::SerializationHelper::CodePoint(unknownX, bufferSize, UCodePointUnknownX); + return PoincareHelpers::ApproximateWithValueForSymbol(expressionReduced(context), unknownX, x, context); +} + +template float CartesianFunction::templatedApproximateAtAbscissa(float, Poincare::Context *) const; +template double CartesianFunction::templatedApproximateAtAbscissa(double, Poincare::Context *) const; + } diff --git a/apps/shared/cartesian_function.h b/apps/shared/cartesian_function.h index 9e91cf061..f9d769a40 100644 --- a/apps/shared/cartesian_function.h +++ b/apps/shared/cartesian_function.h @@ -17,6 +17,13 @@ public: CodePoint symbol() const override { return 'x'; } CodePoint unknownSymbol() const override { return UCodePointUnknownX; } + // Evaluation + float evaluateAtAbscissa(float x, Poincare::Context * context) const override { + return templatedApproximateAtAbscissa(x, context); + } + double evaluateAtAbscissa(double x, Poincare::Context * context) const override { + return templatedApproximateAtAbscissa(x, context); + } // Derivative bool displayDerivative() const; void setDisplayDerivative(bool display); @@ -59,6 +66,7 @@ private: size_t metaDataSize() const override { return sizeof(CartesianFunctionRecordDataBuffer); } const ExpressionModel * model() const override { return &m_model; } CartesianFunctionRecordDataBuffer * recordData() const; + template T templatedApproximateAtAbscissa(T x, Poincare::Context * context) const; Model m_model; }; diff --git a/apps/shared/function.cpp b/apps/shared/function.cpp index 52f43894d..01f284303 100644 --- a/apps/shared/function.cpp +++ b/apps/shared/function.cpp @@ -1,6 +1,4 @@ #include "function.h" -#include "poincare_helpers.h" -#include #include "poincare/src/parsing/parser.h" #include #include @@ -77,24 +75,10 @@ int Function::nameWithArgument(char * buffer, size_t bufferSize) { return result; } -template -T Function::templatedApproximateAtAbscissa(T x, Poincare::Context * context) const { - if (isCircularlyDefined(context)) { - return NAN; - } - constexpr int bufferSize = CodePoint::MaxCodePointCharLength + 1; - char unknownX[bufferSize]; - Poincare::SerializationHelper::CodePoint(unknownX, bufferSize, UCodePointUnknownX); - return PoincareHelpers::ApproximateWithValueForSymbol(expressionReduced(context), unknownX, x, context); -} - Function::FunctionRecordDataBuffer * Function::recordData() const { assert(!isNull()); Ion::Storage::Record::Data d = value(); return reinterpret_cast(const_cast(d.buffer)); } -template float Function::templatedApproximateAtAbscissa(float, Poincare::Context*) const; -template double Function::templatedApproximateAtAbscissa(double, Poincare::Context*) const; - } diff --git a/apps/shared/function.h b/apps/shared/function.h index fc07f615d..207a35796 100644 --- a/apps/shared/function.h +++ b/apps/shared/function.h @@ -36,12 +36,8 @@ public: int nameWithArgument(char * buffer, size_t bufferSize); // Evaluation - virtual float evaluateAtAbscissa(float x, Poincare::Context * context) const { - return templatedApproximateAtAbscissa(x, context); - } - virtual double evaluateAtAbscissa(double x, Poincare::Context * context) const { - return templatedApproximateAtAbscissa(x, context); - } + virtual float evaluateAtAbscissa(float x, Poincare::Context * context) const = 0; + virtual double evaluateAtAbscissa(double x, Poincare::Context * context) const = 0; virtual double sumBetweenBounds(double start, double end, Poincare::Context * context) const = 0; protected: /* FunctionRecordDataBuffer is the layout of the data buffer of Record @@ -76,7 +72,6 @@ protected: }; #pragma pack(pop) private: - template T templatedApproximateAtAbscissa(T x, Poincare::Context * context) const; FunctionRecordDataBuffer * recordData() const; };