diff --git a/apps/regression/app.cpp b/apps/regression/app.cpp index 64d5bc973..26058d22b 100644 --- a/apps/regression/app.cpp +++ b/apps/regression/app.cpp @@ -1,5 +1,6 @@ #include "app.h" #include "regression_icon.h" +#include "../apps_container.h" #include using namespace Shared; @@ -29,7 +30,7 @@ App::Snapshot::Snapshot() : } App * App::Snapshot::unpack(Container * container) { - return new (container->currentAppBuffer()) App(this); + return new (container->currentAppBuffer()) App(this, static_cast(container)->globalContext()); } void App::Snapshot::reset() { @@ -49,7 +50,7 @@ void App::Snapshot::tidy() { m_store.tidy(); } -App::App(Snapshot * snapshot) : +App::App(Snapshot * snapshot, Poincare::Context * parentContext) : TextFieldDelegateApp(snapshot, &m_tabViewController), m_calculationController(&m_calculationAlternateEmptyViewController, &m_calculationHeader, snapshot->store()), m_calculationAlternateEmptyViewController(&m_calculationHeader, &m_calculationController, &m_calculationController), @@ -58,7 +59,7 @@ App::App(Snapshot * snapshot) : m_graphAlternateEmptyViewController(&m_graphHeader, &m_graphController, &m_graphController), m_graphHeader(&m_graphStackViewController, &m_graphAlternateEmptyViewController, &m_graphController), m_graphStackViewController(&m_tabViewController, &m_graphHeader), - m_storeController(&m_storeHeader, this, snapshot->store(), &m_storeHeader), + m_storeController(&m_storeHeader, this, snapshot->store(), &m_storeHeader, parentContext), m_storeHeader(&m_storeStackViewController, &m_storeController, &m_storeController), m_storeStackViewController(&m_tabViewController, &m_storeHeader), m_tabViewController(&m_modalViewController, snapshot, &m_storeStackViewController, &m_graphStackViewController, &m_calculationHeader), diff --git a/apps/regression/app.h b/apps/regression/app.h index 3e5ba95c8..754313897 100644 --- a/apps/regression/app.h +++ b/apps/regression/app.h @@ -45,7 +45,7 @@ public: } RegressionController * regressionController() { return &m_regressionController; } private: - App(Snapshot * snapshot); + App(Snapshot * snapshot, Poincare::Context * parentContext); CalculationController m_calculationController; AlternateEmptyViewController m_calculationAlternateEmptyViewController; ButtonRowController m_calculationHeader; diff --git a/apps/regression/regression_context.cpp b/apps/regression/regression_context.cpp index 87e5d61fb..0539631cd 100644 --- a/apps/regression/regression_context.cpp +++ b/apps/regression/regression_context.cpp @@ -24,7 +24,7 @@ const Expression RegressionContext::expressionForSymbolAbstract(const SymbolAbst assert(m_seriesPairIndex < m_store->numberOfPairsOfSeries(series)); return Float::Builder(m_store->get(series, storeI, m_seriesPairIndex)); } else { - return m_parentContext->expressionForSymbolAbstract(symbol, clone); + return ContextWithParent::expressionForSymbolAbstract(symbol, clone); } } diff --git a/apps/regression/store_controller.cpp b/apps/regression/store_controller.cpp index 8102cdc75..cef9c8a72 100644 --- a/apps/regression/store_controller.cpp +++ b/apps/regression/store_controller.cpp @@ -10,19 +10,14 @@ using namespace Shared; namespace Regression { -StoreController::StoreController(Responder * parentResponder, InputEventHandlerDelegate * inputEventHandlerDelegate, Store * store, ButtonRowController * header) : +StoreController::StoreController(Responder * parentResponder, InputEventHandlerDelegate * inputEventHandlerDelegate, Store * store, ButtonRowController * header, Context * parentContext) : Shared::StoreController(parentResponder, inputEventHandlerDelegate, store, header), m_titleCells{}, - m_regressionContext(store), + m_regressionContext(store, parentContext), m_storeParameterController(this, store, this) { } -StoreContext * StoreController::storeContext() { - m_regressionContext.setParentContext(AppsContainer::sharedAppsContainer()->globalContext()); - return &m_regressionContext; -} - void StoreController::setFormulaLabel() { int series = selectedColumn() / Store::k_numberOfColumnsPerSeries; int isXColumn = selectedColumn() % Store::k_numberOfColumnsPerSeries == 0; diff --git a/apps/regression/store_controller.h b/apps/regression/store_controller.h index b141c559a..3e5ede1cc 100644 --- a/apps/regression/store_controller.h +++ b/apps/regression/store_controller.h @@ -12,8 +12,8 @@ namespace Regression { class StoreController : public Shared::StoreController { public: - StoreController(Responder * parentResponder, InputEventHandlerDelegate * inputEventHandlerDelegate, Store * store, ButtonRowController * header); - Shared::StoreContext * storeContext() override; + StoreController(Responder * parentResponder, InputEventHandlerDelegate * inputEventHandlerDelegate, Store * store, ButtonRowController * header, Poincare::Context * parentContext); + Shared::StoreContext * storeContext() override { return &m_regressionContext; } void setFormulaLabel() override; bool fillColumnWithFormula(Poincare::Expression formula) override; void willDisplayCellAtLocation(HighlightCell * cell, int i, int j) override; diff --git a/apps/sequence/cache_context.cpp b/apps/sequence/cache_context.cpp index bac977d7b..be5a834b0 100644 --- a/apps/sequence/cache_context.cpp +++ b/apps/sequence/cache_context.cpp @@ -8,8 +8,8 @@ namespace Sequence { template CacheContext::CacheContext(Context * parentContext) : - m_values{{NAN, NAN},{NAN, NAN},{NAN,NAN}}, - m_parentContext(parentContext) + ContextWithParent(parentContext), + m_values{{NAN, NAN},{NAN, NAN},{NAN,NAN}} { } @@ -24,12 +24,7 @@ const Expression CacheContext::expressionForSymbolAbstract(const SymbolAbstra Symbol s = const_cast(static_cast(symbol)); return Float::Builder(m_values[nameIndexForSymbol(s)][rankIndexForSymbol(s)]); } - return m_parentContext->expressionForSymbolAbstract(symbol, clone); -} - -template -void CacheContext::setExpressionForSymbolAbstract(const Expression & expression, const SymbolAbstract & symbol) { - m_parentContext->setExpressionForSymbolAbstract(expression, symbol); + return ContextWithParent::expressionForSymbolAbstract(symbol, clone); } template diff --git a/apps/sequence/cache_context.h b/apps/sequence/cache_context.h index 26191b8b6..37c6200e5 100644 --- a/apps/sequence/cache_context.h +++ b/apps/sequence/cache_context.h @@ -9,17 +9,15 @@ namespace Sequence { template -class CacheContext : public Poincare::Context { +class CacheContext : public Poincare::ContextWithParent { public: CacheContext(Poincare::Context * parentContext); const Poincare::Expression expressionForSymbolAbstract(const Poincare::SymbolAbstract & symbol, bool clone) override; - void setExpressionForSymbolAbstract(const Poincare::Expression & expression, const Poincare::SymbolAbstract & symbol) override; void setValueForSymbol(T value, const Poincare::Symbol & symbol); private: int nameIndexForSymbol(const Poincare::Symbol & symbol); int rankIndexForSymbol(const Poincare::Symbol & symbol); T m_values[MaxNumberOfSequences][MaxRecurrenceDepth]; - Context * m_parentContext; }; } diff --git a/apps/sequence/sequence_context.h b/apps/sequence/sequence_context.h index 91d3067a4..e4ca2cb42 100644 --- a/apps/sequence/sequence_context.h +++ b/apps/sequence/sequence_context.h @@ -1,7 +1,7 @@ #ifndef SEQUENCE_SEQUENCE_CONTEXT_H #define SEQUENCE_SEQUENCE_CONTEXT_H -#include +#include #include #include @@ -33,24 +33,17 @@ private: T m_values[MaxNumberOfSequences][MaxRecurrenceDepth+1]; }; -class SequenceContext : public Poincare::Context { +class SequenceContext : public Poincare::ContextWithParent { public: SequenceContext(Poincare::Context * parentContext, SequenceStore * sequenceStore) : - Context(), + ContextWithParent(parentContext), m_floatSequenceContext(), m_doubleSequenceContext(), - m_sequenceStore(sequenceStore), - m_parentContext(parentContext) {} + m_sequenceStore(sequenceStore) {} /* expressionForSymbolAbstract & setExpressionForSymbolAbstractName directly call the parent * context respective methods. Indeed, special chars like n, u(n), u(n+1), * v(n), v(n+1) are taken into accound only when evaluating sequences which * is done in another context. */ - const Poincare::Expression expressionForSymbolAbstract(const Poincare::SymbolAbstract & symbol, bool clone) override { - return m_parentContext->expressionForSymbolAbstract(symbol, clone); - } - void setExpressionForSymbolAbstract(const Poincare::Expression & expression, const Poincare::SymbolAbstract & symbol) override { - m_parentContext->setExpressionForSymbolAbstract(expression, symbol); - } template T valueOfSequenceAtPreviousRank(int sequenceIndex, int rank) const { if (sizeof(T) == sizeof(float)) { return m_floatSequenceContext.valueOfSequenceAtPreviousRank(sequenceIndex, rank); @@ -71,7 +64,6 @@ private: TemplatedSequenceContext m_floatSequenceContext; TemplatedSequenceContext m_doubleSequenceContext; SequenceStore * m_sequenceStore; - Poincare::Context * m_parentContext; }; } diff --git a/apps/shared/Makefile b/apps/shared/Makefile index b08dd1f4d..3be83a11d 100644 --- a/apps/shared/Makefile +++ b/apps/shared/Makefile @@ -11,7 +11,6 @@ app_shared_test_src = $(addprefix apps/shared/,\ interactive_curve_view_range.cpp \ memoized_curve_view_range.cpp \ range_1D.cpp \ - store_context.cpp \ ) app_shared_src = $(addprefix apps/shared/,\ diff --git a/apps/shared/store_context.cpp b/apps/shared/store_context.cpp deleted file mode 100644 index a5b5229f8..000000000 --- a/apps/shared/store_context.cpp +++ /dev/null @@ -1,14 +0,0 @@ -#include "store_context.h" -#include -#include -#include - -using namespace Poincare; - -namespace Shared { - -void StoreContext::setExpressionForSymbolAbstract(const Expression & expression, const SymbolAbstract & symbol) { - m_parentContext->setExpressionForSymbolAbstract(expression, symbol); -} - -} diff --git a/apps/shared/store_context.h b/apps/shared/store_context.h index ad025fd40..f8eed0157 100644 --- a/apps/shared/store_context.h +++ b/apps/shared/store_context.h @@ -2,28 +2,24 @@ #define SHARED_STORE_CONTEXT_H #include -#include +#include #include #include "double_pair_store.h" #include namespace Shared { -class StoreContext : public Poincare::Context { +class StoreContext : public Poincare::ContextWithParent { public: - StoreContext(Shared::DoublePairStore * store) : - Poincare::Context(), + StoreContext(Shared::DoublePairStore * store, Context * parentContext) : + Poincare::ContextWithParent(parentContext), m_store(store), - m_seriesPairIndex(-1), - m_parentContext(nullptr) + m_seriesPairIndex(-1) {} - void setParentContext(Poincare::Context * parentContext) { m_parentContext = parentContext; } void setSeriesPairIndex(int j) { m_seriesPairIndex = j; } - void setExpressionForSymbolAbstract(const Poincare::Expression & expression, const Poincare::SymbolAbstract & symbol) override; protected: Shared::DoublePairStore * m_store; int m_seriesPairIndex; - Poincare::Context * m_parentContext; }; } diff --git a/apps/statistics/app.cpp b/apps/statistics/app.cpp index f93912273..e6d5236f1 100644 --- a/apps/statistics/app.cpp +++ b/apps/statistics/app.cpp @@ -1,5 +1,6 @@ #include "app.h" #include "stat_icon.h" +#include "../apps_container.h" #include using namespace Shared; @@ -31,7 +32,7 @@ App::Snapshot::Snapshot() : } App * App::Snapshot::unpack(Container * container) { - return new (container->currentAppBuffer()) App(this); + return new (container->currentAppBuffer()) App(this, static_cast(container)->globalContext()); } void App::Snapshot::reset() { @@ -49,7 +50,7 @@ App::Descriptor * App::Snapshot::descriptor() { return &descriptor; } -App::App(Snapshot * snapshot) : +App::App(Snapshot * snapshot, Poincare::Context * parentContext) : TextFieldDelegateApp(snapshot, &m_tabViewController), m_calculationController(&m_calculationAlternateEmptyViewController, &m_calculationHeader, snapshot->store()), m_calculationAlternateEmptyViewController(&m_calculationHeader, &m_calculationController, &m_calculationController), @@ -61,7 +62,7 @@ App::App(Snapshot * snapshot) : m_histogramAlternateEmptyViewController(&m_histogramHeader, &m_histogramController, &m_histogramController), m_histogramHeader(&m_histogramStackViewController, &m_histogramAlternateEmptyViewController, &m_histogramController), m_histogramStackViewController(&m_tabViewController, &m_histogramHeader), - m_storeController(&m_storeHeader, this, snapshot->store(), &m_storeHeader), + m_storeController(&m_storeHeader, this, snapshot->store(), &m_storeHeader, parentContext), m_storeHeader(&m_storeStackViewController, &m_storeController, &m_storeController), m_storeStackViewController(&m_tabViewController, &m_storeHeader), m_tabViewController(&m_modalViewController, snapshot, &m_storeStackViewController, &m_histogramStackViewController, &m_boxHeader, &m_calculationHeader) diff --git a/apps/statistics/app.h b/apps/statistics/app.h index f39a086d2..be4bff775 100644 --- a/apps/statistics/app.h +++ b/apps/statistics/app.h @@ -44,7 +44,7 @@ public: BoxView::Quantile m_selectedBoxQuantile; }; private: - App(Snapshot * snapshot); + App(Snapshot * snapshot, Poincare::Context * parentContext); CalculationController m_calculationController; AlternateEmptyViewController m_calculationAlternateEmptyViewController; ButtonRowController m_calculationHeader; diff --git a/apps/statistics/statistics_context.cpp b/apps/statistics/statistics_context.cpp index 744a06b4d..deed4d3bf 100644 --- a/apps/statistics/statistics_context.cpp +++ b/apps/statistics/statistics_context.cpp @@ -24,7 +24,7 @@ const Expression StatisticsContext::expressionForSymbolAbstract(const SymbolAbst assert(m_seriesPairIndex < m_store->numberOfPairsOfSeries(series)); return Float::Builder(m_store->get(series, storeI, m_seriesPairIndex)); } else { - return m_parentContext->expressionForSymbolAbstract(symbol, clone); + return ContextWithParent::expressionForSymbolAbstract(symbol, clone); } } diff --git a/apps/statistics/store_controller.cpp b/apps/statistics/store_controller.cpp index 15cead9ad..7c87285a5 100644 --- a/apps/statistics/store_controller.cpp +++ b/apps/statistics/store_controller.cpp @@ -12,20 +12,15 @@ using namespace Shared; namespace Statistics { -StoreController::StoreController(Responder * parentResponder, InputEventHandlerDelegate * inputEventHandlerDelegate, Store * store, ButtonRowController * header) : +StoreController::StoreController(Responder * parentResponder, InputEventHandlerDelegate * inputEventHandlerDelegate, Store * store, ButtonRowController * header, Context * parentContext) : Shared::StoreController(parentResponder, inputEventHandlerDelegate, store, header), m_titleCells{}, m_store(store), - m_statisticsContext(m_store), + m_statisticsContext(m_store, parentContext), m_storeParameterController(this, store, this) { } -StoreContext * StoreController::storeContext() { - m_statisticsContext.setParentContext(AppsContainer::sharedAppsContainer()->globalContext()); - return &m_statisticsContext; -} - void StoreController::setFormulaLabel() { int series = selectedColumn() / Store::k_numberOfColumnsPerSeries; int isValueColumn = selectedColumn() % Store::k_numberOfColumnsPerSeries == 0; diff --git a/apps/statistics/store_controller.h b/apps/statistics/store_controller.h index c3e2350e6..e6d17a807 100644 --- a/apps/statistics/store_controller.h +++ b/apps/statistics/store_controller.h @@ -11,8 +11,8 @@ namespace Statistics { class StoreController : public Shared::StoreController { public: - StoreController(Responder * parentResponder, InputEventHandlerDelegate * inputEventHandlerDelegate, Store * store, ButtonRowController * header); - Shared::StoreContext * storeContext() override; + StoreController(Responder * parentResponder, InputEventHandlerDelegate * inputEventHandlerDelegate, Store * store, ButtonRowController * header, Poincare::Context * parentContext); + Shared::StoreContext * storeContext() override { return &m_statisticsContext; } void setFormulaLabel() override; bool fillColumnWithFormula(Poincare::Expression formula) override; void willDisplayCellAtLocation(HighlightCell * cell, int i, int j) override; diff --git a/poincare/include/poincare/context.h b/poincare/include/poincare/context.h index 6dea90a8c..a36cc1eea 100644 --- a/poincare/include/poincare/context.h +++ b/poincare/include/poincare/context.h @@ -16,7 +16,7 @@ public: Function, Symbol }; - virtual SymbolAbstractType expressionTypeForIdentifier(const char * identifier, int length) { assert(false); return SymbolAbstractType::None; } + virtual SymbolAbstractType expressionTypeForIdentifier(const char * identifier, int length) = 0; virtual const Expression expressionForSymbolAbstract(const SymbolAbstract & symbol, bool clone) = 0; virtual void setExpressionForSymbolAbstract(const Expression & expression, const SymbolAbstract & symbol) = 0; }; diff --git a/poincare/include/poincare/context_with_parent.h b/poincare/include/poincare/context_with_parent.h new file mode 100644 index 000000000..7f628abad --- /dev/null +++ b/poincare/include/poincare/context_with_parent.h @@ -0,0 +1,24 @@ +#ifndef POINCARE_CONTEXT_WITH_PARENT_H +#define POINCARE_CONTEXT_WITH_PARENT_H + +#include +#include +#include + +namespace Poincare { + +class ContextWithParent : public Context { +public: + ContextWithParent(Context * parentContext) : m_parentContext(parentContext) { assert(parentContext); } + + // Context + SymbolAbstractType expressionTypeForIdentifier(const char * identifier, int length) override { return m_parentContext->expressionTypeForIdentifier(identifier, length); } + void setExpressionForSymbolAbstract(const Expression & expression, const SymbolAbstract & symbol) override { m_parentContext->setExpressionForSymbolAbstract(expression, symbol); } + const Expression expressionForSymbolAbstract(const SymbolAbstract & symbol, bool clone) override { return m_parentContext->expressionForSymbolAbstract(symbol, clone); } +private: + Context * m_parentContext; +}; + +} + +#endif diff --git a/poincare/include/poincare/variable_context.h b/poincare/include/poincare/variable_context.h index e646d99bd..109768fad 100644 --- a/poincare/include/poincare/variable_context.h +++ b/poincare/include/poincare/variable_context.h @@ -1,14 +1,14 @@ #ifndef POINCARE_VARIABLE_CONTEXT_H #define POINCARE_VARIABLE_CONTEXT_H -#include +#include #include namespace Poincare { -class VariableContext : public Context { +class VariableContext : public ContextWithParent { public: - VariableContext(const char * name, Context * parentContext = nullptr); + VariableContext(const char * name, Context * parentContext); template void setApproximationForVariable(T value); @@ -19,7 +19,6 @@ public: private: const char * m_name; Expression m_value; - Context * m_parentContext; }; } diff --git a/poincare/src/variable_context.cpp b/poincare/src/variable_context.cpp index 9f5b467c7..61f32b005 100644 --- a/poincare/src/variable_context.cpp +++ b/poincare/src/variable_context.cpp @@ -8,9 +8,9 @@ namespace Poincare { VariableContext::VariableContext(const char * name, Context * parentContext) : + ContextWithParent(parentContext), m_name(name), - m_value(), - m_parentContext(parentContext) + m_value() { } @@ -27,7 +27,7 @@ void VariableContext::setExpressionForSymbolAbstract(const Expression & expressi } m_value = expression.clone(); } else { - m_parentContext->setExpressionForSymbolAbstract(expression, symbol); + return ContextWithParent::setExpressionForSymbolAbstract(expression, symbol); } } @@ -38,7 +38,7 @@ const Expression VariableContext::expressionForSymbolAbstract(const SymbolAbstra } return Undefined::Builder(); } else { - return m_parentContext->expressionForSymbolAbstract(symbol, clone); + return ContextWithParent::expressionForSymbolAbstract(symbol, clone); } }