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->contains(" : "_hash->contains(" ;
127 writer.outputline("int " + dest.getSafeSymbol() + " = " + rd.getSafeSymbol() + hash + vd.getSafeSymbol() + ", " + element.getSafeSymbol() + ");");
129 VarDescriptor newset=VarDescriptor.makeNew("newset");
130 generate_set(writer,newset);
131 writer.outputline("int "+dest.getSafeSymbol()+"="+newset.getSafeSymbol()+"->contains("+element.getSafeSymbol()+");");
132 writer.outputline("delete "+newset.getSafeSymbol()+";");
136 public void generate_size(CodeWriter writer, VarDescriptor dest) {
140 String hash = inverse ? "_hashinv->count(" : "_hash->count(" ;
141 writer.outputline("int " + dest.getSafeSymbol() + " = " + rd.getSafeSymbol() + hash + vd.getSafeSymbol() + ");");
143 VarDescriptor newset=VarDescriptor.makeNew("newset");
144 generate_set(writer,newset);
145 writer.outputline("int "+dest.getSafeSymbol()+"="+newset.getSafeSymbol()+"->count();");
146 writer.outputline("delete "+newset.getSafeSymbol()+";");
150 public void generate_leftside(CodeWriter writer, VarDescriptor dest) {
152 writer.outputline(vd.getType().getGenerateType()+" "+dest.getSafeSymbol()+" = "+vd.getSafeSymbol()+";");
154 VarDescriptor iseset=VarDescriptor.makeNew("set");
155 ise.generate_set(writer,iseset);
156 writer.outputline("int "+dest.getSafeSymbol()+" = "+iseset.getSafeSymbol()+"->firstkey();");
157 writer.outputline("delete "+iseset.getSafeSymbol()+";");
161 public void generate_set(CodeWriter writer, VarDescriptor dest) {
163 String hash = inverse ? "_hashinv->imageSet(" : "_hash->imageSet(" ;
164 writer.outputline("SimpleHash * "+dest.getSafeSymbol()+"="+rd.getSafeSymbol()+hash+vd.getSafeSymbol()+");");
166 VarDescriptor iseset=VarDescriptor.makeNew("set");
167 ise.generate_set(writer,iseset);
169 VarDescriptor itvd=VarDescriptor.makeNew("iterator");
170 writer.outputline("SimpleIterator "+itvd.getSafeSymbol()+";");
171 writer.outputline(iseset.getSafeSymbol()+"->iterator("+itvd.getSafeSymbol()+");");
173 writer.outputline("SimpleHash *"+dest.getSafeSymbol()+"=new SimpleHash(10);");
174 writer.outputline("while ("+itvd.getSafeSymbol()+".hasNext()) {");
176 VarDescriptor keyvd=VarDescriptor.makeNew("key");
178 writer.outputline("int "+keyvd.getSafeSymbol()+"="+itvd.getSafeSymbol()+".next();");
179 String hash = inverse ? "_hashinv->imageSet(" : "_hash->imageSet(" ;
180 VarDescriptor newset=VarDescriptor.makeNew("newset");
181 writer.outputline("SimpleHash * "+newset.getSafeSymbol()+"="+rd.getSafeSymbol()+hash+keyvd.getSafeSymbol()+");");
182 writer.outputline(dest.getSafeSymbol()+"->addAll("+newset.getSafeSymbol()+");");
183 writer.outputline("delete "+newset.getSafeSymbol()+";");
184 writer.outputline("}");
185 writer.outputline("delete "+iseset.getSafeSymbol()+";");
189 public void prettyPrint(PrettyPrinter pp) {
191 pp.output(vd.toString());
198 pp.output(rd.toString());
201 public TypeDescriptor typecheck(SemanticAnalyzer sa) {
202 throw new IRException("not supported");