mirror of
https://github.com/UpsilonNumworks/Upsilon.git
synced 2026-03-27 01:29:58 +01:00
[apps] Store function metadata in record
This commit is contained in:
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
};
|
||||
|
||||
|
||||
@@ -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)();
|
||||
|
||||
@@ -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 */
|
||||
|
||||
Reference in New Issue
Block a user