--- /dev/null
+package org.simantics.scl.runtime.generation;\r
+\r
+import java.io.File;\r
+import java.io.FileOutputStream;\r
+import java.io.PrintStream;\r
+import java.net.URL;\r
+\r
+public class GenerateTuples {\r
+ public static final String PACKAGE = "org.simantics.scl.runtime.tuple";\r
+ public static final int MAX_ARITY = 32;\r
+ \r
+ public static final String HEADER =\r
+ "/**\n"\r
+ + " * This code is generated in " + GenerateTuples.class.getName() + ".\n"\r
+ + " * Do not edit manually!\n"\r
+ + " */" \r
+ ;\r
+ \r
+ private static void generateTupleN(PrintStream p, int n) {\r
+ p.println(HEADER);\r
+ p.println("package " + PACKAGE + ";");\r
+ p.println();\r
+ p.println("public class Tuple" + n + " implements Tuple {");\r
+ for(int i=0;i<n;++i)\r
+ p.println(" public final Object c" + i + ";");\r
+ p.println();\r
+ p.print(" public Tuple" + n + "(");\r
+ for(int i=0;i<n;++i) {\r
+ if(i>0)\r
+ p.print(", ");\r
+ p.print("Object c" + i);\r
+ }\r
+ p.println(") {");\r
+ for(int i=0;i<n;++i)\r
+ p.println(" this.c" + i + " = c" + i + ";");\r
+ p.println(" }");\r
+ p.println();\r
+ p.println(" public int length() {");\r
+ p.println(" return " + n + ";");\r
+ p.println(" }");\r
+ p.println();\r
+ p.println(" public Object get(int id) {");\r
+ p.println(" switch(id) {");\r
+ for(int i=0;i<n;++i)\r
+ p.println(" case " + i + ": return c" + i + ";");\r
+ p.println(" default: throw new IndexOutOfBoundsException();");\r
+ p.println(" }");\r
+ p.println(" }");\r
+ p.println(); \r
+ p.println(" public Object[] toArray() {");\r
+ p.print(" return new Object[] { ");\r
+ for(int i=0;i<n;++i) {\r
+ if(i > 0)\r
+ p.print(", ");\r
+ p.print("c" + i);\r
+ }\r
+ p.println(" };");\r
+ p.println(" }");\r
+ p.println();\r
+ p.println(" @Override");\r
+ p.println(" public boolean equals(Object obj) {");\r
+ p.println(" if(obj == this)");\r
+ p.println(" return true;");\r
+ p.println(" if(obj == null || obj.getClass() != getClass())");\r
+ p.println(" return false;");\r
+ p.println(" Tuple"+n+" tuple = (Tuple"+n+")obj;");\r
+ for(int i=0;i<n;++i) {\r
+ p.println(" if(c"+i+" == null) {");\r
+ p.println(" if(tuple.c"+i+" != null)");\r
+ p.println(" return false;");\r
+ p.println(" }");\r
+ p.println(" else if(!c"+i+".equals(tuple.c"+i+"))");\r
+ p.println(" return false;");\r
+ }\r
+ p.println(" return true;");\r
+ p.println(" }");\r
+ p.println();\r
+ p.println(" @Override");\r
+ p.println(" public int hashCode() {");\r
+ p.println(" int result = c0 == null ? 0 : c0.hashCode();");\r
+ for(int i=1;i<n;++i) {\r
+ p.println(" result *= 31;");\r
+ p.println(" if(c"+i+" != null)");\r
+ p.println(" result += c"+i+".hashCode();");\r
+ }\r
+ p.println(" return result;");\r
+ p.println(" }");\r
+ p.println();\r
+ p.println(" @Override");\r
+ p.println(" public String toString() {");\r
+ p.println(" StringBuilder b = new StringBuilder();");\r
+ p.println(" b.append('(');");\r
+ for(int i=0;i<n;++i) {\r
+ if(i > 0)\r
+ p.println(" b.append(',');");\r
+ p.println(" b.append(c" + i + ");");\r
+ }\r
+ p.println(" b.append(')');");\r
+ p.println(" return b.toString();");\r
+ p.println(" }");\r
+ p.println("}");\r
+ }\r
+ \r
+ public static void main(String[] args) throws Exception {\r
+ URL url = GenerateFunctions.class.getResource(".");\r
+ File dir = new File(url.getPath());\r
+ while(!new File(dir, "src").exists())\r
+ dir = dir.getParentFile(); \r
+ dir = new File(dir, "src");\r
+ dir = new File(dir, PACKAGE.replace('.', '/'));\r
+ dir.mkdirs();\r
+ \r
+ for(int n=2;n<=MAX_ARITY;++n) {\r
+ PrintStream ps = \r
+ new PrintStream(new FileOutputStream(new File(dir, "Tuple"+n+".java")));\r
+ generateTupleN(ps, n);\r
+ }\r
+ }\r
+}\r