diff --git a/apps/sequence/local_context.cpp b/apps/sequence/local_context.cpp index 3f827f843..d9276a795 100644 --- a/apps/sequence/local_context.cpp +++ b/apps/sequence/local_context.cpp @@ -6,42 +6,61 @@ namespace Sequence { LocalContext::LocalContext(Context * parentContext) : VariableContext('n', parentContext), - m_nValue(Complex::Float(NAN)), - m_n1Value(Complex::Float(NAN)) + m_unValue(Complex::Float(NAN)), + m_un1Value(Complex::Float(NAN)), + m_vnValue(Complex::Float(NAN)), + m_vn1Value(Complex::Float(NAN)), + m_wnValue(Complex::Float(NAN)), + m_wn1Value(Complex::Float(NAN)) { } const Expression * LocalContext::expressionForSymbol(const Symbol * symbol) { - if (sequenceIndexForSymbol(symbol) == 0) { - return &m_nValue; - } - if (sequenceIndexForSymbol(symbol) == 1) { - return &m_n1Value; - } - return VariableContext::expressionForSymbol(symbol); -} - -void LocalContext::setSequenceRankValue(float f, int rank) { - if (rank == 0) { - m_nValue = Complex::Float(f); - } - if (rank == 1) { - m_n1Value = Complex::Float(f); + switch (symbol->name()) { + case Symbol::SpecialSymbols::un: + return &m_unValue; + case Symbol::SpecialSymbols::un1: + return &m_un1Value; + case Symbol::SpecialSymbols::vn: + return &m_vnValue; + case Symbol::SpecialSymbols::vn1: + return &m_vn1Value; + case Symbol::SpecialSymbols::wn: + return &m_wnValue; + case Symbol::SpecialSymbols::wn1: + return &m_wn1Value; + default: + return VariableContext::expressionForSymbol(symbol); } } -char LocalContext::sequenceIndexForSymbol(const Symbol * symbol) { - if (symbol->name() == Symbol::SpecialSymbols::un || - symbol->name() == Symbol::SpecialSymbols::vn || - symbol->name() == Symbol::SpecialSymbols::wn) { - return 0; +void LocalContext::setValueForSequenceRank(float value, const char * sequenceName, int rank) { + switch (rank) { + case 0: + if (sequenceName[0] == 'u') { + m_unValue = Complex::Float(value); + } + if (sequenceName[0] == 'v') { + m_vnValue = Complex::Float(value); + } + if (sequenceName[0] == 'w') { + m_wnValue = Complex::Float(value); + } + return; + case 1: + if (sequenceName[0] == 'u') { + m_un1Value = Complex::Float(value); + } + if (sequenceName[0] == 'v') { + m_vn1Value = Complex::Float(value); + } + if (sequenceName[0] == 'v') { + m_wn1Value = Complex::Float(value); + } + return; + default: + return; } - if (symbol->name() == Symbol::SpecialSymbols::un1 || - symbol->name() == Symbol::SpecialSymbols::vn1 || - symbol->name() == Symbol::SpecialSymbols::wn1) { - return 1; - } - return 2; } } diff --git a/apps/sequence/local_context.h b/apps/sequence/local_context.h index d68f1913c..baf196dcd 100644 --- a/apps/sequence/local_context.h +++ b/apps/sequence/local_context.h @@ -9,11 +9,14 @@ class LocalContext : public Poincare::VariableContext { public: LocalContext(Poincare::Context * parentContext); const Poincare::Expression * expressionForSymbol(const Poincare::Symbol * symbol) override; - void setSequenceRankValue(float f, int rank); + void setValueForSequenceRank(float value, const char * sequenceName, int rank); private: - char sequenceIndexForSymbol(const Poincare::Symbol * symbol); - Poincare::Complex m_nValue; - Poincare::Complex m_n1Value; + Poincare::Complex m_unValue; + Poincare::Complex m_un1Value; + Poincare::Complex m_vnValue; + Poincare::Complex m_vn1Value; + Poincare::Complex m_wnValue; + Poincare::Complex m_wn1Value; }; } diff --git a/apps/sequence/sequence.cpp b/apps/sequence/sequence.cpp index 6a68bd44c..63bbf7cb9 100644 --- a/apps/sequence/sequence.cpp +++ b/apps/sequence/sequence.cpp @@ -238,7 +238,7 @@ float Sequence::evaluateAtAbscissa(float x, Poincare::Context * context) const { int start = m_indexBuffer[0] < 0 || m_indexBuffer[0] > n ? 0 : m_indexBuffer[0]; float un = m_indexBuffer[0] < 0 || m_indexBuffer[0] > n ? m_firstInitialConditionExpression->approximate(*context) : m_buffer[0]; for (int i = start; i < n; i++) { - subContext.setSequenceRankValue(un, 0); + subContext.setValueForSequenceRank(un, name(), 0); Poincare::Complex e = Poincare::Complex::Float(i); subContext.setExpressionForSymbolName(&e, &nSymbol); un = m_expression->approximate(subContext); @@ -268,8 +268,8 @@ float Sequence::evaluateAtAbscissa(float x, Poincare::Context * context) const { float un = m_indexBuffer[0] >= 0 && m_indexBuffer[0] < n && m_indexBuffer[1] > 0 && m_indexBuffer[1] <= n && m_indexBuffer[0] + 1 == m_indexBuffer[1] ? m_buffer[0] : m_firstInitialConditionExpression->approximate(*context); float un1 = m_indexBuffer[0] >= 0 && m_indexBuffer[0] < n && m_indexBuffer[1] > 0 && m_indexBuffer[1] <= n && m_indexBuffer[0] + 1 == m_indexBuffer[1] ? m_buffer[1] : m_secondInitialConditionExpression->approximate(*context); for (int i = start; i < n-1; i++) { - subContext.setSequenceRankValue(un, 0); - subContext.setSequenceRankValue(un1, 1); + subContext.setValueForSequenceRank(un, name(), 0); + subContext.setValueForSequenceRank(un1, name(), 1); Poincare::Complex e = Poincare::Complex::Float(i); subContext.setExpressionForSymbolName(&e, &nSymbol); un = un1; diff --git a/apps/shared/function.cpp b/apps/shared/function.cpp index 87553b913..6cdc5afef 100644 --- a/apps/shared/function.cpp +++ b/apps/shared/function.cpp @@ -59,7 +59,7 @@ const char * Function::text() { return m_text; } -const char * Function::name() { +const char * Function::name() const { return m_name; } diff --git a/apps/shared/function.h b/apps/shared/function.h index 3d7bca654..2de7b2931 100644 --- a/apps/shared/function.h +++ b/apps/shared/function.h @@ -16,7 +16,7 @@ public: Function(const Function& other) = delete; Function(Function&& other) = delete; const char * text(); - const char * name(); + const char * name() const; KDColor color() const { return m_color; } Poincare::Expression * expression(); Poincare::ExpressionLayout * layout();