package org.httpkit;
import java.nio.charset.Charset;
import java.util.Arrays;
public class DynamicBytes {
private byte[] data;
private int idx = 0;
public DynamicBytes(int size) {
data = new byte[size];
}
private void expandIfNeeded(int more) {
if (idx + more > data.length) {
int after = (int) ((idx + more) * 1.33);
// String msg = "expand memory, from " + data.length + " to " +
// after + "; need " + more;
// System.out.println(msg);
data = Arrays.copyOf(data, after);
}
}
public byte[] get() {
return data;
}
public int length() {
return idx;
}
public DynamicBytes append(byte b) {
expandIfNeeded(1);
data[idx++] = b;
return this;
}
public void append(byte b1, byte b2) {
expandIfNeeded(2);
data[idx++] = b1;
data[idx++] = b2;
}
@Override
public String toString() {
return "DynamicBytes[len=" + idx + ", cap=" + data.length + ']';
}
public DynamicBytes append(byte[] d, int length) {
expandIfNeeded(length);
System.arraycopy(d, 0, data, idx, length);
idx += length;
return this;
}
public DynamicBytes append(String str) {
// ISO-8859-1. much faster than String.getBytes("ISO-8859-1")
// less copy. 620ms vs 190ms
int length = str.length();
expandIfNeeded(length);
for (int i = 0; i < length; i++) {
char c = str.charAt(i);
if (c < 128) {
data[idx++] = (byte) c;
} else {
data[idx++] = (byte) '?'; // JDK uses ? to represent non ASCII
}
}
return this;
}
public DynamicBytes append(String str, Charset c) {
byte[] bs = str.getBytes(c);
return append(bs, bs.length);
}
}