source: XIOS/dev/dev_olga/src/parse_expr/scalar_expr_node.cpp @ 1158

Last change on this file since 1158 was 1158, checked in by oabramkina, 7 years ago

Two server levels: merging with trunk r1137.
There are bugs.

File size: 2.8 KB
Line 
1#include "scalar_expr_node.hpp"
2#include "type.hpp"
3#include "variable.hpp"
4#include "operator_expr.hpp"
5
6namespace xios
7{
8  CScalarValExprNode::CScalarValExprNode(const std::string& strVal)
9    : strVal(strVal)
10  { /* Nothing to do */ }
11
12  double CScalarValExprNode::reduce() const
13  {
14    CType<double> val;
15    val.fromString(strVal);
16    return val;
17  }
18
19  CScalarVarExprNode::CScalarVarExprNode(const std::string& varId)
20    : varId(varId)
21  { /* Nothing to do */ }
22
23  double CScalarVarExprNode::reduce() const
24  {
25    // $missing_value will be replaced with NaN
26    if (varId == "missing_value")
27    {
28      return std::numeric_limits<double>::quiet_NaN();
29    }
30    else
31    {
32      if (!CVariable::has(varId)) 
33        ERROR("double CScalarVarExprNode::reduce() const", << "The variable " << varId << " does not exist.");
34
35      return CVariable::get(varId)->getData<double>();
36    }
37  }
38
39  CScalarUnaryOpExprNode::CScalarUnaryOpExprNode(const std::string& opId, IScalarExprNode* child)
40    : opId(opId)
41    , child(child)
42  {
43    if (!child)
44      ERROR("CScalarUnaryOpExprNode::CScalarUnaryOpExprNode(const std::string& opId, IScalarExprNode* child)",
45            "Impossible to create the new expression node, an invalid child node was provided.");
46  }
47
48  double CScalarUnaryOpExprNode::reduce() const
49  {
50    COperatorExpr::functionScalar op = operatorExpr.getOpScalar(opId);
51    return op(child->reduce());
52  }
53
54  CScalarBinaryOpExprNode::CScalarBinaryOpExprNode(IScalarExprNode* child1, const std::string& opId, IScalarExprNode* child2)
55    : child1(child1)
56    , opId(opId)
57    , child2(child2)
58  {
59    if (!child1 || !child2)
60      ERROR("CScalarBinaryOpExprNode::CScalarBinaryOpExprNode(IScalarExprNode* child1, const std::string& opId, IScalarExprNode* child2)",
61            "Impossible to create the new expression node, an invalid child node was provided.");
62  }
63
64  double CScalarBinaryOpExprNode::reduce() const
65  {
66    COperatorExpr::functionScalarScalar op = operatorExpr.getOpScalarScalar(opId);
67    return op(child1->reduce(), child2->reduce());
68  }
69
70
71  CScalarTernaryOpExprNode::CScalarTernaryOpExprNode(IScalarExprNode* child1, const std::string& opId, IScalarExprNode* child2, IScalarExprNode* child3)
72    : child1(child1)
73    , opId(opId)
74    , child2(child2)
75    , child3(child3)
76  {
77    if (!child1 || !child2 || !child3)
78      ERROR("CScalarTernaryOpExprNode::CScalarTernaryOpExprNode(IScalarExprNode* child1, const std::string& opId, IScalarExprNode* child2, IScalarExprNode* child3)",
79            "Impossible to create the new expression node, an invalid child node was provided.");
80  }
81
82  double CScalarTernaryOpExprNode::reduce() const
83  {
84    COperatorExpr::functionScalarScalarScalar op = operatorExpr.getOpScalarScalarScalar(opId);
85    return op(child1->reduce(), child2->reduce(), child3->reduce());
86  }
87}
Note: See TracBrowser for help on using the repository browser.