[poincare] setExpressionForSymbolName takes a symbol name

This commit is contained in:
Léa Saviot
2018-09-27 11:45:43 +02:00
committed by Émilie Feral
parent 904de27815
commit 31d3a04678
10 changed files with 21 additions and 21 deletions

View File

@@ -48,8 +48,8 @@ public:
const Poincare::Expression expressionForSymbol(const Poincare::Symbol & symbol) override {
return m_parentContext->expressionForSymbol(symbol);
}
void setExpressionForSymbolName(const Poincare::Expression & expression, const Poincare::Symbol & symbol, Poincare::Context & context) override {
m_parentContext->setExpressionForSymbolName(expression, symbol, context);
void setExpressionForSymbolName(const Poincare::Expression & expression, const char * symbolName, Poincare::Context & context) override {
m_parentContext->setExpressionForSymbolName(expression, symbolName, context);
}
template<typename T> T valueOfSequenceAtPreviousRank(int sequenceIndex, int rank) const {
if (sizeof(T) == sizeof(float)) {

View File

@@ -7,8 +7,8 @@ using namespace Poincare;
namespace Shared {
void StoreContext::setExpressionForSymbolName(const Expression & expression, const Symbol & symbol, Context & context) {
m_parentContext->setExpressionForSymbolName(expression, symbol, context);
void StoreContext::setExpressionForSymbolName(const Expression & expression, const char * symbolName, Context & context) {
m_parentContext->setExpressionForSymbolName(expression, symbolName, context);
}
}

View File

@@ -19,7 +19,7 @@ public:
{}
void setParentContext(Poincare::Context * parentContext) { m_parentContext = parentContext; }
void setSeriesPairIndex(int j) { m_seriesPairIndex = j; }
void setExpressionForSymbolName(const Poincare::Expression & expression, const Poincare::Symbol & symbol, Poincare::Context & context) override;
void setExpressionForSymbolName(const Poincare::Expression & expression, const char * symbolName, Poincare::Context & context) override;
protected:
Shared::DoublePairStore * m_store;
int m_seriesPairIndex;

View File

@@ -79,12 +79,12 @@ bool VariableBoxController::ContentViewController::handleEvent(Ion::Events::Even
}
if (event == Ion::Events::Backspace && m_currentPage != Page::RootMenu) {
if (m_currentPage == Page::Scalar) {
const Symbol symbol('A'+selectedRow());
m_context->setExpressionForSymbolName(Expression(), symbol, *m_context);
const char symbolName[2] = {static_cast<char>('A'+selectedRow()), 0};
m_context->setExpressionForSymbolName(Expression(), symbolName, *m_context);
}
if (m_currentPage == Page::Matrix) {
const Symbol symbol = Symbol::matrixSymbol('0'+(char)selectedRow());
m_context->setExpressionForSymbolName(Expression(), symbol, *m_context);
const Symbol symbol = Symbol::matrixSymbol('0'+(char)selectedRow()); // TODO do not build an expression, just compute its name
m_context->setExpressionForSymbolName(Expression(), symbol.name(), *m_context);
m_matrixLayouts[selectedRow()] = Layout();
}
m_selectableTableView.reloadData();

View File

@@ -9,7 +9,7 @@ class Symbol;
class Context {
public:
virtual const Expression expressionForSymbol(const Symbol & symbol) = 0;
virtual void setExpressionForSymbolName(const Expression & expression, const Symbol & symbol, Context & context) = 0;
virtual void setExpressionForSymbolName(const Expression & expression, const char * symbolName, Context & context) = 0;
};
}

View File

@@ -17,7 +17,7 @@ public:
/* The expression recorded in global context is already a expression.
* Otherwise, we would need the context and the angle unit to evaluate it */
const Expression expressionForSymbol(const Symbol & symbol) override;
void setExpressionForSymbolName(const Expression & expression, const Symbol & symbol, Context & context) override;
void setExpressionForSymbolName(const Expression & expression, const char * symbolName, Context & context) override;
static constexpr uint16_t k_maxNumberOfExpressions = 36;
static constexpr uint16_t k_maxNumberOfFunctions = 10;
//TODO static constexpr uint16_t k_maxNumberOfSequences = 10;

View File

@@ -13,7 +13,7 @@ public:
void setApproximationForVariable(T value);
// Context
void setExpressionForSymbolName(const Expression & expression, const Symbol & symbol, Context & context) override;
void setExpressionForSymbolName(const Expression & expression, const char * symbolName, Context & context) override;
const Expression expressionForSymbol(const Symbol & symbol) override;
private:

View File

@@ -23,16 +23,16 @@ const Expression GlobalContext::expressionForSymbol(const Symbol & symbol) {
return ExpressionForRecord(RecordWithName(symbol.name()));
}
void GlobalContext::setExpressionForSymbolName(const Expression & expression, const Symbol & symbol, Context & context) {
void GlobalContext::setExpressionForSymbolName(const Expression & expression, const char * symbolName, Context & context) {
/* If the new expression contains the symbol, replace it because it will be
* destroyed afterwards (to be able to do A+2->A) */
Ion::Storage::Record record = RecordWithName(symbol.name());
Ion::Storage::Record record = RecordWithName(symbolName);
Expression e = ExpressionForRecord(record);
Expression finalExpression = expression.clone().replaceSymbolWithExpression(symbol.name(), e);
Expression finalExpression = expression.clone().replaceSymbolWithExpression(symbolName, e);
// Delete any record with same name (as it is going to be overriden)
record.destroy();
Ion::Storage::Record::ErrorStatus err = Ion::Storage::sharedStorage()->createRecordWithExtension(symbol.name(), ExtensionForExpression(finalExpression), finalExpression.addressInPool(), finalExpression.size());
Ion::Storage::Record::ErrorStatus err = Ion::Storage::sharedStorage()->createRecordWithExtension(symbolName, ExtensionForExpression(finalExpression), finalExpression.addressInPool(), finalExpression.size());
if (err != Ion::Storage::Record::ErrorStatus::None) {
assert(err == Ion::Storage::Record::ErrorStatus::NotEnoughSpaceAvailable);
// TODO: return false to set flag that the file system is full?

View File

@@ -33,7 +33,7 @@ Layout StoreNode::createLayout(Preferences::PrintFloatMode floatDisplayMode, int
template<typename T>
Evaluation<T> StoreNode::templatedApproximate(Context& context, Preferences::AngleUnit angleUnit) const {
Store s(this);
context.setExpressionForSymbolName(s.value(), s.symbol(), context);
context.setExpressionForSymbolName(s.value(), s.symbol().name(), context);
if (context.expressionForSymbol(s.symbol()).isUninitialized()) {
return Complex<T>::Undefined();
}
@@ -41,7 +41,7 @@ Evaluation<T> StoreNode::templatedApproximate(Context& context, Preferences::Ang
}
Expression Store::shallowReduce(Context & context, Preferences::AngleUnit angleUnit) {
context.setExpressionForSymbolName(value(), symbol(), context);
context.setExpressionForSymbolName(value(), symbol().name(), context);
Expression c1 = childAtIndex(1);
replaceWithInPlace(c1);
return c1.shallowReduce(context, angleUnit);

View File

@@ -20,14 +20,14 @@ void VariableContext<T>::setApproximationForVariable(T value) {
}
template<typename T>
void VariableContext<T>::setExpressionForSymbolName(const Expression & expression, const Symbol & symbol, Context & context) {
if (strcmp(symbol.name(), m_name) == 0) {
void VariableContext<T>::setExpressionForSymbolName(const Expression & expression, const char * symbolName, Context & context) {
if (strcmp(symbolName, m_name) == 0) {
if (expression.isUninitialized()) {
return;
}
m_value = Float<T>(expression.approximateToScalar<T>(context, Preferences::sharedPreferences()->angleUnit()));
} else {
m_parentContext->setExpressionForSymbolName(expression, symbol, context);
m_parentContext->setExpressionForSymbolName(expression, symbolName, context);
}
}