use of uk.me.parabola.mkgmap.osmstyle.eval.OrOp in project mkgmap by openstreetmap.
the class ExpressionArranger method distribute.
/**
* Create a new OR expression from OR and an other expression.
*
* Starting point is a node of the form (a|b|...) & c
*
* The output is (a & c) | (b & c) | ...
*/
private Op distribute(Op op) {
Op ab = op.getFirst();
Op a = ab.getFirst();
Op b = ab.getSecond();
Op c = op.getSecond();
assert a != b : "ab";
assert b != c : "bc";
// Collect the OR terms into a list
List<Op> orterms = new ArrayList<>();
while (b.isType(OR)) {
orterms.add(b.getFirst());
b = b.getSecond();
}
OrOp topOR = new OrOp();
topOR.setFirst(new AndOp().set(a, c));
OrOp current = topOR;
for (Op orterm : orterms) {
AndOp and = new AndOp().set(orterm, c.copy());
OrOp newOr = new OrOp().set(and, null);
current.setSecond(newOr);
current = newOr;
}
current.setSecond(new AndOp().set(b, c.copy()));
return topOR;
}
Aggregations