diff --git a/apps/shared/storage_expression_model.h b/apps/shared/storage_expression_model.h index 20da7bae6..f599b002c 100644 --- a/apps/shared/storage_expression_model.h +++ b/apps/shared/storage_expression_model.h @@ -30,7 +30,7 @@ public: Ion::Storage::Record::ErrorStatus setExpressionContent(Poincare::Expression & e); protected: void * expressionAddress() const; - size_t expressionSize() const;; + size_t expressionSize() const; virtual size_t metaDataSize() const = 0; Ion::Storage::Record record() const; mutable Poincare::Expression m_expression; diff --git a/apps/shared/storage_expression_model_store.cpp b/apps/shared/storage_expression_model_store.cpp index 8b1378917..22cd34cce 100644 --- a/apps/shared/storage_expression_model_store.cpp +++ b/apps/shared/storage_expression_model_store.cpp @@ -1 +1,52 @@ +#include "storage_expression_model_store.h" +namespace Shared { + +int StorageExpressionModelStore::numberOfModels() const { + return Ion::Storage::sharedStorage()->numberOfRecordsWithExtension(modelExtension()); +} + +int StorageExpressionModelStore::numberOfDefinedModels() const { + int result = 0; + int i = 0; + while (!modelAtIndex(i).isEmpty()) { + if (modelAtIndex(i).isDefined()) { + result++; + } + i++; + } + return result; +} + +StorageExpressionModel StorageExpressionModelStore::modelAtIndex(int i) const { + return StorageExpressionModel(Ion::Storage::sharedStorage()->recordWithExtensionAtIndex(modelExtension(), i)); +} + +StorageExpressionModel StorageExpressionModelStore::definedModelAtIndex(int i) const { + assert(i >= 0 && i < numberOfDefinedModels()); + int index = 0; + int currentModelIndex = 0; + while (true) { + assert(currentModelIndex < numberOfModels()); + if (modelAtIndex(currentModelIndex).isDefined()) { + if (i == index) { + return modelAtIndex(currentModelIndex); + } + index++; + } + currentModelIndex++; + } +} + +void StorageExpressionModelStore::removeAll() { + Ion::Storage::sharedStorage()->destroyRecordsWithExtension(modelExtension()); +} + +void StorageExpressionModelStore::tidy() { + int modelsCount = numberOfModels(); + for (int i = 0; i < modelsCount; i++) { + modelAtIndex(i).tidy(); + } +} + +} diff --git a/apps/shared/storage_expression_model_store.h b/apps/shared/storage_expression_model_store.h index 63f7b08f8..24d1f3332 100644 --- a/apps/shared/storage_expression_model_store.h +++ b/apps/shared/storage_expression_model_store.h @@ -1,72 +1,34 @@ #ifndef SHARED_STORAGE_EXPRESSION_MODEL_STORE_H #define SHARED_STORAGE_EXPRESSION_MODEL_STORE_H -#include #include "storage_expression_model.h" -#include +#include #include namespace Shared { -// StorageExpressionModelStore is a handle to Ion::sharedStorage +// StorageExpressionModelStore is a handle to Ion::Storage::sharedStorage() -template class StorageExpressionModelStore { // TODO find better name (once we remove ExpressionModelStore?) public: // Getters - int numberOfModels() const { - return Ion::Storage::sharedStorage()->numberOfRecordsWithExtension(T::Extension()); - } - T modelAtIndex(int i) const { - return T(Ion::Storage::sharedStorage()->recordWithExtensionAtIndex(T::Extension(), i)); - } - int numberOfDefinedModels() { - int result = 0; - int i = 0; - while (!modelAtIndex(i).isEmpty()) { - if (modelAtIndex(i).isDefined()) { - result++; - } - i++; - } - return result; - } - - T definedModelAtIndex(int i) { - assert(i >= 0 && i < numberOfDefinedModels()); - int index = 0; - int currentModelIndex = 0; - while (true) { - assert(currentModelIndex < numberOfModels()); - if (modelAtIndex(currentModelIndex).isDefined()) { - if (i == index) { - return modelAtIndex(currentModelIndex); - } - index++; - } - currentModelIndex++; - } - } + virtual const char * modelExtension() const = 0; + int numberOfModels() const; + int numberOfDefinedModels() const; + StorageExpressionModel modelAtIndex(int i) const; + StorageExpressionModel definedModelAtIndex(int i) const; // Add and Remove - T addEmptyModel() { - return T::NewModel(); - } - void removeModel(T f) { - f.destroy(); - } - virtual void removeAll() { - Ion::Storage::sharedStorage()->destroyRecordsWithExtension(T::Extension()); + virtual Ion::Storage::Record::ErrorStatus addEmptyModel() = 0; + void removeModel(StorageExpressionModel * f) { + assert(f != nullptr); + f->destroy(); } + virtual void removeAll(); // Other - void tidy() { - int modelsCount = numberOfModels(); - for (int i = 0; i < modelsCount; i++) { - modelAtIndex(i).tidy(); - } - } + void tidy(); }; }