[apps/graph][apps/sequence] In values controller, memoize the number of

columns to improve performance

Change-Id: Ie3c545d0198a2f23575bd22fdbf56e9c6b8ff2b8
This commit is contained in:
Émilie Feral
2017-06-01 13:19:51 +02:00
parent 25383b73e5
commit d2c55eb7d0
14 changed files with 67 additions and 39 deletions

View File

@@ -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),

View File

@@ -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;

View File

@@ -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());
}

View File

@@ -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;
}
}

View File

@@ -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);

View File

@@ -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),

View File

@@ -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) {

View File

@@ -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;

View File

@@ -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 {

View File

@@ -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);
}

View File

@@ -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;

View File

@@ -12,9 +12,10 @@ Function * FunctionStore::activeFunctionAtIndex(int i) {
assert(i>=0 && i<m_numberOfFunctions);
int index = 0;
for (int k = 0; k < m_numberOfFunctions; k++) {
if (functionAtIndex(k)->isActive() && 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++;
}
}

View File

@@ -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();
}
}

View File

@@ -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;
};