[apps] Start de-templating StorageExpressionModelStore

This commit is contained in:
Léa Saviot
2018-10-10 14:24:38 +02:00
committed by Émilie Feral
parent 5a9c0b1b84
commit 88fa555f4f
3 changed files with 65 additions and 52 deletions

View File

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

View File

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

View File

@@ -1,72 +1,34 @@
#ifndef SHARED_STORAGE_EXPRESSION_MODEL_STORE_H
#define SHARED_STORAGE_EXPRESSION_MODEL_STORE_H
#include <ion/storage.h>
#include "storage_expression_model.h"
#include <stdint.h>
#include <ion/storage.h>
#include <assert.h>
namespace Shared {
// StorageExpressionModelStore is a handle to Ion::sharedStorage
// StorageExpressionModelStore is a handle to Ion::Storage::sharedStorage()
template<class T>
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();
};
}