From dd01a57ba4e02c03d80c53a287acfbc07409ef97 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?L=C3=A9a=20Saviot?= Date: Thu, 4 Oct 2018 11:35:14 +0200 Subject: [PATCH] [apps] StorageExpressionModel stores both name and record --- apps/graph/storage_cartesian_function.h | 2 +- apps/shared/storage_expression_model.cpp | 32 ++++++++++++++++++------ apps/shared/storage_expression_model.h | 7 +++++- apps/shared/storage_function.h | 6 +---- 4 files changed, 32 insertions(+), 15 deletions(-) diff --git a/apps/graph/storage_cartesian_function.h b/apps/graph/storage_cartesian_function.h index fa55ee694..252945e81 100644 --- a/apps/graph/storage_cartesian_function.h +++ b/apps/graph/storage_cartesian_function.h @@ -13,7 +13,7 @@ public: static StorageCartesianFunction EmptyModel() { return StorageCartesianFunction("function", KDColorRed); } StorageCartesianFunction(const char * text = nullptr, KDColor color = KDColorBlack); StorageCartesianFunction(Ion::Storage::Record record); - bool operator==(const StorageCartesianFunction & other) const { return m_record == other.m_record; } + bool operator==(const StorageCartesianFunction & other) const { return record() == other.record(); } bool operator!=(const StorageCartesianFunction & other) const { return !(*this == other); } bool displayDerivative() const { return m_displayDerivative; } void setDisplayDerivative(bool display) { m_displayDerivative = display; } diff --git a/apps/shared/storage_expression_model.cpp b/apps/shared/storage_expression_model.cpp index 84ecca6ac..e61de68e2 100644 --- a/apps/shared/storage_expression_model.cpp +++ b/apps/shared/storage_expression_model.cpp @@ -8,15 +8,24 @@ using namespace Poincare; namespace Shared { -StorageExpressionModel::StorageExpressionModel(Ion::Storage::Record record) : - m_record(record), +StorageExpressionModel::StorageExpressionModel(const char * name) : + m_name(name), m_expression(), - m_layout() + m_layout(), + m_record() +{ +} + +StorageExpressionModel::StorageExpressionModel(Ion::Storage::Record record) : + m_name(record.fullName()), + m_expression(), + m_layout(), + m_record(record) { } void StorageExpressionModel::destroy() { - m_record.destroy(); + record().destroy(); } void StorageExpressionModel::text(char * buffer, size_t bufferSize) const { @@ -25,7 +34,7 @@ void StorageExpressionModel::text(char * buffer, size_t bufferSize) const { Expression StorageExpressionModel::expression() const { if (m_expression.isUninitialized()) { - m_expression = Expression::ExpressionFromRecord(m_record); + m_expression = Expression::ExpressionFromRecord(record()); } return m_expression; } @@ -42,11 +51,11 @@ Layout StorageExpressionModel::layout() { } bool StorageExpressionModel::isDefined() { - return !m_record.isNull(); + return !record().isNull(); } bool StorageExpressionModel::isEmpty() { - return m_record.isNull(); + return record().isNull(); } void StorageExpressionModel::setContent(const char * c) { @@ -57,7 +66,7 @@ void StorageExpressionModel::setContent(const char * c) { Symbol xUnknown = Symbol(x, 1); expressionToStore = expressionToStore.replaceSymbolWithExpression(Symbol("x", 1), xUnknown); Ion::Storage::Record::Data newData = {.buffer = expressionToStore.addressInPool(), .size = expressionToStore.size()}; - m_record.setValue(newData); + record().setValue(newData); /* We cannot call tidy here because tidy is a virtual function and does not * do the same thing for all children class. And here we want to delete only * the m_layout and m_expression. */ @@ -70,4 +79,11 @@ void StorageExpressionModel::tidy() { m_expression = Expression(); } +Ion::Storage::Record StorageExpressionModel::record() const { + if (m_record.isNull()) { + m_record = Ion::Storage::sharedStorage()->recordNamed(m_name); + } + return m_record; +} + } diff --git a/apps/shared/storage_expression_model.h b/apps/shared/storage_expression_model.h index 18b42874f..360a415dd 100644 --- a/apps/shared/storage_expression_model.h +++ b/apps/shared/storage_expression_model.h @@ -11,8 +11,10 @@ namespace Shared { class StorageExpressionModel { // TODO find better name (once we remove ExpressionModel?) public: + StorageExpressionModel(const char * name); StorageExpressionModel(Ion::Storage::Record record); void destroy(); + const char * name() const { return m_name; } void text(char * buffer, size_t bufferSize) const; Poincare::Expression expression() const; Poincare::Expression reducedExpression(Poincare::Context * context) const; @@ -28,9 +30,12 @@ public: virtual void setContent(const char * c); virtual void tidy(); protected: - Ion::Storage::Record m_record; + Ion::Storage::Record record() const; + const char * m_name; mutable Poincare::Expression m_expression; mutable Poincare::Layout m_layout; +private: + mutable Ion::Storage::Record m_record; }; } diff --git a/apps/shared/storage_function.h b/apps/shared/storage_function.h index 90697d877..410cdfee3 100644 --- a/apps/shared/storage_function.h +++ b/apps/shared/storage_function.h @@ -9,8 +9,7 @@ namespace Shared { class StorageFunction : public StorageExpressionModel { public: StorageFunction(const char * name = nullptr, KDColor color = KDColorBlack) : - StorageExpressionModel(name == nullptr ? Ion::Storage::Record() : Ion::Storage::sharedStorage()->recordNamed(name)), - m_name(name), + StorageExpressionModel(name), m_color(color), m_active(true) {} @@ -19,10 +18,8 @@ public: m_color(color), m_active(true) { - m_name = record.fullName(); } virtual uint32_t checksum(); - const char * name() const { return m_name; } KDColor color() const { return m_color; } bool isActive() const { return m_active; } void setActive(bool active) { m_active = active; } @@ -39,7 +36,6 @@ private: static_assert((k_dataLengthInBytes & 0x3) == 0, "The function data size is not a multiple of 4 bytes (cannot compute crc)"); // Assert that dataLengthInBytes is a multiple of 4 template T templatedApproximateAtAbscissa(T x, Poincare::Context * context) const; virtual const char * symbol() const = 0; - const char * m_name; KDColor m_color; bool m_active; };