Search in sources :

Example 1 with LinkedBinaryOp

use of uk.me.parabola.mkgmap.osmstyle.eval.LinkedBinaryOp in project mkgmap by openstreetmap.

the class RuleSet method compile.

/**
 * Compile the rules and reset caches. Detect common sub-expressions and
 * make sure that all rules use the same instance of these common
 * sub-expressions.
 */
private void compile() {
    HashMap<String, Op> tests = new HashMap<String, Op>();
    for (Rule rule : rules) {
        Op op;
        if (rule instanceof ExpressionRule)
            op = ((ExpressionRule) rule).getOp();
        else if (rule instanceof ActionRule)
            op = ((ActionRule) rule).getOp();
        else {
            log.error("unexpected rule instance");
            continue;
        }
        if (op instanceof AbstractBinaryOp) {
            AbstractBinaryOp binOp = (AbstractBinaryOp) op;
            binOp.setFirst(compileOp(tests, binOp.getFirst()));
            binOp.setSecond(compileOp(tests, binOp.getSecond()));
            op = compileOp(tests, binOp);
        } else if (op instanceof AbstractOp) {
            op = compileOp(tests, op);
        } else if (op instanceof LinkedBinaryOp) {
            ((LinkedBinaryOp) op).setFirst(compileOp(tests, ((LinkedBinaryOp) op).getFirst()));
            ((LinkedBinaryOp) op).setSecond(compileOp(tests, ((LinkedBinaryOp) op).getSecond()));
        } else if (op instanceof LinkedOp) {
            Op wrappedOp = compileOp(tests, ((LinkedOp) op).getFirst());
            op.setFirst(wrappedOp);
        } else {
            log.error("unexpected op instance");
            continue;
        }
        if (rule instanceof ExpressionRule)
            ((ExpressionRule) rule).setOp(op);
        else if (rule instanceof ActionRule)
            ((ActionRule) rule).setOp(op);
        else {
            log.error("unexpected rule instance");
            continue;
        }
    }
    cacheId = 0;
    compiled = true;
}
Also used : LinkedBinaryOp(uk.me.parabola.mkgmap.osmstyle.eval.LinkedBinaryOp) AbstractBinaryOp(uk.me.parabola.mkgmap.osmstyle.eval.AbstractBinaryOp) AbstractOp(uk.me.parabola.mkgmap.osmstyle.eval.AbstractOp) Op(uk.me.parabola.mkgmap.osmstyle.eval.Op) LinkedOp(uk.me.parabola.mkgmap.osmstyle.eval.LinkedOp) AbstractOp(uk.me.parabola.mkgmap.osmstyle.eval.AbstractOp) HashMap(java.util.HashMap) LinkedOp(uk.me.parabola.mkgmap.osmstyle.eval.LinkedOp) AbstractBinaryOp(uk.me.parabola.mkgmap.osmstyle.eval.AbstractBinaryOp) LinkedBinaryOp(uk.me.parabola.mkgmap.osmstyle.eval.LinkedBinaryOp) Rule(uk.me.parabola.mkgmap.reader.osm.Rule)

Aggregations

HashMap (java.util.HashMap)1 AbstractBinaryOp (uk.me.parabola.mkgmap.osmstyle.eval.AbstractBinaryOp)1 AbstractOp (uk.me.parabola.mkgmap.osmstyle.eval.AbstractOp)1 LinkedBinaryOp (uk.me.parabola.mkgmap.osmstyle.eval.LinkedBinaryOp)1 LinkedOp (uk.me.parabola.mkgmap.osmstyle.eval.LinkedOp)1 Op (uk.me.parabola.mkgmap.osmstyle.eval.Op)1 Rule (uk.me.parabola.mkgmap.reader.osm.Rule)1