added PrintableTree
[sbp.git] / src / edu / berkeley / sbp / util / PrintableTree.java
diff --git a/src/edu/berkeley/sbp/util/PrintableTree.java b/src/edu/berkeley/sbp/util/PrintableTree.java
new file mode 100644 (file)
index 0000000..a50aff9
--- /dev/null
@@ -0,0 +1,43 @@
+package edu.berkeley.sbp;
+import edu.berkeley.sbp.*;
+import edu.berkeley.sbp.*;
+import edu.berkeley.sbp.util.*;
+import java.io.*;
+import java.util.*;
+import java.lang.reflect.*;
+
+public abstract class PrintableTree<T extends PrintableTree> implements Iterable<T> {
+
+    protected abstract String headToString();
+    protected abstract String headToJava();    
+
+    public String toString() {
+        StringBuffer ret = new StringBuffer();
+        for(T t : this) {
+            String q = t==null ? "null" : t.toString();
+            if (q.length() > 0) { ret.append(q); ret.append(" "); }
+        }
+        String tail = ret.toString().trim();
+        String head = headToString();
+        String h = (head!=null && !head.toString().equals("")) ? (tail.length() > 0 ? head+":" : head+"") : "";
+        if (tail.length() > 0) tail = "{" + tail + "}";
+        return h + tail;
+    }
+
+    /** append Java code to <tt>sb</tt> which evaluates to this instance */
+    public void toJava(StringBuffer sb) {
+        sb.append("new "+this.getClass().getName()+"(null, ");
+        String head = headToJava();
+        sb.append(head==null ? "null" : "\"" + head + "\"");
+        sb.append(", new "+this.getClass().getName()+"[] { ");
+        boolean first = true;
+        for(T t : this) {
+            if (!first) sb.append(",\n        ");
+            if (t==null)   sb.append("null");
+            else           t.toJava(sb);
+            first = false;
+        }
+        sb.append("})");
+    }
+
+}