]> gerrit.simantics Code Review - simantics/platform.git/blobdiff - bundles/org.simantics.scl.runtime/generation/org/simantics/scl/runtime/generation/GenerateTuples.java
Migrated source code from Simantics SVN
[simantics/platform.git] / bundles / org.simantics.scl.runtime / generation / org / simantics / scl / runtime / generation / GenerateTuples.java
diff --git a/bundles/org.simantics.scl.runtime/generation/org/simantics/scl/runtime/generation/GenerateTuples.java b/bundles/org.simantics.scl.runtime/generation/org/simantics/scl/runtime/generation/GenerateTuples.java
new file mode 100755 (executable)
index 0000000..291d68b
--- /dev/null
@@ -0,0 +1,119 @@
+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