From 2793a622e2b05cda876eade52f0f2d6093de33ab Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?L=C3=A9a=20Saviot?= Date: Mon, 8 Oct 2018 17:35:46 +0200 Subject: [PATCH] [apps] Store function metadata in record --- apps/shared/storage_expression_model.cpp | 2 +- apps/shared/storage_expression_model.h | 2 ++ apps/shared/storage_function.cpp | 14 ++++++++++---- apps/shared/storage_function.h | 12 ++++++++++++ poincare/include/poincare/expression.h | 1 + poincare/src/expression.cpp | 6 +++++- 6 files changed, 31 insertions(+), 6 deletions(-) diff --git a/apps/shared/storage_expression_model.cpp b/apps/shared/storage_expression_model.cpp index 6af9a2468..4f85a7c8a 100644 --- a/apps/shared/storage_expression_model.cpp +++ b/apps/shared/storage_expression_model.cpp @@ -41,7 +41,7 @@ void StorageExpressionModel::text(char * buffer, size_t bufferSize) const { Expression StorageExpressionModel::expression() const { if (m_expression.isUninitialized()) { - m_expression = Expression::ExpressionFromRecord(record()); + m_expression = Expression::ExpressionFromAddress(expressionAddress(), expressionSize()); } return m_expression; } diff --git a/apps/shared/storage_expression_model.h b/apps/shared/storage_expression_model.h index e7b6eb0eb..1dc0af33a 100644 --- a/apps/shared/storage_expression_model.h +++ b/apps/shared/storage_expression_model.h @@ -29,6 +29,8 @@ public: virtual bool shouldBeClearedBeforeRemove() { return !isEmpty(); } virtual void setContent(const char * c); virtual void tidy(); + virtual void * expressionAddress() const = 0; + virtual size_t expressionSize() const = 0; protected: Poincare::Expression expressionToStoreFromString(const char * c); void setContentExpression(Poincare::Expression expressionToStore); diff --git a/apps/shared/storage_function.cpp b/apps/shared/storage_function.cpp index 759c5cdb8..7f1c8e442 100644 --- a/apps/shared/storage_function.cpp +++ b/apps/shared/storage_function.cpp @@ -13,19 +13,19 @@ uint32_t StorageFunction::checksum() { } bool StorageFunction::isActive() const { - return true; //TODO + return recordData()->isActive(); } KDColor StorageFunction::color() const { - return KDColorRed; //TODO + return recordData()->color(); } void StorageFunction::setActive(bool active) { - //TODO + recordData()->setActive(active); } void StorageFunction::setColor(KDColor color) { - //TODO + recordData()->setColor(color); } template @@ -33,6 +33,12 @@ T StorageFunction::templatedApproximateAtAbscissa(T x, Poincare::Context * conte return reducedExpression(context).approximateWithValueForSymbol(symbol(), x, *context, Preferences::sharedPreferences()->angleUnit()); } +StorageFunction::FunctionRecordData * StorageFunction::recordData() const { + assert(!record().isNull()); + Ion::Storage::Record::Data d = record().value(); + return reinterpret_cast(const_cast(d.buffer)); +} + } template float Shared::StorageFunction::templatedApproximateAtAbscissa(float, Poincare::Context*) const; diff --git a/apps/shared/storage_function.h b/apps/shared/storage_function.h index 72b4ec28b..6abf428c8 100644 --- a/apps/shared/storage_function.h +++ b/apps/shared/storage_function.h @@ -30,10 +30,22 @@ public: return templatedApproximateAtAbscissa(x, context); } virtual double sumBetweenBounds(double start, double end, Poincare::Context * context) const = 0; +protected: + class FunctionRecordData { + public: + KDColor color() const { return m_color; } + void setColor(KDColor color) { m_color = color; } + bool isActive() const { return m_active; } + void setActive(bool active) { m_active = active; } + private: + KDColor m_color; + bool m_active; + }; private: constexpr static size_t k_dataLengthInBytes = (TextField::maxBufferSize()+2)*sizeof(char)+2; 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; + FunctionRecordData * recordData() const; virtual const char * symbol() const = 0; }; diff --git a/poincare/include/poincare/expression.h b/poincare/include/poincare/expression.h index 6259d0d89..7286ca72b 100644 --- a/poincare/include/poincare/expression.h +++ b/poincare/include/poincare/expression.h @@ -93,6 +93,7 @@ public: Expression clone() const; static Expression parse(char const * string); static const Expression ExpressionFromRecord(const Ion::Storage::Record & record); + static const Expression ExpressionFromAddress(const void * address, size_t size); /* Circuit breaker */ typedef bool (*CircuitBreaker)(); diff --git a/poincare/src/expression.cpp b/poincare/src/expression.cpp index eb871832f..b58f50d46 100644 --- a/poincare/src/expression.cpp +++ b/poincare/src/expression.cpp @@ -48,8 +48,12 @@ const Expression Expression::ExpressionFromRecord(const Ion::Storage::Record & r return Expression(); } Ion::Storage::Record::Data d = record.value(); + return ExpressionFromAddress(d.buffer, d.size); +} + +const Expression Expression::ExpressionFromAddress(const void * address, size_t size) { // Build the Expression in the Tree Pool - return Expression(static_cast(TreePool::sharedPool()->copyTreeFromAddress(d.buffer, d.size))); + return Expression(static_cast(TreePool::sharedPool()->copyTreeFromAddress(address, size))); } /* Circuit breaker */