4 import javajs.J2SIgnoreImport;
\r
7 * Interesting thing here is that JavaScript is 3x faster than Java in handling strings.
\r
9 * Java StringBuilder is final, unfortunately. I guess they weren't thinking about Java2Script!
\r
11 * The reason we have to do this that several overloaded append methods is WAY too expensive
\r
15 @J2SIgnoreImport({java.lang.StringBuilder.class})
\r
18 private java.lang.StringBuilder sb;
\r
19 String s; // used by JavaScript only; no Java references
\r
21 //TODO: JS experiment with using array and .push() here
\r
31 sb = new java.lang.StringBuilder();
\r
35 public static SB newN(int n) {
\r
38 * return new javajs.util.SB();
\r
41 // not perfect, because it requires defining sb twice.
\r
42 // We can do better...
\r
44 sb.sb = new java.lang.StringBuilder(n);
\r
49 public static SB newS(String s) {
\r
53 * var sb = new javajs.util.SB();
\r
60 sb.sb = new java.lang.StringBuilder(s);
\r
65 public SB append(String s) {
\r
78 public SB appendC(char c) {
\r
91 public SB appendI(int i) {
\r
104 public SB appendB(boolean b) {
\r
118 * note that JavaScript could drop off the ".0" in "1.0"
\r
122 public SB appendF(float f) {
\r
127 * if (sf.indexOf(".") < 0 && sf.indexOf("e") < 0)
\r
138 public SB appendD(double d) {
\r
143 * if (sf.indexOf(".") < 0 && sf.indexOf("e") < 0)
\r
154 public SB appendSB(SB buf) {
\r
167 public SB appendO(Object data) {
\r
168 if (data != null) {
\r
172 * this.s += data.toString();
\r
182 public void appendCB(char[] cb, int off, int len) {
\r
186 * for (var i = len,j=off; --i >= 0;)
\r
187 * this.s += cb[j++];
\r
191 sb.append(cb, off, len);
\r
196 public String toString() {
\r
204 return sb.toString();
\r
208 public int length() {
\r
212 * return this.s.length;
\r
216 return sb.length();
\r
220 public int indexOf(String s) {
\r
224 * return this.s.indexOf(s);
\r
228 return sb.indexOf(s);
\r
232 public char charAt(int i) {
\r
236 * return this.s.charAt(i);
\r
240 return sb.charAt(i);
\r
244 public int charCodeAt(int i) {
\r
248 * return this.s.charCodeAt(i);
\r
252 return sb.codePointAt(i);
\r
256 public void setLength(int n) {
\r
260 * this.s = this.s.substring(0, n);
\r
267 public int lastIndexOf(String s) {
\r
271 * return this.s.lastIndexOf(s);
\r
274 return sb.lastIndexOf(s);
\r
278 public int indexOf2(String s, int i) {
\r
282 * return this.s.indexOf(s, i);
\r
285 return sb.indexOf(s, i);
\r
289 public String substring(int i) {
\r
293 * return this.s.substring(i);
\r
296 return sb.substring(i);
\r
300 public String substring2(int i, int j) {
\r
304 * return this.s.substring(i, j);
\r
307 return sb.substring(i, j);
\r
312 * simple byte conversion not allowing for unicode.
\r
313 * Used for base64 conversion and allows for offset
\r
315 * @param len or -1 for full length (then off must = 0)
\r
318 public byte[] toBytes(int off, int len) {
\r
320 len = length() - off;
\r
321 byte[] b = new byte[len];
\r
322 for (int i = off + len, j = i - off; --i >= off;)
\r
323 b[--j] = (byte) charAt(i);
\r
327 public void replace(int start, int end, String str) {
\r
331 * this.s = this.s.substring(0, start) + str + this.s.substring(end);
\r
334 sb.replace(start, end, str);
\r
338 public void insert(int offset, String str) {
\r
339 replace(offset, offset, str);
\r