mirror of
https://github.com/UpsilonNumworks/Upsilon.git
synced 2026-01-20 01:08:15 +01:00
[apps] StorageExpressionModel stores both name and record
This commit is contained in:
@@ -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; }
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
@@ -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<typename T> T templatedApproximateAtAbscissa(T x, Poincare::Context * context) const;
|
||||
virtual const char * symbol() const = 0;
|
||||
const char * m_name;
|
||||
KDColor m_color;
|
||||
bool m_active;
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user