X-Git-Url: http://git.megacz.com/?p=sbp.git;a=blobdiff_plain;f=src%2Fedu%2Fberkeley%2Fsbp%2Futil%2FPrintableTree.java;h=802296d05b1fea0967d19b01dbce741fab93c6d6;hp=c805caba69136d0140d4521b284688686d0c67c9;hb=f069d11a0bc59d63b078df8a4aa488498c4e9cc2;hpb=7fbee73b4dd985cb5b217ed297710c00fd9d7004 diff --git a/src/edu/berkeley/sbp/util/PrintableTree.java b/src/edu/berkeley/sbp/util/PrintableTree.java index c805cab..802296d 100644 --- a/src/edu/berkeley/sbp/util/PrintableTree.java +++ b/src/edu/berkeley/sbp/util/PrintableTree.java @@ -1,3 +1,5 @@ +// 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.*; @@ -5,93 +7,73 @@ import java.io.*; import java.util.*; import java.lang.reflect.*; -public abstract class PrintableTree implements Iterable, ToJava { +public abstract class PrintableTree implements Iterable, ToJava /*, ToHTML*/, GraphViz.ToGraphViz { + protected abstract Object head(); protected abstract String headToString(); protected abstract String headToJava(); + protected abstract String left(); + protected abstract String right(); + protected abstract boolean ignoreSingleton(); - private boolean empty() { - for(T t : this) return false; - return true; - } + private static final int MAXCHARS=40; - private static final int MAXDEPTH=3; - public int depth() { - int depth = headToString()==null ? 0 : 1; - int ret = depth; - for(T t : this) ret = Math.max(ret, depth+t.depth()); - return ret; - } - public String toString(int indent0, int cur, int limit) { - int indent = indent0; - String s = toString(); - if (depth()indent) { - ret.append('\n'); for(int i=0; i iterator = iterator(); + if (!iterator.hasNext()) return head==null ? (left()+right()) : head; + PrintableTree t0 = iterator.next(); + if (!iterator.hasNext() && ignoreSingleton()) + return t0.toPrettyString(nl); + ret.append(head==null?(left()+" "):(head+":"+nl)); + boolean first = true; + int len = 0; for(T t : this) { - s = t.toString(indent+2, cur, limit); - while(s.indexOf('\n') != -1) { - ret.append(s.substring(0, s.indexOf('\n'))); - s = s.substring(s.indexOf('\n')+1); - if (s.length() > 0) ret.append("\n "); + String s = t.basic() ? t.toString() : t.toPrettyString(nl+" "); + if (!first) { + if (!t.basic()) ret.append(nl); + if (s.length()+len>MAXCHARS) { ret.append(nl); len = 0; } + else { ret.append(" "); len++; } } + first = false; ret.append(s); - if (s.indexOf('\n')!=-1) - cur = s.length()-s.lastIndexOf('\n'); - else - cur += s.length(); - if (cur>indent) { - ret.append(' '); - cur += s.length()+1; - } - } - if (head==null) { - ret.append("}"); - } else if (cur>indent) { - /* - indent = indent0; - ret.append('\n'); for(int i=0; i 0) { ret.append(q); ret.append(" "); } } + 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 = "{" + tail + "}"; - return h + tail; + if (tail.length() > 0) tail = left() + tail + right(); + return cached = h + tail; } /** append Java code to sb 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) { @@ -103,4 +85,15 @@ public abstract class PrintableTree implements Iterable sb.append("})"); } + // this is here to keep it out of the javadoc for Tree + + 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; } }