source: XIOS/trunk/src/parse_expr/expr_node.cpp @ 458

Last change on this file since 458 was 458, checked in by ymipsl, 10 years ago

Add new parsing expression functionnalities
adding new files

YM

  • Property svn:eol-style set to native
File size: 2.4 KB
Line 
1#include "expr_node.hpp"
2#include "field.hpp"
3
4namespace xios
5{
6
7  CScalarNode* CScalarNode::newNode(CSimpleNodeExpr* simpleNode)
8  {
9    if (simpleNode->nodeType==CSimpleNodeExpr::scalarDouble) return new CScalarDouble(simpleNode) ;
10    else if (simpleNode->nodeType==CSimpleNodeExpr::scalarVariable) return new CScalarVariable(simpleNode) ;
11    else if (simpleNode->nodeType==CSimpleNodeExpr::opScalar) return new COperatorScalarNode(simpleNode) ;
12    else if (simpleNode->nodeType==CSimpleNodeExpr::opScalarScalar) return new COperatorScalarScalarNode(simpleNode) ;
13    else 
14    {
15      ERROR("CScalarNode* CScalarNode::allocateChild(CSimpleNodeExpr* simpleNode)",<<"Non coherent node")
16      return NULL;
17    }
18  };
19
20
21  CFieldNode* CFieldNode::newNode(CSimpleNodeExpr* simpleNode)
22  {
23    if (simpleNode->nodeType==CSimpleNodeExpr::fieldInstant) return new CInstantFieldNode(simpleNode) ;
24    else if (simpleNode->nodeType==CSimpleNodeExpr::fieldAverage) return new  CAverageFieldNode(simpleNode) ;
25    else if (simpleNode->nodeType==CSimpleNodeExpr::opFieldScalar) return new COperatorFieldScalarNode(simpleNode) ;
26    else if (simpleNode->nodeType==CSimpleNodeExpr::opScalarField) return new COperatorScalarFieldNode(simpleNode) ;
27    else if (simpleNode->nodeType==CSimpleNodeExpr::opFieldField) return new COperatorFieldFieldNode(simpleNode) ;
28    else if (simpleNode->nodeType==CSimpleNodeExpr::opField) return new COperatorFieldNode(simpleNode) ;
29    else 
30    {
31      ERROR("CScalarNode* CScalarNode::allocateChild(CSimpleNodeExpr* simpleNode)",<<"Non coherent node")
32      return NULL;
33    }
34  };
35
36  void CInstantFieldNode::reduce(CField* thisField)
37  {
38    if (!reduced)
39    {
40      if (fieldId=="this")
41      {
42        field=thisField ;
43        array=thisField->getInstantData() ;
44        reduced=true ;
45      }
46      else if (CField::has(fieldId)) 
47      {
48        field =CField::get(fieldId) ;
49        array=field->getInstantData() ;
50        reduced=true ;
51      }
52      else ERROR("void CInstantFieldNode::reduce(void)",<<" Field "<<fieldId<<" does not exist")
53      }
54  }   
55
56  void CAverageFieldNode::reduce(CField* thisField)
57  {
58    if (!reduced)
59    {
60      if (CField::has(fieldId)) 
61      {
62        field=thisField ;
63        array=CField::get(fieldId)->getInstantData() ;
64        reduced=true ;
65      }
66      else ERROR("void CAverageFieldNode::reduce(void)",<<" Field "<<fieldId<<" does not exist")
67      }
68  }
69 
70}
Note: See TracBrowser for help on using the repository browser.