Blame view

Giac_maj/epsilon-giac/poincare/src/variable_context.cpp 1.15 KB
6663b6c9   adorian   projet complet av...
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
  #include <poincare/variable_context.h>
  #include <poincare/preferences.h>
  #include <assert.h>
  #include <cmath>
  
  namespace Poincare {
  
  template<typename T>
  VariableContext<T>::VariableContext(char name, Context * parentContext) :
    m_name(name),
    m_value(Complex<T>::Float(NAN)),
    m_parentContext(parentContext)
  {
  }
  
  template<typename T>
  void VariableContext<T>::setExpressionForSymbolName(Expression * expression, const Symbol * symbol) {
    if (symbol->name() == m_name) {
      if (expression == nullptr) {
        return;
      }
      Evaluation<T> * evaluation = expression->evaluate<T>(*m_parentContext);
      /* WARNING: We assume that the evaluation of expression is a real */
      m_value = Complex<T>::Float(evaluation->toScalar());
      delete evaluation;
    } else {
      m_parentContext->setExpressionForSymbolName(expression, symbol);
    }
  }
  
  template<typename T>
  const Expression * VariableContext<T>::expressionForSymbol(const Symbol * symbol) {
    if (symbol->name() == m_name) {
      return &m_value;
    } else {
      return m_parentContext->expressionForSymbol(symbol);
    }
  }
  
  template class Poincare::VariableContext<float>;
  template class Poincare::VariableContext<double>;
  
  }