From d2c55eb7d004f7f983a82eeda6a942be46a82b38 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89milie=20Feral?= Date: Thu, 1 Jun 2017 13:19:51 +0200 Subject: [PATCH] [apps/graph][apps/sequence] In values controller, memoize the number of columns to improve performance Change-Id: Ie3c545d0198a2f23575bd22fdbf56e9c6b8ff2b8 --- apps/graph/app.cpp | 4 +-- .../derivative_parameter_controller.cpp | 1 + .../values/function_parameter_controller.cpp | 1 + apps/graph/values/values_controller.cpp | 25 ++++++++++--------- apps/graph/values/values_controller.h | 4 +-- apps/sequence/app.cpp | 4 +-- apps/sequence/values/values_controller.cpp | 9 +++---- apps/sequence/values/values_controller.h | 3 +-- apps/shared/function.cpp | 4 +-- apps/shared/function_app.cpp | 14 ++++++++--- apps/shared/function_app.h | 6 +++-- apps/shared/function_store.cpp | 8 +++--- apps/shared/values_controller.cpp | 17 ++++++++++++- apps/shared/values_controller.h | 6 ++++- 14 files changed, 67 insertions(+), 39 deletions(-) diff --git a/apps/graph/app.cpp b/apps/graph/app.cpp index d7b347aeb..2282dfc72 100644 --- a/apps/graph/app.cpp +++ b/apps/graph/app.cpp @@ -62,11 +62,11 @@ App::App(Container * container, Snapshot * snapshot) : m_listFooter(&m_listHeader, &m_listController, &m_listController, ButtonRowController::Position::Bottom, ButtonRowController::Style::EmbossedGrey), m_listHeader(&m_listStackViewController, &m_listFooter, &m_listController), m_listStackViewController(&m_tabViewController, &m_listHeader), - m_graphController(&m_graphAlternateEmptyViewController, snapshot->functionStore(), snapshot->graphRange(), snapshot->cursor(), snapshot->modelVersion(), snapshot->rangeVersion(), &m_graphHeader), + m_graphController(&m_graphAlternateEmptyViewController, snapshot->functionStore(), snapshot->graphRange(), snapshot->cursor(), snapshot->graphModelVersion(), snapshot->rangeVersion(), &m_graphHeader), m_graphAlternateEmptyViewController(&m_graphHeader, &m_graphController, &m_graphController), m_graphHeader(&m_graphStackViewController, &m_graphAlternateEmptyViewController, &m_graphController), m_graphStackViewController(&m_tabViewController, &m_graphHeader), - m_valuesController(&m_valuesAlternateEmptyViewController, snapshot->functionStore(), snapshot->interval(), &m_valuesHeader), + m_valuesController(&m_valuesAlternateEmptyViewController, snapshot->functionStore(), snapshot->interval(), snapshot->valuesModelVersion(), &m_valuesHeader), m_valuesAlternateEmptyViewController(&m_valuesHeader, &m_valuesController, &m_valuesController), m_valuesHeader(&m_valuesStackViewController, &m_valuesAlternateEmptyViewController, &m_valuesController), m_valuesStackViewController(&m_tabViewController, &m_valuesHeader), diff --git a/apps/graph/values/derivative_parameter_controller.cpp b/apps/graph/values/derivative_parameter_controller.cpp index b29aa8f20..8c9f751b4 100644 --- a/apps/graph/values/derivative_parameter_controller.cpp +++ b/apps/graph/values/derivative_parameter_controller.cpp @@ -48,6 +48,7 @@ bool DerivativeParameterController::handleEvent(Ion::Events::Event event) { { m_valuesController->selectCellAtLocation(m_valuesController->selectedColumn()-1, m_valuesController->selectedRow()); m_function->setDisplayDerivative(false); + m_valuesController->updateNumberOfColumns(); StackViewController * stack = (StackViewController *)(parentResponder()); stack->pop(); return true; diff --git a/apps/graph/values/function_parameter_controller.cpp b/apps/graph/values/function_parameter_controller.cpp index 8fe4e5da3..c4343710c 100644 --- a/apps/graph/values/function_parameter_controller.cpp +++ b/apps/graph/values/function_parameter_controller.cpp @@ -25,6 +25,7 @@ bool FunctionParameterController::handleEvent(Ion::Events::Event event) { case 0: { m_cartesianFunction->setDisplayDerivative(!m_cartesianFunction->displayDerivative()); + m_valuesController->updateNumberOfColumns(); if (m_cartesianFunction->displayDerivative()) { m_valuesController->selectCellAtLocation(m_valuesController->selectedColumn()+1, m_valuesController->selectedRow()); } diff --git a/apps/graph/values/values_controller.cpp b/apps/graph/values/values_controller.cpp index 926aadb1c..10fc1d1d0 100644 --- a/apps/graph/values/values_controller.cpp +++ b/apps/graph/values/values_controller.cpp @@ -7,8 +7,8 @@ using namespace Poincare; namespace Graph { -ValuesController::ValuesController(Responder * parentResponder, CartesianFunctionStore * functionStore, Interval * interval, ButtonRowController * header) : - Shared::ValuesController(parentResponder, header, I18n::Message::XColumn, &m_intervalParameterController, interval), +ValuesController::ValuesController(Responder * parentResponder, CartesianFunctionStore * functionStore, Interval * interval, uint32_t * modelVersion, ButtonRowController * header) : + Shared::ValuesController(parentResponder, header, I18n::Message::XColumn, &m_intervalParameterController, interval, modelVersion), m_functionTitleCells{}, m_floatCells{}, m_functionStore(functionStore), @@ -16,6 +16,7 @@ ValuesController::ValuesController(Responder * parentResponder, CartesianFunctio m_intervalParameterController(this, m_interval), m_derivativeParameterController(this) { + updateNumberOfColumns(); } bool ValuesController::handleEvent(Ion::Events::Event event) { @@ -27,16 +28,6 @@ bool ValuesController::handleEvent(Ion::Events::Event event) { return Shared::ValuesController::handleEvent(event); } -int ValuesController::numberOfColumns() { - int result = 1; - for (int i = 0; i < m_functionStore->numberOfActiveFunctions(); i++) { - if (m_functionStore->activeFunctionAtIndex(i)->isActive()) { - result += 1 + m_functionStore->activeFunctionAtIndex(i)->displayDerivative(); - } - } - return result; -} - void ValuesController::willDisplayCellAtLocation(HighlightCell * cell, int i, int j) { Shared::ValuesController::willDisplayCellAtLocation(cell, i, j); // The cell is the abscissa title cell: @@ -181,5 +172,15 @@ void ValuesController::unloadView(View * view) { Shared::ValuesController::unloadView(view); } +void ValuesController::updateNumberOfColumns() { + int result = 1; + for (int i = 0; i < m_functionStore->numberOfActiveFunctions(); i++) { + if (m_functionStore->activeFunctionAtIndex(i)->isActive()) { + result += 1 + m_functionStore->activeFunctionAtIndex(i)->displayDerivative(); + } + } + m_numberOfColumns = result; +} + } diff --git a/apps/graph/values/values_controller.h b/apps/graph/values/values_controller.h index fe6c538d6..f341457e4 100644 --- a/apps/graph/values/values_controller.h +++ b/apps/graph/values/values_controller.h @@ -12,12 +12,12 @@ namespace Graph { class ValuesController : public Shared::ValuesController { public: - ValuesController(Responder * parentResponder, CartesianFunctionStore * functionStore, Shared::Interval * interval, ButtonRowController * header); + ValuesController(Responder * parentResponder, CartesianFunctionStore * functionStore, Shared::Interval * interval, uint32_t * modelVersion, ButtonRowController * header); bool handleEvent(Ion::Events::Event event) override; - int numberOfColumns() override; void willDisplayCellAtLocation(HighlightCell * cell, int i, int j) override; I18n::Message emptyMessage() override; Shared::IntervalParameterController * intervalParameterController() override; + void updateNumberOfColumns() override; private: CartesianFunction * functionAtColumn(int i) override; bool isDerivativeColumn(int i); diff --git a/apps/sequence/app.cpp b/apps/sequence/app.cpp index eab2e392c..9f3bef4b9 100644 --- a/apps/sequence/app.cpp +++ b/apps/sequence/app.cpp @@ -60,11 +60,11 @@ App::App(Container * container, Snapshot * snapshot) : m_listFooter(&m_listHeader, &m_listController, &m_listController, ButtonRowController::Position::Bottom, ButtonRowController::Style::EmbossedGrey), m_listHeader(nullptr, &m_listFooter, &m_listController), m_listStackViewController(&m_tabViewController, &m_listHeader), - m_graphController(&m_graphAlternateEmptyViewController, snapshot->sequenceStore(), snapshot->graphRange(), snapshot->cursor(), snapshot->modelVersion(), snapshot->rangeVersion(), &m_graphHeader), + m_graphController(&m_graphAlternateEmptyViewController, snapshot->sequenceStore(), snapshot->graphRange(), snapshot->cursor(), snapshot->graphModelVersion(), snapshot->rangeVersion(), &m_graphHeader), m_graphAlternateEmptyViewController(&m_graphHeader, &m_graphController, &m_graphController), m_graphHeader(&m_graphStackViewController, &m_graphAlternateEmptyViewController, &m_graphController), m_graphStackViewController(&m_tabViewController, &m_graphHeader), - m_valuesController(&m_valuesAlternateEmptyViewController, snapshot->sequenceStore(), snapshot->interval(), &m_valuesHeader), + m_valuesController(&m_valuesAlternateEmptyViewController, snapshot->sequenceStore(), snapshot->interval(), snapshot->valuesModelVersion(), &m_valuesHeader), m_valuesAlternateEmptyViewController(&m_valuesHeader, &m_valuesController, &m_valuesController), m_valuesHeader(nullptr, &m_valuesAlternateEmptyViewController, &m_valuesController), m_valuesStackViewController(&m_tabViewController, &m_valuesHeader), diff --git a/apps/sequence/values/values_controller.cpp b/apps/sequence/values/values_controller.cpp index 921fcae70..08ffaa72a 100644 --- a/apps/sequence/values/values_controller.cpp +++ b/apps/sequence/values/values_controller.cpp @@ -5,8 +5,8 @@ using namespace Shared; namespace Sequence { -ValuesController::ValuesController(Responder * parentResponder, SequenceStore * sequenceStore, Interval * interval, ButtonRowController * header) : - Shared::ValuesController(parentResponder, header, I18n::Message::NColumn, &m_intervalParameterController, interval), +ValuesController::ValuesController(Responder * parentResponder, SequenceStore * sequenceStore, Interval * interval, uint32_t * modelVersion, ButtonRowController * header) : + Shared::ValuesController(parentResponder, header, I18n::Message::NColumn, &m_intervalParameterController, interval, modelVersion), m_sequenceTitleCells{}, m_floatCells{}, m_sequenceStore(sequenceStore), @@ -15,10 +15,7 @@ ValuesController::ValuesController(Responder * parentResponder, SequenceStore * #endif m_intervalParameterController(this, m_interval) { -} - -int ValuesController::numberOfColumns() { - return m_sequenceStore->numberOfActiveFunctions()+1; + updateNumberOfColumns(); } void ValuesController::willDisplayCellAtLocation(HighlightCell * cell, int i, int j) { diff --git a/apps/sequence/values/values_controller.h b/apps/sequence/values/values_controller.h index ca1fee68d..9f0b9ba09 100644 --- a/apps/sequence/values/values_controller.h +++ b/apps/sequence/values/values_controller.h @@ -10,8 +10,7 @@ namespace Sequence { class ValuesController : public Shared::ValuesController { public: - ValuesController(Responder * parentResponder, SequenceStore * sequenceStore, Shared::Interval * interval, ButtonRowController * header); - int numberOfColumns() override; + ValuesController(Responder * parentResponder, SequenceStore * sequenceStore, Shared::Interval * interval, uint32_t * modelVersion, ButtonRowController * header); void willDisplayCellAtLocation(HighlightCell * cell, int i, int j) override; I18n::Message emptyMessage() override; IntervalParameterController * intervalParameterController() override; diff --git a/apps/shared/function.cpp b/apps/shared/function.cpp index 541a92ba6..f37e25083 100644 --- a/apps/shared/function.cpp +++ b/apps/shared/function.cpp @@ -84,7 +84,7 @@ Poincare::ExpressionLayout * Function::layout() { } bool Function::isDefined() { - return strlen(m_text) != 0; + return m_text[0] != 0; } bool Function::isActive() { @@ -96,7 +96,7 @@ void Function::setActive(bool active) { } bool Function::isEmpty() { - return strlen(m_text) == 0; + return m_text[0] == 0; } float Function::evaluateAtAbscissa(float x, Poincare::Context * context) const { diff --git a/apps/shared/function_app.cpp b/apps/shared/function_app.cpp index 50977ac72..11e7dbc65 100644 --- a/apps/shared/function_app.cpp +++ b/apps/shared/function_app.cpp @@ -8,7 +8,8 @@ namespace Shared { FunctionApp::Snapshot::Snapshot() : m_cursor(), m_interval(), - m_modelVersion(0), + m_graphModelVersion(0), + m_valuesModelVersion(0), m_rangeVersion(0) { m_interval.setStart(0); @@ -20,8 +21,12 @@ CurveViewCursor * FunctionApp::Snapshot::cursor() { return &m_cursor; } -uint32_t * FunctionApp::Snapshot::modelVersion() { - return &m_modelVersion; +uint32_t * FunctionApp::Snapshot::graphModelVersion() { + return &m_graphModelVersion; +} + +uint32_t * FunctionApp::Snapshot::valuesModelVersion() { + return &m_valuesModelVersion; } uint32_t * FunctionApp::Snapshot::rangeVersion() { @@ -36,7 +41,8 @@ void FunctionApp::Snapshot::reset() { m_interval.setStart(0); m_interval.setEnd(10); m_interval.setStep(1); - m_modelVersion = 0; + m_graphModelVersion = 0; + m_valuesModelVersion = 0; m_rangeVersion = 0; setActiveTab(0); } diff --git a/apps/shared/function_app.h b/apps/shared/function_app.h index b4d1a63ca..9d98f92aa 100644 --- a/apps/shared/function_app.h +++ b/apps/shared/function_app.h @@ -16,7 +16,8 @@ public: public: Snapshot(); CurveViewCursor * cursor(); - uint32_t * modelVersion(); + uint32_t * graphModelVersion(); + uint32_t * valuesModelVersion(); uint32_t * rangeVersion(); Interval * interval(); void reset() override; @@ -24,7 +25,8 @@ public: CurveViewCursor m_cursor; Interval m_interval; private: - uint32_t m_modelVersion; + uint32_t m_graphModelVersion; + uint32_t m_valuesModelVersion; uint32_t m_rangeVersion; }; virtual ~FunctionApp() = default; diff --git a/apps/shared/function_store.cpp b/apps/shared/function_store.cpp index a5102db74..0f7894076 100644 --- a/apps/shared/function_store.cpp +++ b/apps/shared/function_store.cpp @@ -12,9 +12,10 @@ Function * FunctionStore::activeFunctionAtIndex(int i) { assert(i>=0 && iisActive() && functionAtIndex(k)->isDefined()) { + Function * function = functionAtIndex(k); + if (function->isActive() && function->isDefined()) { if (i == index) { - return functionAtIndex(k); + return function; } index++; } @@ -45,7 +46,8 @@ int FunctionStore::numberOfFunctions() { int FunctionStore::numberOfActiveFunctions() { int result = 0; for (int i = 0; i < m_numberOfFunctions; i++) { - if (functionAtIndex(i)->isDefined() && functionAtIndex(i)->isActive()) { + Function * function = functionAtIndex(i); + if (function->isDefined() && function->isActive()) { result++; } } diff --git a/apps/shared/values_controller.cpp b/apps/shared/values_controller.cpp index da91be8f0..e49899abd 100644 --- a/apps/shared/values_controller.cpp +++ b/apps/shared/values_controller.cpp @@ -8,12 +8,14 @@ using namespace Poincare; namespace Shared { -ValuesController::ValuesController(Responder * parentResponder, ButtonRowController * header, I18n::Message parameterTitle, IntervalParameterController * intervalParameterController, Interval * interval) : +ValuesController::ValuesController(Responder * parentResponder, ButtonRowController * header, I18n::Message parameterTitle, IntervalParameterController * intervalParameterController, Interval * interval, uint32_t * modelVersion) : EditableCellTableViewController(parentResponder), ButtonRowDelegate(header, nullptr), m_interval(interval), + m_numberOfColumns(0), m_abscissaTitleCell(nullptr), m_abscissaCells{}, + m_modelVersion(modelVersion), m_abscissaParameterController(this, intervalParameterController, parameterTitle), m_setIntervalButton(this, I18n::Message::IntervalSet, Invocation([](void * context, void * sender) { ValuesController * valuesController = (ValuesController *) context; @@ -27,6 +29,10 @@ const char * ValuesController::title() { return I18n::translate(I18n::Message::ValuesTab); } +int ValuesController::numberOfColumns() { + return m_numberOfColumns; +} + Interval * ValuesController::interval() { return m_interval; } @@ -228,6 +234,11 @@ Responder * ValuesController::defaultController() { } void ValuesController::viewWillAppear() { + uint32_t newModelVersion = functionStore()->storeChecksum(); + if (*m_modelVersion != newModelVersion) { + *m_modelVersion = newModelVersion; + updateNumberOfColumns(); + } EditableCellTableViewController::viewWillAppear(); header()->setSelectedButton(-1); } @@ -313,5 +324,9 @@ void ValuesController::unloadView(View * view) { EditableCellTableViewController::unloadView(view); } +void ValuesController::updateNumberOfColumns() { + m_numberOfColumns = 1+functionStore()->numberOfActiveFunctions(); +} + } diff --git a/apps/shared/values_controller.h b/apps/shared/values_controller.h index 9d8bfe51e..b1225575a 100644 --- a/apps/shared/values_controller.h +++ b/apps/shared/values_controller.h @@ -15,9 +15,10 @@ namespace Shared { class ValuesController : public EditableCellTableViewController, public ButtonRowDelegate, public AlternateEmptyViewDelegate { public: - ValuesController(Responder * parentResponder, ButtonRowController * header, I18n::Message parameterTitle, IntervalParameterController * intervalParameterController, Interval * interval); + ValuesController(Responder * parentResponder, ButtonRowController * header, I18n::Message parameterTitle, IntervalParameterController * intervalParameterController, Interval * interval, uint32_t * modelVersion); const char * title() override; Interval * interval(); + int numberOfColumns() override; virtual bool handleEvent(Ion::Events::Event event) override; void didBecomeFirstResponder() override; void willExitResponderChain(Responder * nextFirstResponder) override; @@ -45,7 +46,9 @@ protected: bool setDataAtLocation(float floatBody, int columnIndex, int rowIndex) override; View * loadView() override; void unloadView(View * view) override; + virtual void updateNumberOfColumns(); Interval * m_interval; + int m_numberOfColumns; private: virtual Function * functionAtColumn(int i); Responder * tabController() const override; @@ -66,6 +69,7 @@ private: EvenOddEditableTextCell * m_abscissaCells[k_maxNumberOfAbscissaCells]; virtual FunctionStore * functionStore() const = 0; virtual ValuesFunctionParameterController * functionParameterController() = 0; + uint32_t * m_modelVersion; ValuesParameterController m_abscissaParameterController; Button m_setIntervalButton; };