001package org.clafer.ir.analysis;
002
003import org.clafer.collection.Pair;
004import org.clafer.ir.IrBoolExpr;
005import org.clafer.ir.IrCard;
006import org.clafer.ir.IrCompare;
007import org.clafer.ir.IrIfOnlyIf;
008import org.clafer.ir.IrIntExpr;
009import org.clafer.ir.IrSetVar;
010
011/**
012 *
013 * @author jimmy
014 */
015public class AnalysisUtil {
016
017    private AnalysisUtil() {
018    }
019
020    public static Pair<IrIntExpr, IrSetVar> getAssignCardinality(IrBoolExpr expr) {
021        if (expr instanceof IrCompare) {
022            IrCompare compare = (IrCompare) expr;
023            if (IrCompare.Op.Equal.equals(compare.getOp())) {
024                return getAssignCardinality(compare.getLeft(), compare.getRight());
025            }
026        } else if (expr instanceof IrIfOnlyIf) {
027            IrIfOnlyIf ifOnlyIf = (IrIfOnlyIf) expr;
028            return getAssignCardinality(ifOnlyIf.getLeft(), ifOnlyIf.getRight());
029        }
030        return null;
031    }
032
033    public static Pair<IrIntExpr, IrSetVar> getAssignCardinality(IrIntExpr left, IrIntExpr right) {
034        Pair<IrIntExpr, IrSetVar> cardinality = getAssignCardinalityImpl(left, right);
035        if (cardinality == null) {
036            cardinality = getAssignCardinalityImpl(right, left);
037        }
038        return cardinality;
039    }
040
041    private static Pair<IrIntExpr, IrSetVar> getAssignCardinalityImpl(IrIntExpr left, IrIntExpr right) {
042        if (right instanceof IrCard) {
043            IrCard card = (IrCard) right;
044            if (card.getSet() instanceof IrSetVar) {
045                IrSetVar set = (IrSetVar) card.getSet();
046                return new Pair<>(left, set);
047            }
048        }
049        return null;
050    }
051}