correct
[repair.git] / Repair / RepairCompiler / MCC / IR / SetQuantifier.java
1 package MCC.IR;
2
3 import java.util.*;
4
5 public class SetQuantifier extends Quantifier {
6
7     VarDescriptor var;
8     SetDescriptor set;
9
10     public SetQuantifier() {
11         this.var = null;
12     }
13
14     public void setVar(VarDescriptor vd) {
15         this.var = vd;
16     }
17
18     public void setSet(SetDescriptor sd) {
19         this.set = sd;
20     }
21
22     public Set getRequiredDescriptors() {
23         HashSet v = new HashSet();
24         v.add(set);
25         return v;
26     }
27
28     public VarDescriptor getVar() {
29         return var;
30     }
31
32     public SetDescriptor getSet() {
33         return set;
34     }
35
36     public String toString() {
37         return "set quantifier " + var.getSymbol() + " in " + set.getSymbol();
38     }
39
40     public void generate_open(CodeWriter writer) {
41         writer.addDeclaration("struct SimpleIterator",var.getSafeSymbol()+"_iterator");
42         writer.outputline("for (SimpleHashiterator("+set.getSafeSymbol()+"_hash, & "+ var.getSafeSymbol()+"_iterator); hasNext(&"+var.getSafeSymbol()+"_iterator); )");
43         writer.startblock();
44         writer.addDeclaration(var.getType().getGenerateType().toString(), var.getSafeSymbol());
45         writer.outputline(var.getSafeSymbol() + " = (" + var.getType().getGenerateType() + ") next(&"+var.getSafeSymbol()+"_iterator);");
46     }
47
48     public void generate_open(CodeWriter writer, String type,int number, String left,String right) {
49         VarDescriptor tmp=VarDescriptor.makeNew("flag");
50         writer.addDeclaration("struct SimpleIterator",var.getSafeSymbol()+"_iterator");
51         writer.outputline("SimpleHashiterator("+set.getSafeSymbol()+"_hash, &"+var.getSafeSymbol()+"_iterator);");
52         writer.addDeclaration("int",tmp.getSafeSymbol());
53         writer.outputline(tmp.getSafeSymbol()+"=0;");
54         writer.outputline("if ("+type+"=="+number+")");
55         writer.outputline(tmp.getSafeSymbol()+"=1;");
56
57         writer.outputline("while("+tmp.getSafeSymbol()+"||(("+type+"!="+number+")&&hasNext(&"+var.getSafeSymbol()+"_iterator)))");
58         writer.startblock();
59         writer.addDeclaration(var.getType().getGenerateType().toString(), var.getSafeSymbol());
60         writer.outputline("if ("+type+"=="+number+")");
61         writer.startblock();
62         writer.outputline(tmp.getSafeSymbol()+"=0;");
63         writer.outputline(var.getSafeSymbol() + " = (" + var.getType().getGenerateType() + ") " + left + ";");
64         writer.endblock();
65         writer.outputline("else");
66         writer.outputline(var.getSafeSymbol() + " = (" + var.getType().getGenerateType() + ") next(&"+var.getSafeSymbol()+"_iterator);");
67     }
68
69     public int generate_worklistload(CodeWriter writer, int offset) {
70         String varname = var.getSafeSymbol();
71         writer.addDeclaration("int", varname);
72         writer.outputline(varname + " = wi->word" + offset + ";");
73         return offset + 1;
74     }
75
76     public int generate_workliststore(CodeWriter writer, int offset) {
77         String varname = var.getSafeSymbol();
78         writer.outputline("wi->word" + offset + " = " + varname + ";");
79         return offset + 1;
80     }
81
82
83 }