sS tok_genEqualsAndHashCode(S className, LPairS fields) { StringBuilder buf = new("public bool equals(O o) {\n"); if (empty(fields)) buf.append("ret o instanceof " + className + ";\n"); else buf.append([[if (!o instanceof ]] + className + [[) false; ]] + className + [[ x = cast o; ret ]] + join(" && ", map(fields, func(Pair p) -> S { // TODO: use == for primitive fields "eq(" + p.b + ", x." + p.b + ")" })) + ";\n"); buf.append("}\n\n"); buf.append([[ public int hashCode() { int h = ]] + hashCode(className) + [[; ]] + concatMap_strings(fields, func(Pair p) { "h = boostHashCombine(h, _hashCode(" + p.b + [[)); ]]}) + [[ret h; } ]]; ret str(buf); }