]> gerrit.simantics Code Review - simantics/platform.git/blob - 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
1 package org.simantics.scl.runtime.generation;\r
2 \r
3 import java.io.File;\r
4 import java.io.FileOutputStream;\r
5 import java.io.PrintStream;\r
6 import java.net.URL;\r
7 \r
8 public class GenerateTuples {\r
9     public static final String PACKAGE = "org.simantics.scl.runtime.tuple";\r
10     public static final int MAX_ARITY = 32;\r
11     \r
12     public static final String HEADER =\r
13             "/**\n"\r
14           + " * This code is generated in " + GenerateTuples.class.getName() + ".\n"\r
15           + " * Do not edit manually!\n"\r
16           + " */" \r
17             ;\r
18     \r
19     private static void generateTupleN(PrintStream p, int n) {\r
20         p.println(HEADER);\r
21         p.println("package " + PACKAGE + ";");\r
22         p.println();\r
23         p.println("public class Tuple" + n + " implements Tuple {");\r
24         for(int i=0;i<n;++i)\r
25             p.println("    public final Object c" + i + ";");\r
26         p.println();\r
27         p.print("    public Tuple" + n + "(");\r
28         for(int i=0;i<n;++i) {\r
29             if(i>0)\r
30                 p.print(", ");\r
31             p.print("Object c" + i);\r
32         }\r
33         p.println(") {");\r
34         for(int i=0;i<n;++i)\r
35             p.println("        this.c" + i + " = c" + i + ";");\r
36         p.println("    }");\r
37         p.println();\r
38         p.println("    public int length() {");\r
39         p.println("        return " + n + ";");\r
40         p.println("    }");\r
41         p.println();\r
42         p.println("    public Object get(int id) {");\r
43         p.println("        switch(id) {");\r
44         for(int i=0;i<n;++i)\r
45             p.println("        case " + i + ": return c" + i + ";");\r
46         p.println("        default: throw new IndexOutOfBoundsException();");\r
47         p.println("        }");\r
48         p.println("    }");\r
49         p.println();        \r
50         p.println("    public Object[] toArray() {");\r
51         p.print("        return new Object[] { ");\r
52         for(int i=0;i<n;++i) {\r
53             if(i > 0)\r
54                 p.print(", ");\r
55             p.print("c" + i);\r
56         }\r
57         p.println(" };");\r
58         p.println("    }");\r
59         p.println();\r
60         p.println("    @Override");\r
61         p.println("    public boolean equals(Object obj) {");\r
62         p.println("        if(obj == this)");\r
63         p.println("            return true;");\r
64         p.println("        if(obj == null || obj.getClass() != getClass())");\r
65         p.println("            return false;");\r
66         p.println("        Tuple"+n+" tuple = (Tuple"+n+")obj;");\r
67         for(int i=0;i<n;++i) {\r
68             p.println("        if(c"+i+" == null) {");\r
69             p.println("            if(tuple.c"+i+" != null)");\r
70             p.println("                return false;");\r
71             p.println("        }");\r
72             p.println("        else if(!c"+i+".equals(tuple.c"+i+"))");\r
73             p.println("            return false;");\r
74         }\r
75         p.println("        return true;");\r
76         p.println("    }");\r
77         p.println();\r
78         p.println("    @Override");\r
79         p.println("    public int hashCode() {");\r
80         p.println("        int result = c0 == null ? 0 : c0.hashCode();");\r
81         for(int i=1;i<n;++i) {\r
82             p.println("        result *= 31;");\r
83             p.println("        if(c"+i+" != null)");\r
84             p.println("            result += c"+i+".hashCode();");\r
85         }\r
86         p.println("        return result;");\r
87         p.println("    }");\r
88         p.println();\r
89         p.println("    @Override");\r
90         p.println("    public String toString() {");\r
91         p.println("        StringBuilder b = new StringBuilder();");\r
92         p.println("        b.append('(');");\r
93         for(int i=0;i<n;++i) {\r
94             if(i > 0)\r
95                 p.println("        b.append(',');");\r
96             p.println("        b.append(c" + i + ");");\r
97         }\r
98         p.println("        b.append(')');");\r
99         p.println("        return b.toString();");\r
100         p.println("    }");\r
101         p.println("}");\r
102     }\r
103     \r
104     public static void main(String[] args) throws Exception {\r
105         URL url = GenerateFunctions.class.getResource(".");\r
106         File dir = new File(url.getPath());\r
107         while(!new File(dir, "src").exists())\r
108             dir = dir.getParentFile();        \r
109         dir = new File(dir, "src");\r
110         dir = new File(dir, PACKAGE.replace('.', '/'));\r
111         dir.mkdirs();\r
112         \r
113         for(int n=2;n<=MAX_ARITY;++n) {\r
114             PrintStream ps = \r
115                 new PrintStream(new FileOutputStream(new File(dir, "Tuple"+n+".java")));\r
116             generateTupleN(ps, n);\r
117         }\r
118     }\r
119 }\r