diff --git a/apps/sequence/sequence.cpp b/apps/sequence/sequence.cpp index 1a45135de..11f9be50a 100644 --- a/apps/sequence/sequence.cpp +++ b/apps/sequence/sequence.cpp @@ -104,14 +104,14 @@ void Sequence::setType(Type type) { m_indexBuffer[1] = -1; } -Poincare::Expression * Sequence::firstInitialConditionExpression() { +Poincare::Expression * Sequence::firstInitialConditionExpression() const { if (m_firstInitialConditionExpression == nullptr) { m_firstInitialConditionExpression = Poincare::Expression::parse(m_firstInitialConditionText); } return m_firstInitialConditionExpression; } -Poincare::Expression * Sequence::secondInitialConditionExpression() { +Poincare::Expression * Sequence::secondInitialConditionExpression() const { if (m_secondInitialConditionExpression == nullptr) { m_secondInitialConditionExpression = Poincare::Expression::parse(m_secondInitialConditionText); } @@ -255,13 +255,13 @@ float Sequence::evaluateAtAbscissa(float x, Poincare::Context * context) const { } if (n == 0) { m_indexBuffer[0] = 0; - m_buffer[0] = m_firstInitialConditionExpression->approximate(*context); + m_buffer[0] = firstInitialConditionExpression()->approximate(*context); return m_buffer[0]; } LocalContext subContext = LocalContext(context); Poincare::Symbol nSymbol = Poincare::Symbol(symbol()); 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]; + float un = m_indexBuffer[0] < 0 || m_indexBuffer[0] > n ? firstInitialConditionExpression()->approximate(*context) : m_buffer[0]; for (int i = start; i < n; i++) { subContext.setValueForSequenceRank(un, name(), 0); Poincare::Complex e = Poincare::Complex::Float(i); @@ -278,20 +278,20 @@ float Sequence::evaluateAtAbscissa(float x, Poincare::Context * context) const { return NAN; } if (n == 0) { - return m_firstInitialConditionExpression->approximate(*context); + return firstInitialConditionExpression()->approximate(*context); } if (n == 1) { m_indexBuffer[0] = 0; - m_buffer[0] = m_firstInitialConditionExpression->approximate(*context); + m_buffer[0] = firstInitialConditionExpression()->approximate(*context); m_indexBuffer[1] = 1; - m_buffer[1] = m_secondInitialConditionExpression->approximate(*context); + m_buffer[1] = secondInitialConditionExpression()->approximate(*context); return m_buffer[1]; } LocalContext subContext = LocalContext(context); Poincare::Symbol nSymbol = Poincare::Symbol(symbol()); int start = m_indexBuffer[0] >= 0 && m_indexBuffer[0] < n && m_indexBuffer[1] > 0 && m_indexBuffer[1] <= n && m_indexBuffer[0] + 1 == m_indexBuffer[1] ? m_indexBuffer[0] : 0; - 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); + 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] : 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] : secondInitialConditionExpression()->approximate(*context); for (int i = start; i < n-1; i++) { subContext.setValueForSequenceRank(un, name(), 0); subContext.setValueForSequenceRank(un1, name(), 1); diff --git a/apps/sequence/sequence.h b/apps/sequence/sequence.h index 73a9f0991..09563df98 100644 --- a/apps/sequence/sequence.h +++ b/apps/sequence/sequence.h @@ -22,8 +22,8 @@ public: void setType(Type type); const char * firstInitialConditionText(); const char * secondInitialConditionText(); - Poincare::Expression * firstInitialConditionExpression(); - Poincare::Expression * secondInitialConditionExpression(); + Poincare::Expression * firstInitialConditionExpression() const; + Poincare::Expression * secondInitialConditionExpression() const; Poincare::ExpressionLayout * firstInitialConditionLayout(); Poincare::ExpressionLayout * secondInitialConditionLayout(); void setContent(const char * c) override; @@ -46,8 +46,8 @@ private: Type m_type; char m_firstInitialConditionText[TextField::maxBufferSize()]; char m_secondInitialConditionText[TextField::maxBufferSize()]; - Poincare::Expression * m_firstInitialConditionExpression; - Poincare::Expression * m_secondInitialConditionExpression; + mutable Poincare::Expression * m_firstInitialConditionExpression; + mutable Poincare::Expression * m_secondInitialConditionExpression; Poincare::ExpressionLayout * m_firstInitialConditionLayout; Poincare::ExpressionLayout * m_secondInitialConditionLayout; Poincare::ExpressionLayout * m_nameLayout; diff --git a/apps/shared/function.cpp b/apps/shared/function.cpp index 7cb2bb0fa..354ba28f9 100644 --- a/apps/shared/function.cpp +++ b/apps/shared/function.cpp @@ -60,7 +60,7 @@ const char * Function::name() const { return m_name; } -Poincare::Expression * Function::expression() { +Poincare::Expression * Function::expression() const { if (m_expression == nullptr) { m_expression = Expression::parse(m_text); } @@ -95,7 +95,7 @@ float Function::evaluateAtAbscissa(float x, Poincare::Context * context) const { Poincare::Symbol xSymbol = Poincare::Symbol(symbol()); Poincare::Complex e = Poincare::Complex::Float(x); variableContext.setExpressionForSymbolName(&e, &xSymbol); - return m_expression->approximate(variableContext); + return expression()->approximate(variableContext); } void Function::tidy() { diff --git a/apps/shared/function.h b/apps/shared/function.h index b3e0b05a5..cdf64bc4c 100644 --- a/apps/shared/function.h +++ b/apps/shared/function.h @@ -18,7 +18,7 @@ public: const char * text() const; const char * name() const; KDColor color() const { return m_color; } - Poincare::Expression * expression(); + Poincare::Expression * expression() const; Poincare::ExpressionLayout * layout(); virtual bool isDefined(); bool isActive(); @@ -29,7 +29,7 @@ public: virtual float evaluateAtAbscissa(float x, Poincare::Context * context) const; virtual void tidy(); protected: - Poincare::Expression * m_expression; + mutable Poincare::Expression * m_expression; private: virtual char symbol() const = 0; char m_text[TextField::maxBufferSize()];