From cb754ab6d5d43bd4acb058bad74ce93c043a4b62 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89milie=20Feral?= Date: Wed, 13 Dec 2017 17:49:54 +0100 Subject: [PATCH] [apps] Sequence: invalidate the context cache when the sequences are redefined --- apps/sequence/app.cpp | 5 ++++- apps/sequence/app.h | 2 +- apps/sequence/list/list_controller.cpp | 11 +++++++++++ apps/sequence/list/list_controller.h | 1 + apps/sequence/list/list_parameter_controller.cpp | 2 ++ apps/sequence/list/type_parameter_controller.cpp | 3 +++ apps/sequence/sequence.cpp | 4 ---- apps/sequence/sequence.h | 5 ++++- apps/sequence/sequence_store.cpp | 2 -- apps/sequence/sequence_store.h | 5 ++++- apps/shared/list_controller.cpp | 5 ----- apps/shared/list_controller.h | 2 +- 12 files changed, 31 insertions(+), 16 deletions(-) diff --git a/apps/sequence/app.cpp b/apps/sequence/app.cpp index a446d29e8..de681f165 100644 --- a/apps/sequence/app.cpp +++ b/apps/sequence/app.cpp @@ -32,6 +32,9 @@ App * App::Snapshot::unpack(Container * container) { void App::Snapshot::reset() { FunctionApp::Snapshot::reset(); m_graphRange.setDefault(); + /* We do not need to invalidate the sequence context cache here as the + * context is not allocated yet when reset is call (from the application + * settings). */ m_sequenceStore.removeAll(); } @@ -77,7 +80,7 @@ InputViewController * App::inputViewController() { return &m_inputViewController; } -Context * App::localContext() { +SequenceContext * App::localContext() { return &m_sequenceContext; } diff --git a/apps/sequence/app.h b/apps/sequence/app.h index 3f9d83bb5..142fe16a8 100644 --- a/apps/sequence/app.h +++ b/apps/sequence/app.h @@ -35,7 +35,7 @@ public: CurveViewRange m_graphRange; }; InputViewController * inputViewController() override; - Poincare::Context * localContext() override; + SequenceContext * localContext() override; const char * XNT() override; private: App(Container * container, Snapshot * snapshot); diff --git a/apps/sequence/list/list_controller.cpp b/apps/sequence/list/list_controller.cpp index af5aa6440..86b4496ed 100644 --- a/apps/sequence/list/list_controller.cpp +++ b/apps/sequence/list/list_controller.cpp @@ -101,6 +101,8 @@ void ListController::editExpression(Sequence * sequence, int sequenceDefinition, } App * myApp = (App *)app(); InputViewController * inputController = myApp->inputViewController(); + // Invalidate the sequences context cache + static_cast(app())->localContext()->resetCache(); switch (sequenceDefinition) { case 0: inputController->edit(this, event, sequence, initialText, @@ -137,6 +139,13 @@ void ListController::editExpression(Sequence * sequence, int sequenceDefinition, } } +bool ListController::removeFunctionRow(Function * function) { + m_functionStore->removeFunction(function); + // Invalidate the sequences context cache + static_cast(app())->localContext()->resetCache(); + return true; +} + ListParameterController * ListController::parameterController() { return &m_parameterController; } @@ -251,6 +260,8 @@ void ListController::editExpression(Shared::Function * function, Ion::Events::Ev } void ListController::reinitExpression(Shared::Function * function) { + // Invalidate the sequences context cache + static_cast(app())->localContext()->resetCache(); Sequence * sequence = (Sequence *)function; switch (sequenceDefinitionForRow(selectedRow())) { case 1: diff --git a/apps/sequence/list/list_controller.h b/apps/sequence/list/list_controller.h index 2db46d6bd..2fd3f0f35 100644 --- a/apps/sequence/list/list_controller.h +++ b/apps/sequence/list/list_controller.h @@ -37,6 +37,7 @@ private: int sequenceDefinitionForRow(int j); void addEmptyFunction() override; void editExpression(Shared::Function * function, Ion::Events::Event event) override; + bool removeFunctionRow(Shared::Function * function) override; void reinitExpression(Shared::Function * function) override; View * loadView() override; void unloadView(View * view) override; diff --git a/apps/sequence/list/list_parameter_controller.cpp b/apps/sequence/list/list_parameter_controller.cpp index de4818b53..d81903b45 100644 --- a/apps/sequence/list/list_parameter_controller.cpp +++ b/apps/sequence/list/list_parameter_controller.cpp @@ -1,5 +1,6 @@ #include "list_parameter_controller.h" #include "list_controller.h" +#include "../app.h" using namespace Poincare; using namespace Shared; @@ -52,6 +53,7 @@ bool ListParameterController::handleEvent(Ion::Events::Event event) { #endif if (m_functionStore->numberOfFunctions() > 0) { m_functionStore->removeFunction(m_function); + static_cast(app())->localContext()->resetCache(); StackViewController * stack = (StackViewController *)(parentResponder()); stack->pop(); return true; diff --git a/apps/sequence/list/type_parameter_controller.cpp b/apps/sequence/list/type_parameter_controller.cpp index 202a2c5f6..f681d2427 100644 --- a/apps/sequence/list/type_parameter_controller.cpp +++ b/apps/sequence/list/type_parameter_controller.cpp @@ -1,5 +1,6 @@ #include "type_parameter_controller.h" #include "list_controller.h" +#include "../app.h" #include #include "../../../poincare/src/layout/baseline_relative_layout.h" #include "../../../poincare/src/layout/string_layout.h" @@ -54,6 +55,8 @@ bool TypeParameterController::handleEvent(Ion::Events::Event event) { if (m_sequence->type() != sequenceType) { m_listController->selectPreviousNewSequenceCell(); m_sequence->setType((Sequence::Type)selectedRow()); + // Invalidate sequence context cache when changing sequence type + static_cast(app())->localContext()->resetCache(); } StackViewController * stack = stackController(); assert(stack->depth()>2); diff --git a/apps/sequence/sequence.cpp b/apps/sequence/sequence.cpp index 960ef65a1..252ccc6a7 100644 --- a/apps/sequence/sequence.cpp +++ b/apps/sequence/sequence.cpp @@ -126,7 +126,6 @@ void Sequence::setType(Type type) { } setFirstInitialConditionContent(""); setSecondInitialConditionContent(""); - //sqctx->resetCache(); } Poincare::Expression * Sequence::firstInitialConditionExpression(Context * context) const { @@ -173,7 +172,6 @@ Poincare::ExpressionLayout * Sequence::secondInitialConditionLayout() { void Sequence::setContent(const char * c) { Function::setContent(c); - //sqctx->resetCache(); } void Sequence::setFirstInitialConditionContent(const char * c) { @@ -186,7 +184,6 @@ void Sequence::setFirstInitialConditionContent(const char * c) { delete m_firstInitialConditionLayout; m_firstInitialConditionLayout = nullptr; } - //sqctx->resetCache(); } void Sequence::setSecondInitialConditionContent(const char * c) { @@ -199,7 +196,6 @@ void Sequence::setSecondInitialConditionContent(const char * c) { delete m_secondInitialConditionLayout; m_secondInitialConditionLayout = nullptr; } - //sqctx->resetCache(); } char Sequence::symbol() const { diff --git a/apps/sequence/sequence.h b/apps/sequence/sequence.h index a9ac84360..8f678de83 100644 --- a/apps/sequence/sequence.h +++ b/apps/sequence/sequence.h @@ -22,13 +22,16 @@ public: Sequence(Sequence&& other) = delete; uint32_t checksum() override; Type type(); - void setType(Type type); const char * firstInitialConditionText(); const char * secondInitialConditionText(); Poincare::Expression * firstInitialConditionExpression(Poincare::Context * context) const; Poincare::Expression * secondInitialConditionExpression(Poincare::Context * context) const; Poincare::ExpressionLayout * firstInitialConditionLayout(); Poincare::ExpressionLayout * secondInitialConditionLayout(); + /* WARNING: after calling setType, setContent, setFirstInitialConditionContent + * or setSecondInitialConditionContent, the sequence context needs to + * invalidate the cache because the sequences evaluations might have changed. */ + void setType(Type type); void setContent(const char * c) override; void setFirstInitialConditionContent(const char * c); void setSecondInitialConditionContent(const char * c); diff --git a/apps/sequence/sequence_store.cpp b/apps/sequence/sequence_store.cpp index b0ef9ddbb..6a51047bc 100644 --- a/apps/sequence/sequence_store.cpp +++ b/apps/sequence/sequence_store.cpp @@ -56,7 +56,6 @@ void SequenceStore::removeFunction(Shared::Function * f) { } Sequence emptySequence("", KDColorBlack); m_sequences[m_numberOfFunctions] = emptySequence; - //sqctx->resetCache(); } int SequenceStore::maxNumberOfFunctions() { @@ -105,7 +104,6 @@ void SequenceStore::removeAll() { m_sequences[i] = emptySequence; } m_numberOfFunctions = 0; - //sqctx->resetCache(); } } diff --git a/apps/sequence/sequence_store.h b/apps/sequence/sequence_store.h index e46b44b8e..423bff97d 100644 --- a/apps/sequence/sequence_store.h +++ b/apps/sequence/sequence_store.h @@ -16,11 +16,14 @@ public: Sequence * activeFunctionAtIndex(int i) override; Sequence * definedFunctionAtIndex(int i) override; Sequence * addEmptyFunction() override; + /* WARNING: after calling removeFunction or removeAll, the sequence context + * need to invalidate its cache as the sequences evaluations might have + * changed */ void removeFunction(Shared::Function * f) override; + void removeAll() override; int maxNumberOfFunctions() override; const char * firstAvailableName() override; char symbol() const override; - void removeAll() override; static constexpr const char * k_sequenceNames[MaxNumberOfSequences] = { "u", "v"//, "w" }; diff --git a/apps/shared/list_controller.cpp b/apps/shared/list_controller.cpp index 90dcee1d4..ccd9fced0 100644 --- a/apps/shared/list_controller.cpp +++ b/apps/shared/list_controller.cpp @@ -292,11 +292,6 @@ void ListController::addEmptyFunction() { selectableTableView()->reloadData(); } -bool ListController::removeFunctionRow(Function * function) { - m_functionStore->removeFunction(function); - return true; -} - View * ListController::loadView() { m_emptyCell = new EvenOddCell(); m_addNewFunction = new NewFunctionCell(m_addNewMessage); diff --git a/apps/shared/list_controller.h b/apps/shared/list_controller.h index b5ab1ef15..4a0824f48 100644 --- a/apps/shared/list_controller.h +++ b/apps/shared/list_controller.h @@ -43,7 +43,7 @@ private: virtual int functionIndexForRow(int j); virtual const char * textForRow(int j); virtual void addEmptyFunction(); - virtual bool removeFunctionRow(Function * function); + virtual bool removeFunctionRow(Function * function) = 0; virtual void editExpression(Function * function, Ion::Events::Event event) = 0; virtual ListParameterController * parameterController() = 0; virtual int maxNumberOfRows() = 0;