]> gerrit.simantics Code Review - simantics/platform.git/blobdiff - bundles/org.simantics.scl.runtime/generation/org/simantics/scl/runtime/generation/GenerateFunctions.java
Migrated source code from Simantics SVN
[simantics/platform.git] / bundles / org.simantics.scl.runtime / generation / org / simantics / scl / runtime / generation / GenerateFunctions.java
diff --git a/bundles/org.simantics.scl.runtime/generation/org/simantics/scl/runtime/generation/GenerateFunctions.java b/bundles/org.simantics.scl.runtime/generation/org/simantics/scl/runtime/generation/GenerateFunctions.java
new file mode 100755 (executable)
index 0000000..7edcc8d
--- /dev/null
@@ -0,0 +1,460 @@
+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 GenerateFunctions {\r
+    \r
+    public static final String PACKAGE = "org.simantics.scl.runtime.function";\r
+    public static final int MAX_ARITY = 8;\r
+    \r
+    public static final String HEADER =\r
+            "/**\n"\r
+          + " * This code is generated in " + GenerateFunctions.class.getName() + ".\n"\r
+          + " * Do not edit manually!\n"\r
+          + " */" \r
+            ;\r
+    \r
+    public static void generateFunctionN(PrintStream p, int n) {\r
+        p.println(HEADER);\r
+        p.println("package " + PACKAGE + ";");\r
+        p.println();        \r
+        p.print("public interface Function"+n+"<");\r
+        for(int i=0;i<n;++i)\r
+            p.print("P" + i + ",");\r
+        p.println("R> {");\r
+        p.print("    R apply(");\r
+        for(int i=0;i<n;++i) {\r
+            if(i>0)\r
+                p.print(", ");\r
+            p.print("P"+i+" p" + i);\r
+        }\r
+        p.println(");");\r
+        p.println("}");\r
+    }\r
+    \r
+    public static void generateFunctionN(PrintStream p) {\r
+        p.println(HEADER);\r
+        p.println("package " + PACKAGE + ";");\r
+        p.println();\r
+        p.println("public interface FunctionN {");\r
+        p.println("    Object applyArray(Object ... ps);");\r
+        p.println("}");\r
+    }\r
+    \r
+    public static void generateFunction(PrintStream p) {\r
+        p.println(HEADER);\r
+        p.println("package " + PACKAGE + ";");\r
+        p.println();\r
+        //p.println("@SuppressWarnings(\"all\")");\r
+        p.print("public interface Function<");\r
+        for(int k=0;k<MAX_ARITY;++k) {\r
+            p.print("P"+k+",");\r
+        }\r
+        for(int k=1;k<=MAX_ARITY;++k) {\r
+            p.print("R"+k);\r
+            if(k < MAX_ARITY)\r
+                p.print(",");\r
+        }\r
+        p.println("> extends");        \r
+        for(int k=1;k<=MAX_ARITY;++k) {\r
+            p.print("    Function" + k + "<");\r
+            for(int i=0;i<k;++i) {\r
+                p.print("P"+i+",");\r
+            }\r
+            p.println("R"+k+">,");\r
+        }\r
+        p.println("    FunctionN {");\r
+        p.println("}");\r
+    }\r
+    \r
+    public static void generateFunctionImplN(PrintStream p, int n) {\r
+        p.println(HEADER);\r
+        p.println("package " + PACKAGE + ";");\r
+        p.println();\r
+        p.println("import java.util.Arrays;");\r
+        p.println();\r
+        p.println("@SuppressWarnings(\"all\")");\r
+        p.print("public abstract class FunctionImpl" + n + "<");\r
+        for(int i=0;i<n;++i)\r
+            p.print("P" + i + ",");\r
+        p.print("R> implements Function<");\r
+        for(int i=0;i<n;++i)\r
+            p.print("P" + i + ",");\r
+        for(int i=n;i<MAX_ARITY;++i)\r
+            p.print("Object,");\r
+        for(int i=1;i<=MAX_ARITY;++i) {\r
+            if(i == n)\r
+                p.print("R");\r
+            else \r
+                p.print("Object");\r
+            if(i < MAX_ARITY)\r
+                p.print(",");\r
+        }\r
+        p.println("> {");\r
+        for(int k=1;k<Math.min(n, MAX_ARITY+1);++k) {\r
+            p.println("    @Override");\r
+            p.print("    public Object apply(");\r
+            for(int i=0;i<k;++i) {\r
+                if(i>0)\r
+                    p.print(", ");\r
+                p.print("Object p" + i);\r
+            }\r
+            p.println(") {");\r
+            p.print("        return new UnsaturatedFunction" + k + "(this");\r
+            for(int i=0;i<k;++i)\r
+                p.print(", p" + i);\r
+            p.println(");");\r
+            p.println("    }");\r
+            p.println();\r
+        }\r
+        {\r
+            if(n <= MAX_ARITY)\r
+                p.println("    @Override");\r
+            p.print("    public abstract R apply(");\r
+            for(int i=0;i<n;++i) {\r
+                if(i>0)\r
+                    p.print(", ");\r
+                p.print("P"+i+" p" + i);\r
+            }\r
+            p.println(");");\r
+            p.println();\r
+        }\r
+        for(int k=n+1;k<=MAX_ARITY;++k) {\r
+            p.println("    @Override");\r
+            p.print("    public Object apply(");\r
+            for(int i=0;i<k;++i) {\r
+                if(i>0)\r
+                    p.print(", ");\r
+                p.print("Object p" + i);\r
+            }\r
+            p.println(") {");\r
+            p.println("        try {");\r
+            p.print("            return ((Function)apply(");\r
+            for(int i=0;i<n;++i) {\r
+                if(i>0)\r
+                    p.print(", ");\r
+                p.print("(P"+i+")p" + i);\r
+            }\r
+            p.print(")).apply(");\r
+            for(int i=n;i<k;++i) {\r
+                if(i>n)\r
+                    p.print(", ");\r
+                p.print("p" + i);\r
+            }\r
+            p.println(");");\r
+            p.println("        } catch(ClassCastException e) {");\r
+            p.println("            throw new CalledWithTooManyParameters();");\r
+            p.println("        }");\r
+            p.println("    }");\r
+            p.println();\r
+        }\r
+        p.println("    @Override");\r
+        p.println("    public Object applyArray(Object ... ps) {");\r
+        p.println("        switch(ps.length) {");\r
+        for(int k=0;k<=MAX_ARITY+n;++k) {\r
+            p.println("        case " + k + ":");\r
+            if(k==0)\r
+                p.println("            return this;");\r
+            else if(k < n) {\r
+                p.print("            return new UnsaturatedFunction" + k + "(this");\r
+                for(int i=0;i<k;++i)\r
+                    p.print(", ps[" + i + "]");\r
+                p.println(");");\r
+            }\r
+            else if(k == n) {\r
+                p.print("            return apply(");\r
+                for(int i=0;i<k;++i) {\r
+                    if(i > 0)\r
+                        p.print(", ");\r
+                    p.print("(P"+i+")ps[" + i + "]");\r
+                }\r
+                p.println(");");\r
+            }\r
+            else if(k <= n + MAX_ARITY) {\r
+                p.println("            try {");\r
+                p.print("                return ((Function)apply(");\r
+                for(int i=0;i<n;++i) {\r
+                    if(i>0)\r
+                        p.print(", ");\r
+                    p.print("(P"+i+")ps[" + i + "]");\r
+                }\r
+                p.print(")).apply(");\r
+                for(int i=n;i<k;++i) {\r
+                    if(i>n)\r
+                        p.print(", ");\r
+                    p.print("ps[" + i + "]");\r
+                }\r
+                p.println(");");\r
+                p.println("            } catch(ClassCastException e) {");\r
+                p.println("                throw new CalledWithTooManyParameters();");\r
+                p.println("            }");\r
+            }\r
+        }\r
+        {\r
+            p.println("        default:");\r
+            p.println("            try {");\r
+            p.print("                return ((Function)apply(");\r
+            for(int i=0;i<n;++i) {\r
+                if(i>0)\r
+                    p.print(", ");\r
+                p.print("(P"+i+")ps[" + i + "]");\r
+            }\r
+            p.println(")).apply(Arrays.copyOfRange(ps, "+n+", ps.length));");\r
+            p.println("            } catch(ClassCastException e) {");\r
+            p.println("                throw new CalledWithTooManyParameters();");\r
+            p.println("            }");\r
+        }\r
+        p.println("        }");\r
+        p.println("    }");\r
+        p.println("}");\r
+    }\r
+    \r
+    public static void generateFunctionImplN(PrintStream p) {\r
+        p.println(HEADER);\r
+        p.println("package " + PACKAGE + ";");\r
+        p.println();\r
+        p.println("import java.util.Arrays;");\r
+        p.println();\r
+        p.println("@SuppressWarnings(\"all\")");\r
+        p.println("public abstract class FunctionImplN implements Function {");\r
+        p.println("    int arity;");\r
+        p.println();\r
+        p.println("    public FunctionImplN(int arity) {");\r
+        p.println("        if(arity < 1)");\r
+        p.println("            throw new IllegalArgumentException();");\r
+        p.println("        this.arity = arity;");\r
+        p.println("    }");\r
+        p.println();\r
+        for(int k=1;k<=MAX_ARITY;++k) {\r
+            p.println("    @Override");\r
+            p.print("    public Object apply(");\r
+            for(int i=0;i<k;++i) {\r
+                if(i>0)\r
+                    p.print(", ");\r
+                p.print("Object p" + i);\r
+            }\r
+            p.println(") {");\r
+            p.println("        try {");\r
+            p.println("            switch(arity) {");\r
+            for(int i=1;i<k;++i) {\r
+                p.print("            case " + i + ": return ((Function)doApply(");\r
+                for(int j=0;j<i;++j) {\r
+                    if(j>0)\r
+                        p.print(", ");\r
+                    p.print("p" + j);\r
+                }\r
+                p.print(")).apply(");\r
+                for(int j=i;j<k;++j) {\r
+                    if(j>i)\r
+                        p.print(", ");\r
+                    p.print("p" + j);\r
+                }\r
+                p.println(");");\r
+            }\r
+            p.print("            case " + k + ": return doApply(");\r
+            for(int i=0;i<k;++i) {\r
+                if(i>0)\r
+                    p.print(", ");\r
+                p.print("p" + i);\r
+            }\r
+            p.println(");");\r
+            p.print("            default: return new UnsaturatedFunction" + k + "(this");\r
+            for(int i=0;i<k;++i)\r
+                p.print(", p" + i);\r
+            p.println(");");\r
+            p.println("            }");\r
+            p.println("        } catch(ClassCastException e) {");\r
+            p.println("            throw new CalledWithTooManyParameters();");\r
+            p.println("        }");\r
+            p.println("    }");\r
+            p.println();\r
+        }\r
+        p.println("    public abstract Object doApply(Object ... ps);");\r
+        p.println();\r
+        p.println("    @Override");\r
+        p.println("    public Object applyArray(Object ... ps) {");\r
+        p.println("        if(ps.length == arity)");\r
+        p.println("            return doApply(ps);");\r
+        p.println("        else if(ps.length < arity)");\r
+        p.println("            return new UnsaturatedFunctionN(this, ps);");\r
+        p.println("        else /* ps.length > arity */ {");\r
+        p.println("            try {");\r
+        p.println("                return ((Function)doApply(Arrays.copyOf(ps, arity))).applyArray(Arrays.copyOfRange(ps, arity, ps.length));");\r
+        p.println("            } catch(ClassCastException e) {");\r
+        p.println("                throw new CalledWithTooManyParameters();");\r
+        p.println("            }");\r
+        p.println("        }");\r
+        p.println("    }");\r
+        p.println("}");\r
+    }\r
+    \r
+    public static void generateUnsaturatedFunctionN(PrintStream p, int n) {\r
+        p.println(HEADER);\r
+        p.println("package " + PACKAGE + ";");\r
+        p.println();\r
+        p.println("@SuppressWarnings(\"all\")");\r
+        p.println("public class UnsaturatedFunction" + n + " implements Function {");\r
+        p.println("    private final Function f;");\r
+        for(int i=0;i<n;++i)\r
+            p.println("    private final Object p" + i + ";");\r
+        p.println();\r
+        p.print("    public UnsaturatedFunction" + n + "(Function f");\r
+        for(int i=0;i<n;++i)\r
+            p.print(", Object p" + i);\r
+        p.println(") {");\r
+        p.println("        this.f = f;");\r
+        for(int i=0;i<n;++i)\r
+            p.println("        this.p" + i + " = p" + i + ";");\r
+        p.println("    }");\r
+        p.println();\r
+        for(int k=1;k<=MAX_ARITY;++k) {\r
+            p.println("    @Override");\r
+            p.print("    public Object apply(");\r
+            for(int i=0;i<k;++i) {\r
+                if(i>0)\r
+                    p.print(", ");\r
+                p.print("Object p" + (i + n));\r
+            }\r
+            p.println(") {");\r
+            if(n + k <= MAX_ARITY)\r
+                p.print("        return f.apply(");\r
+            else\r
+                p.print("        return f.applyArray(");\r
+            for(int i=0;i<k+n;++i) {\r
+                if(i>0)\r
+                    p.print(", ");\r
+                p.print("p" + i);\r
+            }\r
+            p.println(");");\r
+            p.println("    }");\r
+            p.println();\r
+        }\r
+        {\r
+            p.println("    @Override");\r
+            p.println("    public Object applyArray(Object ... ps) {");         \r
+            p.println("        Object[] nps = new Object[ps.length + " + n + "];");\r
+            for(int i=0;i<n;++i)\r
+                p.println("        nps[" + i + "] = p" + i + ";");\r
+            p.println("        for(int i=0;i<ps.length;++i)");\r
+            p.println("            nps[i + " + n + "] = ps[i];");\r
+            p.println("        return f.applyArray(nps);");\r
+            p.println("    }");\r
+        }\r
+        {\r
+            p.println("    @Override");\r
+            p.println("    public String toString() {");\r
+            p.println("        StringBuilder sb = new StringBuilder();");\r
+            p.println("        sb.append(\"(\").append(f);");\r
+            for(int i=0;i<n;++i)\r
+                p.println("        sb.append(\" \").append(p"+i+");");\r
+            p.println("        sb.append(\")\");");\r
+            p.println("        return sb.toString();");\r
+            p.println("    }");\r
+        }\r
+        p.println("}");\r
+    }\r
+    \r
+    public static void generateUnsaturatedFunctionN(PrintStream p) {\r
+        p.println(HEADER);\r
+        p.println("package " + PACKAGE + ";");\r
+        p.println();\r
+        p.println("@SuppressWarnings(\"all\")");\r
+        p.println("public class UnsaturatedFunctionN implements Function {");\r
+        p.println("    private final Function f;");\r
+        p.println("    private final Object[] ps;");\r
+        p.println();\r
+        p.println("    public UnsaturatedFunctionN(Function f, Object ... ps) {");\r
+        p.println("        this.f = f;");\r
+        p.println("        this.ps = ps;");\r
+        p.println("    }");\r
+        p.println();\r
+        for(int k=1;k<=MAX_ARITY;++k) {\r
+            p.println("    @Override");\r
+            p.print("    public Object apply(");\r
+            for(int i=1;i<=k;++i) {\r
+                if(i>1)\r
+                    p.print(", ");\r
+                p.print("Object p" + i);\r
+            }\r
+            p.println(") {");\r
+            p.println("        Object[] nps = new Object[ps.length + " + k + "];");\r
+            p.println("        System.arraycopy(ps, 0, nps, 0, ps.length);");\r
+            for(int i=1;i<=k;++i)\r
+                p.println("        nps[ps.length+" + (i-1) + "] = p" + i+ ";");\r
+            p.println("        return f.applyArray(nps);");\r
+            p.println("    }");\r
+            p.println();\r
+        }\r
+        {\r
+            p.println("    @Override");\r
+            p.println("    public Object applyArray(Object ... ops) {");\r
+            p.println("        Object[] nps = new Object[ps.length + ops.length];");\r
+            p.println("        System.arraycopy(ps, 0, nps, 0, ps.length);");\r
+            p.println("        System.arraycopy(ops, 0, nps, ps.length, ops.length);");\r
+            p.println("        return f.applyArray(nps);");\r
+            p.println("    }");\r
+        }\r
+        {\r
+            p.println("    @Override");\r
+            p.println("    public String toString() {");\r
+            p.println("        StringBuilder sb = new StringBuilder();");\r
+            p.println("        sb.append(\"(\").append(f);");\r
+            p.println("        for (Object p : ps)");\r
+            p.println("            sb.append(\" \").append(p);");\r
+            p.println("        sb.append(\")\");");\r
+            p.println("        return sb.toString();");\r
+            p.println("    }");\r
+        }\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=1;n<=MAX_ARITY;++n) {\r
+            PrintStream ps = \r
+                new PrintStream(new FileOutputStream(new File(dir, "Function"+n+".java")));\r
+            generateFunctionN(ps, n);\r
+        }\r
+        {\r
+            PrintStream ps = \r
+                new PrintStream(new FileOutputStream(new File(dir, "FunctionN.java")));\r
+            generateFunctionN(ps);\r
+        }\r
+        {\r
+            PrintStream ps = \r
+                new PrintStream(new FileOutputStream(new File(dir, "Function.java")));\r
+            generateFunction(ps);\r
+        }\r
+        \r
+        for(int n=1;n<=MAX_ARITY;++n) {\r
+            PrintStream ps = \r
+                new PrintStream(new FileOutputStream(new File(dir, "FunctionImpl"+n+".java")));\r
+            generateFunctionImplN(ps, n);\r
+        }\r
+        {\r
+            PrintStream ps = \r
+                new PrintStream(new FileOutputStream(new File(dir, "FunctionImplN.java")));\r
+            generateFunctionImplN(ps);\r
+        }\r
+        for(int n=1;n<=MAX_ARITY;++n) {\r
+            PrintStream ps = \r
+                new PrintStream(new FileOutputStream(new File(dir, "UnsaturatedFunction"+n+".java")));\r
+            generateUnsaturatedFunctionN(ps, n);\r
+        }\r
+        {\r
+            PrintStream ps = \r
+                new PrintStream(new FileOutputStream(new File(dir, "UnsaturatedFunctionN.java")));\r
+            generateUnsaturatedFunctionN(ps);\r
+        }\r
+    }    \r
+}\r