diff --git a/apps/shared/continuous_function.cpp b/apps/shared/continuous_function.cpp index 042e42ea6..b00f69046 100644 --- a/apps/shared/continuous_function.cpp +++ b/apps/shared/continuous_function.cpp @@ -351,6 +351,18 @@ Poincare::Expression ContinuousFunction::sumBetweenBounds(double start, double e * the derivative table. */ } +Poincare::Coordinate2D ContinuousFunction::checkForCacheHitAndEvaluate(float t, Poincare::Context * context) const { + Poincare::Coordinate2D res(NAN, NAN); + if (cache()->filled()) { + res = cache()->valueForParameter(this, t); + } + if (std::isnan(res.x1()) || std::isnan(res.x2())) { + res = privateEvaluateXYAtParameter(t, context); + //res = Poincare::Coordinate2D(privateEvaluateXYAtParameter(t, context).x1(), 0); + } + return res; +} + Ion::Storage::Record::ErrorStatus ContinuousFunction::setContent(const char * c, Poincare::Context * context) { cache()->clear(); return ExpressionModelHandle::setContent(c, context); diff --git a/apps/shared/continuous_function.h b/apps/shared/continuous_function.h index 86769eca9..93e8c5998 100644 --- a/apps/shared/continuous_function.h +++ b/apps/shared/continuous_function.h @@ -47,7 +47,8 @@ public: return templatedApproximateAtParameter(t, context); } Poincare::Coordinate2D evaluateXYAtParameter(float t, Poincare::Context * context) const override { - return privateEvaluateXYAtParameter(t, context); + //return privateEvaluateXYAtParameter(t, context); + return checkForCacheHitAndEvaluate(t, context); } Poincare::Coordinate2D evaluateXYAtParameter(double t, Poincare::Context * context) const override { return privateEvaluateXYAtParameter(t, context); @@ -86,6 +87,7 @@ private: typedef Poincare::Coordinate2D (*ComputePointOfInterest)(Poincare::Expression e, char * symbol, double start, double step, double max, Poincare::Context * context); Poincare::Coordinate2D nextPointOfInterestFrom(double start, double step, double max, Poincare::Context * context, ComputePointOfInterest compute) const; template Poincare::Coordinate2D privateEvaluateXYAtParameter(T t, Poincare::Context * context) const; + Poincare::Coordinate2D checkForCacheHitAndEvaluate(float t, Poincare::Context * context) const; /* RecordDataBuffer is the layout of the data buffer of Record * representing a ContinuousFunction. See comment on * Shared::Function::RecordDataBuffer about packing. */