1 package edu.berkeley.sbp.util;
2 import edu.berkeley.sbp.*;
3 import edu.berkeley.sbp.util.*;
6 import java.lang.reflect.*;
8 public abstract class PrintableTree<T extends PrintableTree> implements Iterable<T>, ToJava {
10 protected abstract String headToString();
11 protected abstract String headToJava();
13 private boolean empty() {
14 for(T t : this) return false;
18 private static final int MAXDEPTH=3;
20 int depth = headToString()==null ? 0 : 1;
22 for(T t : this) ret = Math.max(ret, depth+t.depth());
25 public String toString(int indent0, int cur, int limit) {
27 String s = toString();
28 if (depth()<MAXDEPTH && s.length() < limit-cur) return s;
29 StringBuffer ret = new StringBuffer();
32 ret.append('\n'); for(int i=0; i<indent; i++) ret.append(' ');
36 String head = headToString();
41 if (empty()) return ret.toString();
44 ret.append('\n'); for(int i=0; i<indent; i++) ret.append(' ');
49 s = t.toString(indent+2, cur, limit);
50 while(s.indexOf('\n') != -1) {
51 ret.append(s.substring(0, s.indexOf('\n')));
52 s = s.substring(s.indexOf('\n')+1);
53 if (s.length() > 0) ret.append("\n ");
56 if (s.indexOf('\n')!=-1)
57 cur = s.length()-s.lastIndexOf('\n');
67 } else if (cur>indent) {
70 ret.append('\n'); for(int i=0; i<indent; i++) ret.append(' ');
74 return ret.toString();
77 public String toString() {
78 StringBuffer ret = new StringBuffer();
80 String q = t==null ? "null" : t.toString();
81 if (q.length() > 0) { ret.append(q); ret.append(" "); }
83 String tail = ret.toString().trim();
84 String head = headToString();
85 String h = (head!=null && !head.toString().equals("")) ? (tail.length() > 0 ? head+":" : head+"") : "";
86 if (tail.length() > 0) tail = "{" + tail + "}";
90 /** append Java code to <tt>sb</tt> which evaluates to this instance */
91 public void toJava(StringBuffer sb) {
92 sb.append("new "+this.getClass().getName()+"(null, ");
93 String head = headToJava();
94 sb.append(head==null ? "null" : "\"" + head + "\"");
95 sb.append(", new "+this.getClass().getName()+"[] { ");
98 if (!first) sb.append(",\n ");
99 if (t==null) sb.append("null");