5 public class ImageSetExpr extends SetExpr {
6 static final public boolean INVERSE=true;
11 boolean isimageset=false;
13 public ImageSetExpr(boolean inverse, VarDescriptor vd, RelationDescriptor rd) {
16 this.inverse = inverse;
19 public ImageSetExpr(VarDescriptor vd, RelationDescriptor rd) {
25 public ImageSetExpr(boolean inverse, ImageSetExpr ise, RelationDescriptor rd) {
29 this.inverse = inverse;
32 public ImageSetExpr(ImageSetExpr ise, RelationDescriptor rd) {
39 public Set freeVars() {
40 HashSet hs=new HashSet();
45 public String name() {
50 name+=vd.toString()+".";
57 public boolean equals(Map remap, Expr e) {
58 if (e==null||!(e instanceof ImageSetExpr))
60 ImageSetExpr ise2=(ImageSetExpr)e;
61 if (ise2.isimageset!=isimageset)
63 if (ise2.inverse!=inverse)
69 return ise.equals(remap,ise2.ise);
71 VarDescriptor nvde=vd;
72 if (remap!=null&&remap.containsKey(nvde))
73 nvde=(VarDescriptor)remap.get(nvde);
80 public boolean inverted() {
84 public VarDescriptor getVar() {
88 public ImageSetExpr getImageSetExpr() {
92 public RelationDescriptor getRelation() {
96 public Descriptor getDescriptor() {
100 public boolean usesDescriptor(Descriptor d) {
102 return d==rd||ise.usesDescriptor(d);
103 return (d==rd)||(d==vd);
106 public Set getInversedRelations() {
107 HashSet set = new HashSet();
114 public Set getRequiredDescriptors() {
115 HashSet v = new HashSet();
120 public void generate(CodeWriter writer, VarDescriptor dest) {
121 throw new IRException("not supported");
124 public void generate_inclusion(CodeWriter writer, VarDescriptor dest, VarDescriptor element) {
125 String hash = inverse ? "_hashinv, " : "_hash, " ;
127 writer.addDeclaration("int", dest.getSafeSymbol());
128 writer.outputline(dest.getSafeSymbol() + " = SimpleHashcontainskeydata(" + rd.getSafeSymbol() + hash + vd.getSafeSymbol() + ", " + element.getSafeSymbol() + ");");
130 VarDescriptor newset=VarDescriptor.makeNew("newset");
131 generate_set(writer,newset);
132 writer.addDeclaration("int", dest.getSafeSymbol());
133 writer.outputline(dest.getSafeSymbol()+"=SimpleHashcontainskey("+newset.getSafeSymbol()+","+element.getSafeSymbol()+");");
134 writer.outputline("freeSimpleHash("+newset.getSafeSymbol()+");");
138 public void generate_size(CodeWriter writer, VarDescriptor dest) {
142 String hash = inverse ? "_hashinv, " : "_hash, " ;
143 writer.addDeclaration("int", dest.getSafeSymbol());
144 writer.outputline(dest.getSafeSymbol() + " = SimpleHashcount(" + rd.getSafeSymbol() + hash + vd.getSafeSymbol() + ");");
146 VarDescriptor newset=VarDescriptor.makeNew("newset");
147 generate_set(writer,newset);
148 writer.addDeclaration("int", dest.getSafeSymbol());
149 writer.outputline(dest.getSafeSymbol()+"=SimpleHashcountset("+newset.getSafeSymbol()+");");
150 writer.outputline("freeSimpleHash("+newset.getSafeSymbol()+");");
154 public void generate_leftside(CodeWriter writer, VarDescriptor dest) {
156 writer.addDeclaration(vd.getType().getGenerateType().toString(), dest.getSafeSymbol());
157 writer.outputline(dest.getSafeSymbol()+" = "+vd.getSafeSymbol()+";");
159 VarDescriptor iseset=VarDescriptor.makeNew("set");
160 ise.generate_set(writer,iseset);
161 writer.addDeclaration("int",dest.getSafeSymbol());
162 writer.outputline(dest.getSafeSymbol()+" = SimpleHashfirstkey("+iseset.getSafeSymbol()+");");
163 writer.outputline("freeSimpleHash("+iseset.getSafeSymbol()+");");
167 public void generate_set(CodeWriter writer, VarDescriptor dest) {
169 String hash = inverse ? "_hashinv, " : "_hash, " ;
170 writer.addDeclaration("struct SimpleHash *",dest.getSafeSymbol());
171 writer.outputline(dest.getSafeSymbol()+"=SimpleHashimageSet("+rd.getSafeSymbol()+hash+vd.getSafeSymbol()+");");
173 VarDescriptor iseset=VarDescriptor.makeNew("set");
174 ise.generate_set(writer,iseset);
176 VarDescriptor itvd=VarDescriptor.makeNew("iterator");
177 writer.addDeclaration("struct SimpleIterator",itvd.getSafeSymbol());
178 writer.outputline("SimpleHashiterator("+iseset.getSafeSymbol()+",&"+itvd.getSafeSymbol()+");");
179 writer.addDeclaration("struct SimpleHash *", dest.getSafeSymbol());
180 writer.outputline(dest.getSafeSymbol()+"=allocateSimpleHash(10);");
181 writer.outputline("while (hasNext(&"+itvd.getSafeSymbol()+")) {");
183 VarDescriptor keyvd=VarDescriptor.makeNew("key");
185 writer.addDeclaration("int",keyvd.getSafeSymbol());
186 writer.outputline(keyvd.getSafeSymbol()+"=next(&"+itvd.getSafeSymbol()+");");
187 String hash = inverse ? "_hashinv, " : "_hash, " ;
188 VarDescriptor newset=VarDescriptor.makeNew("newset");
189 writer.addDeclaration("struct SimpleHash *", newset.getSafeSymbol());
190 writer.outputline(newset.getSafeSymbol()+"=SimpleHashimageSet("+rd.getSafeSymbol()+hash+keyvd.getSafeSymbol()+");");
191 writer.outputline("SimpleHashaddAll("+dest.getSafeSymbol()+", "+ newset.getSafeSymbol()+");");
192 writer.outputline("freeSimpleHash("+newset.getSafeSymbol()+");");
193 writer.outputline("}");
194 writer.outputline("freeSimpleHash("+iseset.getSafeSymbol()+");");
198 public void prettyPrint(PrettyPrinter pp) {
200 pp.output(vd.toString());
207 pp.output(rd.toString());
210 public TypeDescriptor typecheck(SemanticAnalyzer sa) {
211 throw new IRException("not supported");