Ignore:
Timestamp:
01/30/17 16:33:03 (7 years ago)
Author:
ymipsl
Message:
  • Add generic ternary arithmetic operators and filters
  • Add conditional operator "(cond) ? x : y" for arithmetic filters.

YM

File:
1 edited

Legend:

Unmodified
Added
Removed
  • XIOS/trunk/src/parse_expr/filter_expr_node.cpp

    r1001 r1038  
    22#include "unary_arithmetic_filter.hpp" 
    33#include "binary_arithmetic_filter.hpp" 
     4#include "ternary_arithmetic_filter.hpp" 
    45#include "field.hpp" 
    56 
     
    129130    return filter; 
    130131  } 
     132 
     133 
     134 
     135 
     136  CFilterScalarScalarFieldOpExprNode::CFilterScalarScalarFieldOpExprNode(IScalarExprNode* child1, const std::string& opId, IScalarExprNode* child2, IFilterExprNode* child3) 
     137    : child1(child1) 
     138    , opId(opId) 
     139    , child2(child2) 
     140    , child3(child3) 
     141  { 
     142    if (!child1 || !child2 || !child3) 
     143      ERROR("  CFilterScalarScalarFieldOpExprNode::CFilterScalarScalarFieldOpExprNode(IScalarExprNode* child1, const std::string& opId, IScalarExprNode* child2, IFilterExprNode* child3)", 
     144            "Impossible to create the new expression node, an invalid child node was provided."); 
     145  } 
     146 
     147  boost::shared_ptr<COutputPin> CFilterScalarScalarFieldOpExprNode::reduce(CGarbageCollector& gc, CField& thisField) const 
     148  { 
     149    boost::shared_ptr<CScalarScalarFieldArithmeticFilter> filter(new CScalarScalarFieldArithmeticFilter(gc, opId, child1->reduce(),child2->reduce())); 
     150    child3->reduce(gc, thisField)->connectOutput(filter, 0); 
     151    return filter; 
     152  } 
     153 
     154 
     155  CFilterScalarFieldScalarOpExprNode::CFilterScalarFieldScalarOpExprNode(IScalarExprNode* child1, const std::string& opId, IFilterExprNode* child2, IScalarExprNode* child3) 
     156    : child1(child1) 
     157    , opId(opId) 
     158    , child2(child2) 
     159    , child3(child3) 
     160  { 
     161    if (!child1 || !child2 || !child3) 
     162      ERROR("  CFilterScalarFieldScalarOpExprNode::CFilterScalarFieldScalarOpExprNode(IScalarExprNode* child1, const std::string& opId, IFilterExprNode* child2, IScalarExprNode* child3)", 
     163            "Impossible to create the new expression node, an invalid child node was provided."); 
     164  } 
     165 
     166  boost::shared_ptr<COutputPin> CFilterScalarFieldScalarOpExprNode::reduce(CGarbageCollector& gc, CField& thisField) const 
     167  { 
     168    boost::shared_ptr<CScalarFieldScalarArithmeticFilter> filter(new CScalarFieldScalarArithmeticFilter(gc, opId, child1->reduce(),child3->reduce())); 
     169    child2->reduce(gc, thisField)->connectOutput(filter, 0); 
     170    return filter; 
     171  } 
     172 
     173 
     174  CFilterScalarFieldFieldOpExprNode::CFilterScalarFieldFieldOpExprNode(IScalarExprNode* child1, const std::string& opId, IFilterExprNode* child2, IFilterExprNode* child3) 
     175    : child1(child1) 
     176    , opId(opId) 
     177    , child2(child2) 
     178    , child3(child3) 
     179  { 
     180    if (!child1 || !child2 || !child3) 
     181      ERROR("  CFilterScalarFieldFieldOpExprNode::CFilterScalarFieldFieldOpExprNode(IScalarExprNode* child1, const std::string& opId, IFilterExprNode* child2, IFilterExprNode* child3)", 
     182            "Impossible to create the new expression node, an invalid child node was provided."); 
     183  } 
     184 
     185  boost::shared_ptr<COutputPin> CFilterScalarFieldFieldOpExprNode::reduce(CGarbageCollector& gc, CField& thisField) const 
     186  { 
     187    boost::shared_ptr<CScalarFieldFieldArithmeticFilter> filter(new CScalarFieldFieldArithmeticFilter(gc, opId, child1->reduce())); 
     188    child2->reduce(gc, thisField)->connectOutput(filter, 0); 
     189    child3->reduce(gc, thisField)->connectOutput(filter, 1); 
     190    return filter; 
     191  } 
     192 
     193 
     194 
     195  CFilterFieldScalarScalarOpExprNode::CFilterFieldScalarScalarOpExprNode(IFilterExprNode* child1, const std::string& opId, IScalarExprNode* child2, IScalarExprNode* child3) 
     196    : child1(child1) 
     197    , opId(opId) 
     198    , child2(child2) 
     199    , child3(child3) 
     200  { 
     201    if (!child1 || !child2 || !child3) 
     202      ERROR("  CFilterFieldScalarScalarOpExprNode::CFilterFieldScalarScalarOpExprNode(IFilterExprNode* child1, const std::string& opId, IScalarExprNode* child2, IScalarExprNode* child3)", 
     203            "Impossible to create the new expression node, an invalid child node was provided."); 
     204  } 
     205 
     206  boost::shared_ptr<COutputPin> CFilterFieldScalarScalarOpExprNode::reduce(CGarbageCollector& gc, CField& thisField) const 
     207  { 
     208    boost::shared_ptr<CFieldScalarScalarArithmeticFilter> filter(new CFieldScalarScalarArithmeticFilter(gc, opId, child2->reduce(),child3->reduce())); 
     209    child1->reduce(gc, thisField)->connectOutput(filter, 0); 
     210    return filter; 
     211  } 
     212 
     213 
     214 
     215  CFilterFieldScalarFieldOpExprNode::CFilterFieldScalarFieldOpExprNode(IFilterExprNode* child1, const std::string& opId, IScalarExprNode* child2, IFilterExprNode* child3) 
     216    : child1(child1) 
     217    , opId(opId) 
     218    , child2(child2) 
     219    , child3(child3) 
     220  { 
     221    if (!child1 || !child2 || !child3) 
     222      ERROR("  CFilterFieldScalarFieldOpExprNode::CFilterFieldScalarFieldOpExprNode(IFilterExprNode* child1, const std::string& opId, IScalarExprNode* child2, IFilterExprNode* child3)", 
     223            "Impossible to create the new expression node, an invalid child node was provided."); 
     224  } 
     225 
     226  boost::shared_ptr<COutputPin> CFilterFieldScalarFieldOpExprNode::reduce(CGarbageCollector& gc, CField& thisField) const 
     227  { 
     228    boost::shared_ptr<CFieldScalarFieldArithmeticFilter> filter(new CFieldScalarFieldArithmeticFilter(gc, opId, child2->reduce())); 
     229    child1->reduce(gc, thisField)->connectOutput(filter, 0); 
     230    child3->reduce(gc, thisField)->connectOutput(filter, 1); 
     231    return filter; 
     232  } 
     233 
     234 
     235 
     236  CFilterFieldFieldScalarOpExprNode::CFilterFieldFieldScalarOpExprNode(IFilterExprNode* child1, const std::string& opId, IFilterExprNode* child2, IScalarExprNode* child3) 
     237    : child1(child1) 
     238    , opId(opId) 
     239    , child2(child2) 
     240    , child3(child3) 
     241  { 
     242    if (!child1 || !child2 || !child3) 
     243      ERROR("  CFilterFieldFieldScalarOpExprNode::CFilterFieldFieldScalarOpExprNode(IFilterExprNode* child1, const std::string& opId, IFilterExprNode* child2, IScalarExprNode* child3)", 
     244            "Impossible to create the new expression node, an invalid child node was provided."); 
     245  } 
     246 
     247  boost::shared_ptr<COutputPin> CFilterFieldFieldScalarOpExprNode::reduce(CGarbageCollector& gc, CField& thisField) const 
     248  { 
     249    boost::shared_ptr<CFieldFieldScalarArithmeticFilter> filter(new CFieldFieldScalarArithmeticFilter(gc, opId, child3->reduce())); 
     250    child1->reduce(gc, thisField)->connectOutput(filter, 0); 
     251    child2->reduce(gc, thisField)->connectOutput(filter, 1); 
     252    return filter; 
     253  } 
     254 
     255 
     256  CFilterFieldFieldFieldOpExprNode::CFilterFieldFieldFieldOpExprNode(IFilterExprNode* child1, const std::string& opId, IFilterExprNode* child2, IFilterExprNode* child3) 
     257    : child1(child1) 
     258    , opId(opId) 
     259    , child2(child2) 
     260    , child3(child3) 
     261  { 
     262    if (!child1 || !child2 || !child3) 
     263      ERROR("  CFilterFieldFieldFieldOpExprNode::CFilterFieldFieldFieldOpExprNode(IFilterExprNode* child1, const std::string& opId, IFilterExprNode* child2, IFilterExprNode* child3)", 
     264            "Impossible to create the new expression node, an invalid child node was provided."); 
     265  } 
     266 
     267  boost::shared_ptr<COutputPin> CFilterFieldFieldFieldOpExprNode::reduce(CGarbageCollector& gc, CField& thisField) const 
     268  { 
     269    boost::shared_ptr<CFieldFieldFieldArithmeticFilter> filter(new CFieldFieldFieldArithmeticFilter(gc, opId)); 
     270    child1->reduce(gc, thisField)->connectOutput(filter, 0); 
     271    child2->reduce(gc, thisField)->connectOutput(filter, 1); 
     272    child3->reduce(gc, thisField)->connectOutput(filter, 2); 
     273    return filter; 
     274  } 
     275   
    131276} 
Note: See TracChangeset for help on using the changeset viewer.