[apps] Store function metadata in record

This commit is contained in:
Léa Saviot
2018-10-08 17:35:46 +02:00
committed by Émilie Feral
parent 20e440a216
commit 2793a622e2
6 changed files with 31 additions and 6 deletions

View File

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

View File

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

View File

@@ -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<typename T>
@@ -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<FunctionRecordData *>(const_cast<void *>(d.buffer));
}
}
template float Shared::StorageFunction::templatedApproximateAtAbscissa<float>(float, Poincare::Context*) const;

View File

@@ -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<typename T> T templatedApproximateAtAbscissa(T x, Poincare::Context * context) const;
FunctionRecordData * recordData() const;
virtual const char * symbol() const = 0;
};

View File

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

View File

@@ -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<ExpressionNode *>(TreePool::sharedPool()->copyTreeFromAddress(d.buffer, d.size)));
return Expression(static_cast<ExpressionNode *>(TreePool::sharedPool()->copyTreeFromAddress(address, size)));
}
/* Circuit breaker */