001package daikon.diff;
002
003import daikon.inv.Implication;
004import daikon.inv.Invariant;
005import java.util.Comparator;
006import org.checkerframework.dataflow.qual.Pure;
007
008/**
009 * Comparator for pairing invariants. In an invariant in set2 is an implication, its consequent is
010 * used instead of the whole invariant. In set1, the whole invariant is always used. Some examples:
011 *
012 * <pre>
013 * this.compare(A, B&rArr;A) == c.compare(A, A)
014 * this.compare(C, D) == c.compare(C, D)
015 * </pre>
016 */
017public class ConsequentPairComparator implements Comparator<Invariant> {
018
019  private Comparator<Invariant> c;
020
021  public ConsequentPairComparator(Comparator<Invariant> c) {
022    this.c = c;
023  }
024
025  @Pure
026  @Override
027  public int compare(Invariant inv1, Invariant inv2) {
028    if (inv2 instanceof Implication) {
029      Implication imp2 = (Implication) inv2;
030      inv2 = imp2.consequent();
031    }
032
033    return c.compare(inv1, inv2);
034  }
035}