Expr method to invert the sense of a relational

This commit is contained in:
Vern Paxson 2021-05-30 17:31:22 -07:00
parent b1e95d68e0
commit 4ee8bd0082
2 changed files with 31 additions and 0 deletions

View file

@ -211,6 +211,11 @@ ExprPtr Expr::MakeLvalue()
return {NewRef{}, this};
}
bool Expr::InvertSense()
{
return false;
}
void Expr::EvalIntoAggregate(const zeek::Type* /* t */, Val* /* aggr */,
Frame* /* f */) const
{
@ -2043,6 +2048,12 @@ ValPtr EqExpr::Fold(Val* v1, Val* v2) const
return BinaryExpr::Fold(v1, v2);
}
bool EqExpr::InvertSense()
{
tag = (tag == EXPR_EQ ? EXPR_NE : EXPR_EQ);
return true;
}
RelExpr::RelExpr(BroExprTag arg_tag, ExprPtr arg_op1, ExprPtr arg_op2)
: BinaryExpr(arg_tag, std::move(arg_op1), std::move(arg_op2))
{
@ -2100,6 +2111,19 @@ void RelExpr::Canonicize()
}
}
bool RelExpr::InvertSense()
{
switch ( tag ) {
case EXPR_LT: tag = EXPR_GE; return true;
case EXPR_LE: tag = EXPR_GT; return true;
case EXPR_GE: tag = EXPR_LT; return true;
case EXPR_GT: tag = EXPR_LE; return true;
default:
return false;
}
}
CondExpr::CondExpr(ExprPtr arg_op1, ExprPtr arg_op2, ExprPtr arg_op3)
: Expr(EXPR_COND),
op1(std::move(arg_op1)), op2(std::move(arg_op2)), op3(std::move(arg_op3))