MCPcopy Create free account
hub / github.com/PDAL/PDAL / compareexpr

Method compareexpr

filters/private/expr/ConditionalParser.cpp:116–176  ·  view source on GitHub ↗

ABELL - This treats == and >= at the same precendence level. In C++, <, >, <=, >= come before ==, !=

Source from the content-addressed store, hash-verified

114//ABELL - This treats == and >= at the same precendence level. In C++,
115// <, >, <=, >= come before ==, !=
116bool ConditionalParser::compareexpr(Expression& expr)
117{
118 if (!addexpr(expr))
119 return false;
120
121 while (true)
122 {
123 NodeType type = NodeType::None;
124
125 if (match(TokenType::Equal))
126 type = NodeType::Equal;
127 else if (match(TokenType::NotEqual))
128 type = NodeType::NotEqual;
129 else if (match(TokenType::Greater))
130 type = NodeType::Greater;
131 else if (match(TokenType::GreaterEqual))
132 type = NodeType::GreaterEqual;
133 else if (match(TokenType::Less))
134 type = NodeType::Less;
135 else if (match(TokenType::LessEqual))
136 type = NodeType::LessEqual;
137 else
138 return true;
139
140 if (!addexpr(expr))
141 return false;
142
143 NodePtr right = expr.popNode();
144 NodePtr left = expr.popNode();
145 ConstValueNode *leftVal = dynamic_cast<ConstValueNode *>(left.get());
146 ConstValueNode *rightVal = dynamic_cast<ConstValueNode *>(right.get());
147 if (leftVal && rightVal)
148 {
149 bool b(false);
150 if (type == NodeType::Equal)
151 b = (leftVal->value() == rightVal->value());
152 else if (type == NodeType::NotEqual)
153 b = (leftVal->value() != rightVal->value());
154 else if (type == NodeType::Greater)
155 b = (leftVal->value() > rightVal->value());
156 else if (type == NodeType::GreaterEqual)
157 b = (leftVal->value() >= rightVal->value());
158 else if (type == NodeType::Less)
159 b = (leftVal->value() < rightVal->value());
160 else if (type == NodeType::LessEqual)
161 b = (leftVal->value() <= rightVal->value());
162 expr.pushNode(NodePtr(new ConstLogicalNode(b)));
163 }
164 else
165 {
166 if (left->isBool() || right->isBool())
167 {
168 setError("Can't apply '" + curToken().sval() + "' to "
169 "logical expression.");
170 return false;
171 }
172 expr.pushNode(NodePtr(new CompareNode(type, std::move(left), std::move(right))));
173 }

Callers

nothing calls this directly

Calls 6

popNodeMethod · 0.80
pushNodeMethod · 0.80
svalMethod · 0.80
getMethod · 0.45
valueMethod · 0.45
isBoolMethod · 0.45

Tested by

no test coverage detected