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}