--- /dev/null
+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("})");
+ }
+
+}