5 public class SumExpr extends Expr {
11 public SumExpr(SetDescriptor sd, RelationDescriptor rd) {
12 if (sd == null||rd==null) {
13 throw new NullPointerException();
19 public String name() {
20 return "sum("+sd.toString()+"."+rd.toString()+")";
23 public boolean equals(Map remap, Expr e) {
24 if (e==null||!(e instanceof SumExpr))
26 SumExpr se=(SumExpr)e;
27 return (se.sd==sd)&&(se.rd==rd);
30 public boolean usesDescriptor(Descriptor d) {
31 return (sd==d)||(rd==d);
34 public Set useDescriptor(Descriptor d) {
35 HashSet newset=new HashSet();
41 public Descriptor getDescriptor() {
42 throw new Error("Sum shouldn't appear on left hand side!");
45 public boolean inverted() {
49 public Set getRequiredDescriptors() {
50 HashSet v=new HashSet();
56 public void generate(CodeWriter writer, VarDescriptor dest) {
57 writer.addDeclaration("int",dest.getSafeSymbol());
58 writer.outputline(dest.getSafeSymbol()+"=0;");
61 VarDescriptor itvd=VarDescriptor.makeNew("iterator");
62 writer.addDeclaration("struct SimpleIterator",itvd.getSafeSymbol());
63 writer.outputline("SimpleHashiterator("+sd.getSafeSymbol()+"_hash , &"+itvd.getSafeSymbol()+");");
64 writer.outputline("while (hasNext(&"+itvd.getSafeSymbol()+")) {");
65 VarDescriptor keyvd=VarDescriptor.makeNew("key");
66 writer.addDeclaration("int",keyvd.getSafeSymbol());
67 writer.outputline(keyvd.getSafeSymbol()+"=next(&"+itvd.getSafeSymbol()+");");
68 VarDescriptor tmpvar=VarDescriptor.makeNew("tmp");
69 writer.addDeclaration("int",tmpvar.getSafeSymbol());
70 writer.outputline("SimpleHashget("+rd.getSafeSymbol()+"_hash, "+keyvd.getSafeSymbol()+", &"+tmpvar.getSafeSymbol()+");");
71 writer.outputline(dest.getSafeSymbol()+"+="+tmpvar.getSafeSymbol()+";");
72 writer.outputline("}");
75 public void prettyPrint(PrettyPrinter pp) {
77 pp.output(sd.toString());
79 pp.output(rd.toString());
83 public TypeDescriptor typecheck(SemanticAnalyzer sa) {
84 this.td = ReservedTypeDescriptor.INT;
88 public Set getInversedRelations() {