Added code to compute maximum sizes of sets. So we can eliminate set removes
[repair.git] / Repair / RepairCompiler / MCC / IR / InclusionPredicate.java
1 package MCC.IR;
2
3 import java.util.*;
4
5 public class InclusionPredicate extends Predicate {
6
7     Expr expr;
8     SetExpr setexpr;
9
10     public boolean inverted() {
11         return setexpr.inverted();
12     }
13
14     public String name() {
15         return expr.name() + " in "+setexpr.name();
16     }
17     
18     public InclusionPredicate(Expr expr, SetExpr setexpr) {
19         if (expr == null) {
20             throw new NullPointerException();
21         }
22
23         if (setexpr == null) {
24             throw new NullPointerException();
25         }
26
27         this.expr = expr;
28         this.setexpr = setexpr;
29     }
30
31     public Set getRequiredDescriptors() {
32         Set v = expr.getRequiredDescriptors();
33         v.addAll(setexpr.getRequiredDescriptors());
34         return v;
35     }
36
37     public void generate(CodeWriter writer, VarDescriptor dest) {
38         VarDescriptor var = VarDescriptor.makeNew("exprval");
39         expr.generate(writer, var);
40         setexpr.generate_inclusion(writer, dest, var);
41     }
42
43     public Set getInversedRelations() {
44
45         throw new IRException("unsupported");
46
47         //Set set = setexpr.getInversedRelations();
48         //set.addAll(expr.getInversedRelations());
49         //return set;
50     }
51
52     public Descriptor getDescriptor() {
53         if (setexpr instanceof ImageSetExpr) {
54             return ((ImageSetExpr)setexpr).getRelation();
55         } else
56             return setexpr.sd;
57     }
58
59     public int[] getRepairs(boolean negated, Termination t) {
60         if (setexpr instanceof ImageSetExpr) {
61             if (negated)
62                 return new int[] {AbstractRepair.REMOVEFROMRELATION};
63             else
64                 return new int[] {AbstractRepair.ADDTORELATION};
65         } else {
66             if (negated)
67                 return new int[] {AbstractRepair.REMOVEFROMSET};
68             else
69                 return new int[] {AbstractRepair.ADDTOSET};
70         }
71     }
72 }
73     
74