diff --git a/apps/graph/storage_cartesian_function_store.cpp b/apps/graph/storage_cartesian_function_store.cpp index d09072e4c..ecf878b1a 100644 --- a/apps/graph/storage_cartesian_function_store.cpp +++ b/apps/graph/storage_cartesian_function_store.cpp @@ -20,7 +20,7 @@ void StorageCartesianFunctionStore::setMemoizedModelAtIndex(int cacheIndex, Ion: m_functions[cacheIndex] = StorageCartesianFunction(record); } -StorageExpressionModel * StorageCartesianFunctionStore::memoizedModelAtIndex(int cacheIndex) const { +ExpressionModelHandle * StorageCartesianFunctionStore::memoizedModelAtIndex(int cacheIndex) const { assert(cacheIndex >= 0 && cacheIndex < k_maxNumberOfMemoizedModels); return &m_functions[cacheIndex]; } diff --git a/apps/graph/storage_cartesian_function_store.h b/apps/graph/storage_cartesian_function_store.h index 449b17f9d..06a69b1ea 100644 --- a/apps/graph/storage_cartesian_function_store.h +++ b/apps/graph/storage_cartesian_function_store.h @@ -17,7 +17,7 @@ private: Ion::Storage::Record::ErrorStatus addEmptyModel() override; const char * modelExtension() const override { return Shared::GlobalContext::funcExtension; } void setMemoizedModelAtIndex(int cacheIndex, Ion::Storage::Record record) const override; - Shared::StorageExpressionModel * memoizedModelAtIndex(int cacheIndex) const override; + Shared::ExpressionModelHandle * memoizedModelAtIndex(int cacheIndex) const override; mutable Shared::StorageCartesianFunction m_functions[k_maxNumberOfMemoizedModels]; }; diff --git a/apps/shared/Makefile b/apps/shared/Makefile index 93e7e4d52..bc6af6116 100644 --- a/apps/shared/Makefile +++ b/apps/shared/Makefile @@ -11,6 +11,7 @@ app_src += $(addprefix apps/shared/,\ editable_cell_table_view_controller.cpp \ expression_field_delegate_app.cpp \ expression_model.cpp \ + expression_model_handle.cpp \ expression_model_list_controller.cpp \ expression_model_store.cpp \ float_parameter_controller.cpp \ @@ -52,7 +53,6 @@ app_src += $(addprefix apps/shared/,\ separator_even_odd_buffer_text_cell.cpp \ simple_interactive_curve_view_controller.cpp \ storage_cartesian_function.cpp \ - storage_expression_model.cpp \ storage_expression_model_list_controller.cpp \ storage_expression_model_store.cpp \ storage_function.cpp \ diff --git a/apps/shared/storage_expression_model.cpp b/apps/shared/expression_model_handle.cpp similarity index 77% rename from apps/shared/storage_expression_model.cpp rename to apps/shared/expression_model_handle.cpp index bfb274c7b..a0ccf79c9 100644 --- a/apps/shared/storage_expression_model.cpp +++ b/apps/shared/expression_model_handle.cpp @@ -1,4 +1,4 @@ -#include "storage_expression_model.h" +#include "expression_model_handle.h" #include "global_context.h" #include "poincare_helpers.h" #include @@ -11,7 +11,7 @@ using namespace Poincare; namespace Shared { -StorageExpressionModel::StorageExpressionModel(Storage::Record record) : +ExpressionModelHandle::ExpressionModelHandle(Storage::Record record) : Storage::Record(record), m_expression(), m_layout(), @@ -19,7 +19,7 @@ StorageExpressionModel::StorageExpressionModel(Storage::Record record) : { } -void StorageExpressionModel::text(char * buffer, size_t bufferSize) const { +void ExpressionModelHandle::text(char * buffer, size_t bufferSize) const { Expression e = expressionClone(); if (e.isUninitialized() && bufferSize > 0) { buffer[0] = 0; @@ -28,14 +28,14 @@ void StorageExpressionModel::text(char * buffer, size_t bufferSize) const { } } -bool StorageExpressionModel::isCircularlyDefined(Poincare::Context * context) const { +bool ExpressionModelHandle::isCircularlyDefined(Poincare::Context * context) const { if (m_circular == -1) { m_circular = Expression::ExpressionWithoutSymbols(expressionClone(), *context).isUninitialized(); } return m_circular; } -Expression StorageExpressionModel::expressionReduced(Poincare::Context * context) const { +Expression ExpressionModelHandle::expressionReduced(Poincare::Context * context) const { if (m_expression.isUninitialized()) { assert(!isNull()); Ion::Storage::Record::Data recordData = value(); @@ -49,14 +49,14 @@ Expression StorageExpressionModel::expressionReduced(Poincare::Context * context return m_expression; } -Expression StorageExpressionModel::expressionClone() const { +Expression ExpressionModelHandle::expressionClone() const { assert(!isNull()); Ion::Storage::Record::Data recordData = value(); /* A new Expression has to be created at each call (because it might be tempered with after calling) */ return Expression::ExpressionFromAddress(expressionAddressForValue(recordData), expressionSizeForValue(recordData)); } -Layout StorageExpressionModel::layout() { +Layout ExpressionModelHandle::layout() { if (m_layout.isUninitialized()) { m_layout = PoincareHelpers::CreateLayout(expressionClone()); if (m_layout.isUninitialized()) { @@ -66,21 +66,21 @@ Layout StorageExpressionModel::layout() { return m_layout; } -bool StorageExpressionModel::isDefined() { +bool ExpressionModelHandle::isDefined() { return !isEmpty(); } -bool StorageExpressionModel::isEmpty() { +bool ExpressionModelHandle::isEmpty() { return value().size <= metaDataSize(); } -void StorageExpressionModel::tidy() { +void ExpressionModelHandle::tidy() { m_layout = Layout(); m_expression = Expression(); m_circular = 0; } -Ion::Storage::Record::ErrorStatus StorageExpressionModel::setContent(const char * c) { +Ion::Storage::Record::ErrorStatus ExpressionModelHandle::setContent(const char * c) { Expression expressionToStore; // if c = "", we want to reinit the Expression if (c && *c != 0) { @@ -93,7 +93,7 @@ Ion::Storage::Record::ErrorStatus StorageExpressionModel::setContent(const char return setExpressionContent(expressionToStore); } -Ion::Storage::Record::ErrorStatus StorageExpressionModel::setExpressionContent(Expression & expressionToStore) { +Ion::Storage::Record::ErrorStatus ExpressionModelHandle::setExpressionContent(Expression & expressionToStore) { assert(!isNull()); // Prepare the new data to store Ion::Storage::Record::Data newData = value(); @@ -120,11 +120,11 @@ Ion::Storage::Record::ErrorStatus StorageExpressionModel::setExpressionContent(E return error; } -void * StorageExpressionModel::expressionAddressForValue(Ion::Storage::Record::Data recordData) const { +void * ExpressionModelHandle::expressionAddressForValue(Ion::Storage::Record::Data recordData) const { return (char *)recordData.buffer+metaDataSize(); } -size_t StorageExpressionModel::expressionSizeForValue(Ion::Storage::Record::Data recordData) const { +size_t ExpressionModelHandle::expressionSizeForValue(Ion::Storage::Record::Data recordData) const { return recordData.size-metaDataSize(); } diff --git a/apps/shared/storage_expression_model.h b/apps/shared/expression_model_handle.h similarity index 85% rename from apps/shared/storage_expression_model.h rename to apps/shared/expression_model_handle.h index 899e119f8..0edb27278 100644 --- a/apps/shared/storage_expression_model.h +++ b/apps/shared/expression_model_handle.h @@ -1,5 +1,5 @@ -#ifndef SHARED_STORAGE_EXPRESSION_MODEL_H -#define SHARED_STORAGE_EXPRESSION_MODEL_H +#ifndef SHARED_EXPRESSION_MODEL_HANDLE_H +#define SHARED_EXPRESSION_MODEL_HANDLE_H #include #include @@ -8,12 +8,12 @@ namespace Shared { -// StorageExpressionModel is a handle to Ion::Record +// ExpressionModelHandle is a handle to Ion::Record -class StorageExpressionModel : public Ion::Storage::Record { +class ExpressionModelHandle : public Ion::Storage::Record { // TODO find better name (once we remove ExpressionModel?) public: - StorageExpressionModel(Ion::Storage::Record record); + ExpressionModelHandle(Ion::Storage::Record record); void text(char * buffer, size_t bufferSize) const; Poincare::Expression expressionReduced(Poincare::Context * context) const; Poincare::Expression expressionClone() const; diff --git a/apps/shared/storage_expression_model_list_controller.cpp b/apps/shared/storage_expression_model_list_controller.cpp index 1569b3881..bd6aab110 100644 --- a/apps/shared/storage_expression_model_list_controller.cpp +++ b/apps/shared/storage_expression_model_list_controller.cpp @@ -109,7 +109,7 @@ KDCoordinate StorageExpressionModelListController::expressionRowHeight(int j) { if (isAddEmptyRow(j)) { return Metric::StoreRowHeight; } - ExpiringPointer m = modelStore()->modelForRecord(modelStore()->recordAtIndex(j)); + ExpiringPointer m = modelStore()->modelForRecord(modelStore()->recordAtIndex(j)); if (m->layout().isUninitialized()) { return Metric::StoreRowHeight; } @@ -120,7 +120,7 @@ KDCoordinate StorageExpressionModelListController::expressionRowHeight(int j) { void StorageExpressionModelListController::willDisplayExpressionCellAtIndex(HighlightCell * cell, int j) { EvenOddExpressionCell * myCell = (EvenOddExpressionCell *)cell; - ExpiringPointer m = modelStore()->modelForRecord(modelStore()->recordAtIndex(j)); + ExpiringPointer m = modelStore()->modelForRecord(modelStore()->recordAtIndex(j)); myCell->setLayout(m->layout()); } @@ -140,7 +140,7 @@ bool StorageExpressionModelListController::handleEventOnExpression(Ion::Events:: } if (event == Ion::Events::Backspace && !isAddEmptyRow(selectedRow())) { Ion::Storage::Record record = modelStore()->recordAtIndex(modelIndexForRow(selectedRow())); - ExpiringPointer model = modelStore()->modelForRecord(record); + ExpiringPointer model = modelStore()->modelForRecord(record); if (model->shouldBeClearedBeforeRemove()) { reinitExpression(model); } else { @@ -170,7 +170,7 @@ void StorageExpressionModelListController::addEmptyModel() { editExpression(Ion::Events::OK); } -void StorageExpressionModelListController::reinitExpression(ExpiringPointer model) { +void StorageExpressionModelListController::reinitExpression(ExpiringPointer model) { model->setContent(""); resetMemoization(); selectableTableView()->reloadData(); @@ -182,7 +182,7 @@ void StorageExpressionModelListController::editExpression(Ion::Events::Event eve char initialTextContent[initialTextContentMaxSize]; if (event == Ion::Events::OK || event == Ion::Events::EXE) { Ion::Storage::Record record = modelStore()->recordAtIndex(modelIndexForRow(selectedRow())); - ExpiringPointer model = modelStore()->modelForRecord(record); + ExpiringPointer model = modelStore()->modelForRecord(record); model->text(initialTextContent, initialTextContentMaxSize); initialText = initialTextContent; // Replace Poincare::Symbol::SpecialSymbols::UnknownX with 'x' @@ -208,7 +208,7 @@ void StorageExpressionModelListController::editExpression(Ion::Events::Event eve bool StorageExpressionModelListController::editSelectedRecordWithText(const char * text) { Ion::Storage::Record record = modelStore()->recordAtIndex(modelIndexForRow(selectedRow())); - ExpiringPointer model = modelStore()->modelForRecord(record); + ExpiringPointer model = modelStore()->modelForRecord(record); return (model->setContent(text) == Ion::Storage::Record::ErrorStatus::None); } diff --git a/apps/shared/storage_expression_model_list_controller.h b/apps/shared/storage_expression_model_list_controller.h index d2bdfb43d..3248ac0fd 100644 --- a/apps/shared/storage_expression_model_list_controller.h +++ b/apps/shared/storage_expression_model_list_controller.h @@ -24,7 +24,7 @@ protected: bool handleEventOnExpression(Ion::Events::Event event); virtual void addEmptyModel(); virtual void didChangeModelsList() { resetMemoization(); } - virtual void reinitExpression(ExpiringPointer model); + virtual void reinitExpression(ExpiringPointer model); virtual void editExpression(Ion::Events::Event event); virtual bool editSelectedRecordWithText(const char * text); virtual bool removeModelRow(Ion::Storage::Record record); diff --git a/apps/shared/storage_expression_model_store.cpp b/apps/shared/storage_expression_model_store.cpp index a08913ac5..82ac68e7c 100644 --- a/apps/shared/storage_expression_model_store.cpp +++ b/apps/shared/storage_expression_model_store.cpp @@ -15,14 +15,14 @@ Ion::Storage::Record StorageExpressionModelStore::recordAtIndex(int i) const { return Ion::Storage::sharedStorage()->recordWithExtensionAtIndex(modelExtension(), i); } -StorageExpressionModel * StorageExpressionModelStore::privateModelForRecord(Ion::Storage::Record record) const { +ExpressionModelHandle * StorageExpressionModelStore::privateModelForRecord(Ion::Storage::Record record) const { for (int i = 0; i < k_maxNumberOfMemoizedModels; i++) { if (!memoizedModelAtIndex(i)->isNull() && *memoizedModelAtIndex(i) == record) { return memoizedModelAtIndex(i); } } setMemoizedModelAtIndex(m_oldestMemoizedIndex, record); - StorageExpressionModel * result = memoizedModelAtIndex(m_oldestMemoizedIndex); + ExpressionModelHandle * result = memoizedModelAtIndex(m_oldestMemoizedIndex); m_oldestMemoizedIndex = (m_oldestMemoizedIndex+1) % k_maxNumberOfMemoizedModels; return result; } @@ -44,7 +44,7 @@ void StorageExpressionModelStore::tidy() { int StorageExpressionModelStore::numberOfModelsSatisfyingTest(ModelTest test) const { int result = 0; int i = 0; - StorageExpressionModel * m = privateModelForRecord(recordAtIndex(i++)); + ExpressionModelHandle * m = privateModelForRecord(recordAtIndex(i++)); while (!m->isNull()) { if (test(m)) { result++; @@ -59,7 +59,7 @@ Ion::Storage::Record StorageExpressionModelStore::recordStatifyingTestAtIndex(in int index = 0; int currentModelIndex = 0; Ion::Storage::Record r = recordAtIndex(currentModelIndex++); - StorageExpressionModel * m = privateModelForRecord(r); + ExpressionModelHandle * m = privateModelForRecord(r); while (!m->isNull()) { assert(currentModelIndex <= numberOfModels()); if (test(m)) { diff --git a/apps/shared/storage_expression_model_store.h b/apps/shared/storage_expression_model_store.h index f6d6e3d51..0b19c057b 100644 --- a/apps/shared/storage_expression_model_store.h +++ b/apps/shared/storage_expression_model_store.h @@ -1,7 +1,7 @@ #ifndef SHARED_STORAGE_EXPRESSION_MODEL_STORE_H #define SHARED_STORAGE_EXPRESSION_MODEL_STORE_H -#include "storage_expression_model.h" +#include "expression_model_handle.h" #include "expiring_pointer.h" #include #include @@ -17,10 +17,10 @@ public: // Getters int numberOfModels() const; - int numberOfDefinedModels() const { return numberOfModelsSatisfyingTest([](StorageExpressionModel * m) { return m->isDefined(); }); } + int numberOfDefinedModels() const { return numberOfModelsSatisfyingTest([](ExpressionModelHandle * m) { return m->isDefined(); }); } Ion::Storage::Record recordAtIndex(int i) const; - Ion::Storage::Record definedRecordAtIndex(int i) const { return recordStatifyingTestAtIndex(i, [](StorageExpressionModel * m) { return m->isDefined(); }); } - ExpiringPointer modelForRecord(Ion::Storage::Record record) const { return ExpiringPointer(privateModelForRecord(record)); } + Ion::Storage::Record definedRecordAtIndex(int i) const { return recordStatifyingTestAtIndex(i, [](ExpressionModelHandle * m) { return m->isDefined(); }); } + ExpiringPointer modelForRecord(Ion::Storage::Record record) const { return ExpiringPointer(privateModelForRecord(record)); } // Add and Remove virtual Ion::Storage::Record::ErrorStatus addEmptyModel() = 0; @@ -32,14 +32,14 @@ public: void storageDidChangeForRecord(const Ion::Storage::Record record) const { resetMemoizedModelsExceptRecord(record); } protected: constexpr static int k_maxNumberOfMemoizedModels = 10; - typedef bool (*ModelTest)(StorageExpressionModel * model); + typedef bool (*ModelTest)(ExpressionModelHandle * model); int numberOfModelsSatisfyingTest(ModelTest test) const; Ion::Storage::Record recordStatifyingTestAtIndex(int i, ModelTest test) const; - StorageExpressionModel * privateModelForRecord(Ion::Storage::Record record) const; + ExpressionModelHandle * privateModelForRecord(Ion::Storage::Record record) const; private: void resetMemoizedModelsExceptRecord(const Ion::Storage::Record record = Ion::Storage::Record()) const; virtual void setMemoizedModelAtIndex(int cacheIndex, Ion::Storage::Record) const = 0; - virtual StorageExpressionModel * memoizedModelAtIndex(int cacheIndex) const = 0; + virtual ExpressionModelHandle * memoizedModelAtIndex(int cacheIndex) const = 0; virtual const char * modelExtension() const = 0; /* Memoization of k_maxNumberOfMemoizedModels. When the required model is not * present, we override the m_oldestMemoizedIndex model. This actually diff --git a/apps/shared/storage_function.h b/apps/shared/storage_function.h index 853f2a804..45596bbc7 100644 --- a/apps/shared/storage_function.h +++ b/apps/shared/storage_function.h @@ -2,11 +2,11 @@ #define SHARED_STORAGE_FUNCTION_H #include -#include "storage_expression_model.h" +#include "expression_model_handle.h" namespace Shared { -class StorageFunction : public StorageExpressionModel { +class StorageFunction : public ExpressionModelHandle { public: enum class NameNotCompliantError { None = 0, @@ -20,7 +20,7 @@ public: static bool BaseNameCompliant(const char * baseName, NameNotCompliantError * error = nullptr); // Constructors - StorageFunction(Ion::Storage::Record record) : StorageExpressionModel(record){} + StorageFunction(Ion::Storage::Record record) : ExpressionModelHandle(record){} // Properties bool isActive() const; diff --git a/apps/shared/storage_function_store.h b/apps/shared/storage_function_store.h index acccd4975..a5b08608e 100644 --- a/apps/shared/storage_function_store.h +++ b/apps/shared/storage_function_store.h @@ -14,8 +14,8 @@ public: StorageFunctionStore() : StorageExpressionModelStore() {} uint32_t storeChecksum(); // An active function must be defined to be counted - int numberOfActiveFunctions() const { return numberOfModelsSatisfyingTest([](StorageExpressionModel * m) { return m->isDefined() && static_cast(m)->isActive(); }); } - Ion::Storage::Record activeRecordAtIndex(int i) const { return recordStatifyingTestAtIndex(i, [](StorageExpressionModel * m) { return m->isDefined() && static_cast(m)->isActive(); }); } + int numberOfActiveFunctions() const { return numberOfModelsSatisfyingTest([](ExpressionModelHandle * m) { return m->isDefined() && static_cast(m)->isActive(); }); } + Ion::Storage::Record activeRecordAtIndex(int i) const { return recordStatifyingTestAtIndex(i, [](ExpressionModelHandle * m) { return m->isDefined() && static_cast(m)->isActive(); }); } ExpiringPointer modelForRecord(Ion::Storage::Record record) const { return ExpiringPointer(static_cast(privateModelForRecord(record))); }