Numworks Epsilon  1.4.1
Graphing Calculator Operating System
variable_context.cpp
Go to the documentation of this file.
2 #include <poincare/preferences.h>
3 #include <assert.h>
4 #include <cmath>
5 
6 namespace Poincare {
7 
8 template<typename T>
9 VariableContext<T>::VariableContext(char name, Context * parentContext) :
10  m_name(name),
11  m_value(Complex<T>::Float(NAN)),
12  m_parentContext(parentContext)
13 {
14 }
15 
16 template<typename T>
17 void VariableContext<T>::setExpressionForSymbolName(const Expression * expression, const Symbol * symbol, Context & context) {
18  if (symbol->name() == m_name) {
19  if (expression == nullptr) {
20  return;
21  }
22  if (expression->type() == Expression::Type::Complex) {
23  m_value = Complex<T>::Float(static_cast<const Complex<T> *>(expression)->toScalar());
24  } else {
25  m_value = Complex<T>::Float(NAN);
26  }
27  } else {
28  m_parentContext->setExpressionForSymbolName(expression, symbol, context);
29  }
30 }
31 
32 template<typename T>
34  if (symbol->name() == m_name) {
35  return &m_value;
36  } else {
37  return m_parentContext->expressionForSymbol(symbol);
38  }
39 }
40 
43 
44 }
#define NAN
Definition: math.h:30
char name() const
Definition: symbol.cpp:185
#define T(x)
Definition: events.cpp:26
const Expression * expressionForSymbol(const Symbol *symbol) override
static Complex< T > Float(T x)
Definition: complex.cpp:23
void setExpressionForSymbolName(const Expression *expression, const Symbol *symbol, Context &context) override
virtual Type type() const =0
VariableContext(char name, Context *parentContext=nullptr)