From c70b545ba11cdcbc2c797cf68dbc2859a8e0cab7 Mon Sep 17 00:00:00 2001 From: Gabriel Ozouf Date: Tue, 9 Jun 2020 14:05:15 +0200 Subject: [PATCH] [apps/shared] Cache lookup on function evaluation When evaluating a ContinuousFunction for a float value, the function will first try to ask its cache (if it has been filled beforehand). Change-Id: I519d2d3dcf344ba63e30a0f011db2306c7141315 --- apps/shared/continuous_function.cpp | 12 ++++++++++++ apps/shared/continuous_function.h | 4 +++- 2 files changed, 15 insertions(+), 1 deletion(-) 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. */