package water.util;
import java.io.OutputStream;
import java.io.PrintStream;
import java.io.UnsupportedEncodingException;
import water.exceptions.JCodeSB;
/**
* A simple stream mimicing API of {@link SB}.
*/
public class SBPrintStream extends PrintStream implements JCodeSB<SBPrintStream> {
private int _indent = 0;
public SBPrintStream(OutputStream out) {
super(out);
}
public SBPrintStream(OutputStream out, boolean autoFlush) {
super(out, autoFlush);
}
public SBPrintStream(OutputStream out, boolean autoFlush, String encoding)
throws UnsupportedEncodingException {
super(out, autoFlush, encoding);
}
public SBPrintStream ps(String s) {
append("\"");
pj(s);
append("\"");
return this;
}
@Override
public SBPrintStream p(JCodeSB s) {
return p(s.getContent());
}
public SBPrintStream p(String s) {
append(s);
return this;
}
public SBPrintStream p(float s) {
if (Float.isNaN(s)) {
append("Float.NaN");
} else if (Float.isInfinite(s)) {
append(s > 0 ? "Float.POSITIVE_INFINITY" : "Float.NEGATIVE_INFINITY");
} else {
append(s);
}
return this;
}
public SBPrintStream p(double s) {
if (Double.isNaN(s)) {
append("Double.NaN");
} else if (Double.isInfinite(s)) {
append(s > 0 ? "Double.POSITIVE_INFINITY" : "Double.NEGATIVE_INFINITY");
} else {
append(s);
}
return this;
}
public SBPrintStream p(char s) {
append(s);
return this;
}
public SBPrintStream p(int s) {
append(s);
return this;
}
public SBPrintStream p(long s) {
append(s);
return this;
}
public SBPrintStream p(boolean s) {
append(Boolean.toString(s));
return this;
}
// Not spelled "p" on purpose: too easy to accidentally say "p(1.0)" and
// suddenly call the the autoboxed version.
public SBPrintStream pobj(Object s) {
append(s.toString());
return this;
}
public SBPrintStream i(int d) {
for (int i = 0; i < d + _indent; i++) {
p(" ");
}
return this;
}
public SBPrintStream i() {
return i(0);
}
public SBPrintStream ip(String s) {
return i().p(s);
}
public SBPrintStream s() {
append(' ');
return this;
}
// Java specific append of double
public SBPrintStream pj(double s) {
if (Double.isInfinite(s)) {
append("Double.").append(s > 0 ? "POSITIVE_INFINITY" : "NEGATIVE_INFINITY");
} else if (Double.isNaN(s)) {
append("Double.NaN");
} else {
append(s);
}
return this;
}
// Java specific append of float
public SBPrintStream pj(float s) {
if (Float.isInfinite(s)) {
append("Float.").append(s > 0 ? "POSITIVE_INFINITY" : "NEGATIVE_INFINITY");
} else if (Float.isNaN(s)) {
append("Float.NaN");
} else {
append(s).append('f');
}
return this;
}
/* Append Java string - escape all " and \ */
public SBPrintStream pj(String s) {
append(SB.escapeJava(s));
return this;
}
@Override
public SBPrintStream pj(String objectName, String fieldName) {
append(objectName).append('.').append(fieldName);
return this;
}
public SBPrintStream p(IcedBitSet ibs) {
SB sb = new SB();
sb = ibs.toString(sb);
return append(sb);
}
public SBPrintStream p(SB sb) {
return append(sb);
}
// Increase indentation
public SBPrintStream ii(int i) {
_indent += i;
return this;
}
// Decrease indentation
public SBPrintStream di(int i) {
_indent -= i;
return this;
}
// Copy indent from given string buffer
public SBPrintStream ci(JCodeSB sb) {
_indent = sb.getIndent();
return this;
}
public SBPrintStream nl() {
return p('\n');
}
// Convert a String[] into a valid Java String initializer
public SBPrintStream toJavaStringInit(String[] ss) {
if (ss == null) {
return p("null");
}
p('{');
for (int i = 0; i < ss.length - 1; i++) {
p('"').pj(ss[i]).p("\",");
}
if (ss.length > 0) {
p('"').pj(ss[ss.length - 1]).p('"');
}
return p('}');
}
public SBPrintStream toJavaStringInit(float[] ss) {
if (ss == null) {
return p("null");
}
p('{');
for (int i = 0; i < ss.length - 1; i++) {
pj(ss[i]).p(',');
}
if (ss.length > 0) {
pj(ss[ss.length - 1]);
}
return p('}');
}
public SBPrintStream toJavaStringInit(double[] ss) {
if (ss == null) {
return p("null");
}
p('{');
for (int i = 0; i < ss.length - 1; i++) {
pj(ss[i]).p(',');
}
if (ss.length > 0) {
pj(ss[ss.length - 1]);
}
return p('}');
}
public SBPrintStream toJavaStringInit(double[][] ss) {
if (ss == null) {
return p("null");
}
p('{');
for (int i = 0; i < ss.length - 1; i++) {
toJavaStringInit(ss[i]).p(',');
}
if (ss.length > 0) {
toJavaStringInit(ss[ss.length - 1]);
}
return p('}');
}
public SBPrintStream toJavaStringInit(double[][][] ss) {
if (ss == null) {
return p("null");
}
p('{');
for (int i = 0; i < ss.length - 1; i++) {
toJavaStringInit(ss[i]).p(',');
}
if (ss.length > 0) {
toJavaStringInit(ss[ss.length - 1]);
}
return p('}');
}
public SBPrintStream toJSArray(float[] nums) {
p('[');
for (int i = 0; i < nums.length; i++) {
if (i > 0) {
p(',');
}
p(nums[i]);
}
return p(']');
}
public SBPrintStream toJSArray(String[] ss) {
p('[');
for (int i = 0; i < ss.length; i++) {
if (i > 0) {
p(',');
}
p('"').p(ss[i]).p('"');
}
return p(']');
}
@Override
public int getIndent() {
return _indent;
}
@Override
public String getContent() {
throw new UnsupportedOperationException("Cannot get content of stream!");
}
//
// Copied from AbstractStringBuilder
// FIXME: optimize that
//
public SBPrintStream append(float f) {
append(Float.toString(f));
return this;
}
public SBPrintStream append(double d) {
append(Double.toString(d));
return this;
}
public SBPrintStream append(int i) {
append(Integer.toString(i));
return this;
}
public SBPrintStream append(long l) {
append(Long.toString(l));
return this;
}
public SBPrintStream append(SB sb) {
append(sb.toString());
return this;
}
}