1 package org.simantics.scl.runtime.generation;
\r
4 import java.io.FileOutputStream;
\r
5 import java.io.PrintStream;
\r
8 public class GenerateFunctions {
\r
10 public static final String PACKAGE = "org.simantics.scl.runtime.function";
\r
11 public static final int MAX_ARITY = 8;
\r
13 public static final String HEADER =
\r
15 + " * This code is generated in " + GenerateFunctions.class.getName() + ".\n"
\r
16 + " * Do not edit manually!\n"
\r
20 public static void generateFunctionN(PrintStream p, int n) {
\r
22 p.println("package " + PACKAGE + ";");
\r
24 p.print("public interface Function"+n+"<");
\r
25 for(int i=0;i<n;++i)
\r
26 p.print("P" + i + ",");
\r
28 p.print(" R apply(");
\r
29 for(int i=0;i<n;++i) {
\r
32 p.print("P"+i+" p" + i);
\r
38 public static void generateFunctionN(PrintStream p) {
\r
40 p.println("package " + PACKAGE + ";");
\r
42 p.println("public interface FunctionN {");
\r
43 p.println(" Object applyArray(Object ... ps);");
\r
47 public static void generateFunction(PrintStream p) {
\r
49 p.println("package " + PACKAGE + ";");
\r
51 //p.println("@SuppressWarnings(\"all\")");
\r
52 p.print("public interface Function<");
\r
53 for(int k=0;k<MAX_ARITY;++k) {
\r
56 for(int k=1;k<=MAX_ARITY;++k) {
\r
61 p.println("> extends");
\r
62 for(int k=1;k<=MAX_ARITY;++k) {
\r
63 p.print(" Function" + k + "<");
\r
64 for(int i=0;i<k;++i) {
\r
67 p.println("R"+k+">,");
\r
69 p.println(" FunctionN {");
\r
73 public static void generateFunctionImplN(PrintStream p, int n) {
\r
75 p.println("package " + PACKAGE + ";");
\r
77 p.println("import java.util.Arrays;");
\r
79 p.println("@SuppressWarnings(\"all\")");
\r
80 p.print("public abstract class FunctionImpl" + n + "<");
\r
81 for(int i=0;i<n;++i)
\r
82 p.print("P" + i + ",");
\r
83 p.print("R> implements Function<");
\r
84 for(int i=0;i<n;++i)
\r
85 p.print("P" + i + ",");
\r
86 for(int i=n;i<MAX_ARITY;++i)
\r
88 for(int i=1;i<=MAX_ARITY;++i) {
\r
97 for(int k=1;k<Math.min(n, MAX_ARITY+1);++k) {
\r
98 p.println(" @Override");
\r
99 p.print(" public Object apply(");
\r
100 for(int i=0;i<k;++i) {
\r
103 p.print("Object p" + i);
\r
106 p.print(" return new UnsaturatedFunction" + k + "(this");
\r
107 for(int i=0;i<k;++i)
\r
108 p.print(", p" + i);
\r
115 p.println(" @Override");
\r
116 p.print(" public abstract R apply(");
\r
117 for(int i=0;i<n;++i) {
\r
120 p.print("P"+i+" p" + i);
\r
125 for(int k=n+1;k<=MAX_ARITY;++k) {
\r
126 p.println(" @Override");
\r
127 p.print(" public Object apply(");
\r
128 for(int i=0;i<k;++i) {
\r
131 p.print("Object p" + i);
\r
134 p.println(" try {");
\r
135 p.print(" return ((Function)apply(");
\r
136 for(int i=0;i<n;++i) {
\r
139 p.print("(P"+i+")p" + i);
\r
141 p.print(")).apply(");
\r
142 for(int i=n;i<k;++i) {
\r
148 p.println(" } catch(ClassCastException e) {");
\r
149 p.println(" throw new CalledWithTooManyParameters();");
\r
154 p.println(" @Override");
\r
155 p.println(" public Object applyArray(Object ... ps) {");
\r
156 p.println(" switch(ps.length) {");
\r
157 for(int k=0;k<=MAX_ARITY+n;++k) {
\r
158 p.println(" case " + k + ":");
\r
160 p.println(" return this;");
\r
162 p.print(" return new UnsaturatedFunction" + k + "(this");
\r
163 for(int i=0;i<k;++i)
\r
164 p.print(", ps[" + i + "]");
\r
168 p.print(" return apply(");
\r
169 for(int i=0;i<k;++i) {
\r
172 p.print("(P"+i+")ps[" + i + "]");
\r
176 else if(k <= n + MAX_ARITY) {
\r
177 p.println(" try {");
\r
178 p.print(" return ((Function)apply(");
\r
179 for(int i=0;i<n;++i) {
\r
182 p.print("(P"+i+")ps[" + i + "]");
\r
184 p.print(")).apply(");
\r
185 for(int i=n;i<k;++i) {
\r
188 p.print("ps[" + i + "]");
\r
191 p.println(" } catch(ClassCastException e) {");
\r
192 p.println(" throw new CalledWithTooManyParameters();");
\r
197 p.println(" default:");
\r
198 p.println(" try {");
\r
199 p.print(" return ((Function)apply(");
\r
200 for(int i=0;i<n;++i) {
\r
203 p.print("(P"+i+")ps[" + i + "]");
\r
205 p.println(")).apply(Arrays.copyOfRange(ps, "+n+", ps.length));");
\r
206 p.println(" } catch(ClassCastException e) {");
\r
207 p.println(" throw new CalledWithTooManyParameters();");
\r
215 public static void generateFunctionImplN(PrintStream p) {
\r
217 p.println("package " + PACKAGE + ";");
\r
219 p.println("import java.util.Arrays;");
\r
221 p.println("@SuppressWarnings(\"all\")");
\r
222 p.println("public abstract class FunctionImplN implements Function {");
\r
223 p.println(" int arity;");
\r
225 p.println(" public FunctionImplN(int arity) {");
\r
226 p.println(" if(arity < 1)");
\r
227 p.println(" throw new IllegalArgumentException();");
\r
228 p.println(" this.arity = arity;");
\r
231 for(int k=1;k<=MAX_ARITY;++k) {
\r
232 p.println(" @Override");
\r
233 p.print(" public Object apply(");
\r
234 for(int i=0;i<k;++i) {
\r
237 p.print("Object p" + i);
\r
240 p.println(" try {");
\r
241 p.println(" switch(arity) {");
\r
242 for(int i=1;i<k;++i) {
\r
243 p.print(" case " + i + ": return ((Function)doApply(");
\r
244 for(int j=0;j<i;++j) {
\r
249 p.print(")).apply(");
\r
250 for(int j=i;j<k;++j) {
\r
257 p.print(" case " + k + ": return doApply(");
\r
258 for(int i=0;i<k;++i) {
\r
264 p.print(" default: return new UnsaturatedFunction" + k + "(this");
\r
265 for(int i=0;i<k;++i)
\r
266 p.print(", p" + i);
\r
269 p.println(" } catch(ClassCastException e) {");
\r
270 p.println(" throw new CalledWithTooManyParameters();");
\r
275 p.println(" public abstract Object doApply(Object ... ps);");
\r
277 p.println(" @Override");
\r
278 p.println(" public Object applyArray(Object ... ps) {");
\r
279 p.println(" if(ps.length == arity)");
\r
280 p.println(" return doApply(ps);");
\r
281 p.println(" else if(ps.length < arity)");
\r
282 p.println(" return new UnsaturatedFunctionN(this, ps);");
\r
283 p.println(" else /* ps.length > arity */ {");
\r
284 p.println(" try {");
\r
285 p.println(" return ((Function)doApply(Arrays.copyOf(ps, arity))).applyArray(Arrays.copyOfRange(ps, arity, ps.length));");
\r
286 p.println(" } catch(ClassCastException e) {");
\r
287 p.println(" throw new CalledWithTooManyParameters();");
\r
294 public static void generateUnsaturatedFunctionN(PrintStream p, int n) {
\r
296 p.println("package " + PACKAGE + ";");
\r
298 p.println("@SuppressWarnings(\"all\")");
\r
299 p.println("public class UnsaturatedFunction" + n + " implements Function {");
\r
300 p.println(" private final Function f;");
\r
301 for(int i=0;i<n;++i)
\r
302 p.println(" private final Object p" + i + ";");
\r
304 p.print(" public UnsaturatedFunction" + n + "(Function f");
\r
305 for(int i=0;i<n;++i)
\r
306 p.print(", Object p" + i);
\r
308 p.println(" this.f = f;");
\r
309 for(int i=0;i<n;++i)
\r
310 p.println(" this.p" + i + " = p" + i + ";");
\r
313 for(int k=1;k<=MAX_ARITY;++k) {
\r
314 p.println(" @Override");
\r
315 p.print(" public Object apply(");
\r
316 for(int i=0;i<k;++i) {
\r
319 p.print("Object p" + (i + n));
\r
322 if(n + k <= MAX_ARITY)
\r
323 p.print(" return f.apply(");
\r
325 p.print(" return f.applyArray(");
\r
326 for(int i=0;i<k+n;++i) {
\r
336 p.println(" @Override");
\r
337 p.println(" public Object applyArray(Object ... ps) {");
\r
338 p.println(" Object[] nps = new Object[ps.length + " + n + "];");
\r
339 for(int i=0;i<n;++i)
\r
340 p.println(" nps[" + i + "] = p" + i + ";");
\r
341 p.println(" for(int i=0;i<ps.length;++i)");
\r
342 p.println(" nps[i + " + n + "] = ps[i];");
\r
343 p.println(" return f.applyArray(nps);");
\r
347 p.println(" @Override");
\r
348 p.println(" public String toString() {");
\r
349 p.println(" StringBuilder sb = new StringBuilder();");
\r
350 p.println(" sb.append(\"(\").append(f);");
\r
351 for(int i=0;i<n;++i)
\r
352 p.println(" sb.append(\" \").append(p"+i+");");
\r
353 p.println(" sb.append(\")\");");
\r
354 p.println(" return sb.toString();");
\r
360 public static void generateUnsaturatedFunctionN(PrintStream p) {
\r
362 p.println("package " + PACKAGE + ";");
\r
364 p.println("@SuppressWarnings(\"all\")");
\r
365 p.println("public class UnsaturatedFunctionN implements Function {");
\r
366 p.println(" private final Function f;");
\r
367 p.println(" private final Object[] ps;");
\r
369 p.println(" public UnsaturatedFunctionN(Function f, Object ... ps) {");
\r
370 p.println(" this.f = f;");
\r
371 p.println(" this.ps = ps;");
\r
374 for(int k=1;k<=MAX_ARITY;++k) {
\r
375 p.println(" @Override");
\r
376 p.print(" public Object apply(");
\r
377 for(int i=1;i<=k;++i) {
\r
380 p.print("Object p" + i);
\r
383 p.println(" Object[] nps = new Object[ps.length + " + k + "];");
\r
384 p.println(" System.arraycopy(ps, 0, nps, 0, ps.length);");
\r
385 for(int i=1;i<=k;++i)
\r
386 p.println(" nps[ps.length+" + (i-1) + "] = p" + i+ ";");
\r
387 p.println(" return f.applyArray(nps);");
\r
392 p.println(" @Override");
\r
393 p.println(" public Object applyArray(Object ... ops) {");
\r
394 p.println(" Object[] nps = new Object[ps.length + ops.length];");
\r
395 p.println(" System.arraycopy(ps, 0, nps, 0, ps.length);");
\r
396 p.println(" System.arraycopy(ops, 0, nps, ps.length, ops.length);");
\r
397 p.println(" return f.applyArray(nps);");
\r
401 p.println(" @Override");
\r
402 p.println(" public String toString() {");
\r
403 p.println(" StringBuilder sb = new StringBuilder();");
\r
404 p.println(" sb.append(\"(\").append(f);");
\r
405 p.println(" for (Object p : ps)");
\r
406 p.println(" sb.append(\" \").append(p);");
\r
407 p.println(" sb.append(\")\");");
\r
408 p.println(" return sb.toString();");
\r
414 public static void main(String[] args) throws Exception {
\r
415 URL url = GenerateFunctions.class.getResource(".");
\r
416 File dir = new File(url.getPath());
\r
417 while(!new File(dir, "src").exists())
\r
418 dir = dir.getParentFile();
\r
419 dir = new File(dir, "src");
\r
420 dir = new File(dir, PACKAGE.replace('.', '/'));
\r
423 for(int n=1;n<=MAX_ARITY;++n) {
\r
425 new PrintStream(new FileOutputStream(new File(dir, "Function"+n+".java")));
\r
426 generateFunctionN(ps, n);
\r
430 new PrintStream(new FileOutputStream(new File(dir, "FunctionN.java")));
\r
431 generateFunctionN(ps);
\r
435 new PrintStream(new FileOutputStream(new File(dir, "Function.java")));
\r
436 generateFunction(ps);
\r
439 for(int n=1;n<=MAX_ARITY;++n) {
\r
441 new PrintStream(new FileOutputStream(new File(dir, "FunctionImpl"+n+".java")));
\r
442 generateFunctionImplN(ps, n);
\r
446 new PrintStream(new FileOutputStream(new File(dir, "FunctionImplN.java")));
\r
447 generateFunctionImplN(ps);
\r
449 for(int n=1;n<=MAX_ARITY;++n) {
\r
451 new PrintStream(new FileOutputStream(new File(dir, "UnsaturatedFunction"+n+".java")));
\r
452 generateUnsaturatedFunctionN(ps, n);
\r
456 new PrintStream(new FileOutputStream(new File(dir, "UnsaturatedFunctionN.java")));
\r
457 generateUnsaturatedFunctionN(ps);
\r