+// Copyright 2006-2007 all rights reserved; see LICENSE file for BSD-style license
+
package edu.berkeley.sbp.util;
import edu.berkeley.sbp.*;
import edu.berkeley.sbp.util.*;
import java.util.*;
import java.lang.reflect.*;
-public abstract class PrintableTree<T extends PrintableTree> implements Iterable<T>, ToJava /*, ToHTML*/ {
+public abstract class PrintableTree<T extends PrintableTree> implements Iterable<T>, ToJava /*, ToHTML*/, GraphViz.ToGraphViz {
+ protected abstract Object head();
protected abstract String headToString();
protected abstract String headToJava();
protected abstract String left();
private boolean basic() { return toString().length() < MAXCHARS; }
public String toPrettyString() { return toPrettyString("\n"); }
- public StringBuffer toPrettyString(StringBuffer sb) { sb.append(this); return sb; }
+ public StringBuffer toPrettyString(StringBuffer sb) { sb.append(toPrettyString()); return sb; }
private String toPrettyString(String nl) {
String str = toString();
if (str.length() < MAXCHARS) return str;
return ret.toString();
}
+ private String cached = null;
public String toString() {
+ if (cached!=null) return cached;
StringBuffer ret = new StringBuffer();
int count=0;
for(T t : this) {
String q = t==null ? "null" : t.toString();
if (q.length() > 0) { ret.append(q); ret.append(" "); }
}
- if (count==1 && ignoreSingleton()) return ret.toString().trim();
+ if (count==1 && ignoreSingleton()) { return cached = ret.toString().trim(); }
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 = left() + tail + right();
- return h + tail;
+ return cached = 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(head);
sb.append(", new "+this.getClass().getName()+"[] { ");
boolean first = true;
for(T t : this) {
sb.append("})");
}
+ // this is here to keep it out of the javadoc for Tree<T>
+
+ public GraphViz.StateNode toGraphViz(GraphViz gv) {
+ if (gv.hasNode(this)) return gv.createNode(this);
+ GraphViz.StateNode n = gv.createNode(this);
+ n.label = head()==null ? "" : head().toString();
+ for(T t : this) n.edge(t, null);
+ return n;
+ }
+ public boolean isTransparent() { return false; }
+ public boolean isHidden() { return false; }
}