checkpoint
[sbp.git] / src / edu / berkeley / sbp / util / PrintableTree.java
1 package edu.berkeley.sbp.util;
2 import edu.berkeley.sbp.*;
3 import edu.berkeley.sbp.util.*;
4 import java.io.*;
5 import java.util.*;
6 import java.lang.reflect.*;
7
8 public abstract class PrintableTree<T extends PrintableTree> implements Iterable<T>, ToJava {
9
10     protected abstract String headToString();
11     protected abstract String headToJava();    
12
13     private boolean empty() {
14         for(T t : this) return false;
15         return true;
16     }
17
18     private static final int MAXDEPTH=3;
19     public int depth() {
20         int depth = headToString()==null ? 0 : 1;
21         int ret = depth;
22         for(T t : this) ret = Math.max(ret, depth+t.depth());
23         return ret;
24     }
25     public String toString(int indent0, int cur, int limit) {
26         int indent = indent0;
27         String s = toString();
28         if (depth()<MAXDEPTH && s.length() < limit-cur) return s;
29         StringBuffer ret = new StringBuffer();
30
31         if (cur>indent) {
32             ret.append('\n'); for(int i=0; i<indent; i++) ret.append(' ');
33             cur = indent;
34         }
35         
36         String head = headToString();
37         if (head==null) {
38             ret.append("{");
39         } else {
40             ret.append(head);
41             if (empty()) return ret.toString();
42             ret.append(":");
43             indent += 2;
44             ret.append('\n'); for(int i=0; i<indent; i++) ret.append(' ');
45             cur = indent;
46         }
47
48         for(T t : this) {
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  ");
54             }
55             ret.append(s);
56             if (s.indexOf('\n')!=-1)
57                 cur = s.length()-s.lastIndexOf('\n');
58             else
59                 cur += s.length();
60             if (cur>indent) {
61                 ret.append(' ');
62                 cur += s.length()+1;
63             }
64         }
65         if (head==null) {
66             ret.append("}");
67         } else if (cur>indent) {
68             /*
69             indent = indent0;
70             ret.append('\n'); for(int i=0; i<indent; i++) ret.append(' ');
71             cur = indent;
72             */
73         }
74         return ret.toString();
75     }
76
77     public String toString() {
78         StringBuffer ret = new StringBuffer();
79         for(T t : this) {
80             String q = t==null ? "null" : t.toString();
81             if (q.length() > 0) { ret.append(q); ret.append(" "); }
82         }
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 + "}";
87         return h + tail;
88     }
89
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()+"[] { ");
96         boolean first = true;
97         for(T t : this) {
98             if (!first) sb.append(",\n        ");
99             if (t==null)   sb.append("null");
100             else           t.toJava(sb);
101             first = false;
102         }
103         sb.append("})");
104     }
105
106 }