checkpoint
[sbp.git] / src / edu / berkeley / sbp / bind / Bindable.java
index 0e2da13..ddd6242 100644 (file)
@@ -20,6 +20,7 @@ public abstract class Bindable implements ToJava {
 
     public abstract Annotation[][] getArgAnnotations();
     public abstract String[]       getArgNames();
+    public abstract Class[]        getArgTypes();
 
     public static Bindable create(Object o) {
         if (o instanceof Class) return new BindableClass((Class)o);
@@ -28,6 +29,18 @@ public abstract class Bindable implements ToJava {
         return null;
     }
 
+    public Binding createBinding(final int[] map) {
+        return new Binding() {
+                public Object invoke(Object[] o) {
+                    int max = 0;
+                    for(int i=0; i<map.length; i++) max = Math.max(map[i], max);
+                    Object[] o2 = new Object[max+1];
+                    for(int i=0; i<o.length; i++) o2[map[i]] = o[i];
+                    return impose(o2);
+                }
+            };
+    }
+
     private static class BindableMethod extends Bindable {
         private final Method _method;
         public String toString() { return "BindableMethod["+_method+"]"; }
@@ -37,6 +50,7 @@ public abstract class Bindable implements ToJava {
         public Object impose(Object[] fields) { return Reflection.impose(_method, fields); }
         public Annotation[][] getArgAnnotations() { return _method.getParameterAnnotations(); }
         public String[]       getArgNames() { return new String[_method.getParameterTypes().length]; }
+        public Class[]        getArgTypes() { return _method.getParameterTypes(); }
         public void toJava(StringBuffer sb) {
             sb.append("Bindable.create(");
             sb.append(_method.getDeclaringClass().getName().replace('$','.'));
@@ -57,6 +71,7 @@ public abstract class Bindable implements ToJava {
         public Object impose(Object[] fields) { return Reflection.impose(_constructor, fields); }
         public Annotation[][] getArgAnnotations() { return _constructor.getParameterAnnotations(); }
         public String[]       getArgNames() { return new String[_constructor.getParameterTypes().length]; }
+        public Class[]        getArgTypes() { return _constructor.getParameterTypes(); }
         public void toJava(StringBuffer sb) {
             sb.append("Bindable.create(");
             sb.append(_constructor.getDeclaringClass().getName().replace('$','.'));
@@ -87,6 +102,13 @@ public abstract class Bindable implements ToJava {
                 ret[i] = fields[i].getName();
             return ret;
         }
+        public Class[]       getArgTypes() {
+            Field[] fields = _class.getFields();
+            Class[] ret = new Class[fields.length];
+            for(int i=0; i<fields.length; i++)
+                ret[i] = fields[i].getType();
+            return ret;
+        }
         public void toJava(StringBuffer sb) {
             sb.append("Bindable.create(");
             sb.append(_class.getName().replace('$','.'));