[apps] StorageExpressionModel stores both name and record

This commit is contained in:
Léa Saviot
2018-10-04 11:35:14 +02:00
committed by Émilie Feral
parent 1aa1ee3001
commit dd01a57ba4
4 changed files with 32 additions and 15 deletions

View File

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

View File

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

View File

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

View File

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