JAL-1807 Bob's JalviewJS prototype first commit
[jalviewjs.git] / src / javajs / util / SB.java
1 \r
2 package javajs.util;\r
3 \r
4 import javajs.J2SIgnoreImport;\r
5 \r
6 /**\r
7  * Interesting thing here is that JavaScript is 3x faster than Java in handling strings.\r
8  * \r
9  * Java StringBuilder is final, unfortunately. I guess they weren't thinking about Java2Script!\r
10  * \r
11  * The reason we have to do this that several overloaded append methods is WAY too expensive\r
12  * \r
13  */\r
14 \r
15 @J2SIgnoreImport({java.lang.StringBuilder.class})\r
16 public class SB {\r
17   \r
18   private java.lang.StringBuilder sb;\r
19   String s; // used by JavaScript only; no Java references\r
20   \r
21   //TODO: JS experiment with using array and .push() here\r
22 \r
23   public SB() {\r
24     /**\r
25      * @j2sNative\r
26      * \r
27      *            this.s = "";\r
28      * \r
29      */\r
30     {\r
31       sb = new java.lang.StringBuilder();\r
32     }\r
33   }\r
34 \r
35   public static SB newN(int n) {\r
36     /**\r
37      * @j2sNative\r
38      *            return new javajs.util.SB(); \r
39      */\r
40     {\r
41       // not perfect, because it requires defining sb twice. \r
42       // We can do better...\r
43       SB sb = new SB();\r
44       sb.sb = new java.lang.StringBuilder(n);\r
45       return sb;\r
46     }\r
47   }\r
48 \r
49   public static SB newS(String s) {\r
50     /**\r
51      * @j2sNative \r
52      * \r
53      * var sb = new javajs.util.SB();\r
54      * sb.s = s;\r
55      * return sb; \r
56      * \r
57      */\r
58     {\r
59     SB sb = new SB();\r
60     sb.sb = new java.lang.StringBuilder(s);\r
61     return sb;\r
62     }\r
63   }\r
64 \r
65   public SB append(String s) {\r
66     /**\r
67      * @j2sNative\r
68      * \r
69      *            this.s += s\r
70      * \r
71      */\r
72     {\r
73       sb.append(s);\r
74     }\r
75     return this;\r
76   }\r
77   \r
78   public SB appendC(char c) {\r
79     /**\r
80      * @j2sNative\r
81      * \r
82      *            this.s += c;\r
83      */\r
84     {\r
85       sb.append(c);\r
86     }\r
87     return this;\r
88     \r
89   }\r
90 \r
91   public SB appendI(int i) {\r
92     /**\r
93      * @j2sNative\r
94      * \r
95      *            this.s += i\r
96      * \r
97      */\r
98     {\r
99       sb.append(i);\r
100     }\r
101     return this;\r
102   }\r
103 \r
104   public SB appendB(boolean b) {\r
105     /**\r
106      * @j2sNative\r
107      * \r
108      *            this.s += b\r
109      * \r
110      */\r
111     {\r
112       sb.append(b);\r
113     }\r
114     return this;\r
115   }\r
116 \r
117   /**\r
118    * note that JavaScript could drop off the ".0" in "1.0"\r
119    * @param f\r
120    * @return this\r
121    */\r
122   public SB appendF(float f) {\r
123     /**\r
124      * @j2sNative\r
125      * \r
126      * var sf = "" + f;\r
127      * if (sf.indexOf(".") < 0 && sf.indexOf("e") < 0)\r
128      *   sf += ".0" ;\r
129      *            this.s += sf;\r
130      * \r
131      */\r
132     {\r
133       sb.append(f);\r
134     }\r
135     return this;\r
136   }\r
137 \r
138   public SB appendD(double d) {\r
139     /**\r
140      * @j2sNative\r
141      * \r
142      * var sf = "" + d;\r
143      * if (sf.indexOf(".") < 0 && sf.indexOf("e") < 0)\r
144      *   sf += ".0" ;\r
145      *            this.s += sf;\r
146      * \r
147      */\r
148     {\r
149       sb.append(d);\r
150     }\r
151     return this;\r
152   }\r
153 \r
154   public SB appendSB(SB buf) {\r
155     /**\r
156      * @j2sNative\r
157      * \r
158      *            this.s += buf.s;\r
159      * \r
160      */\r
161     {\r
162       sb.append(buf.sb);\r
163     }\r
164     return this;\r
165   }\r
166 \r
167   public SB appendO(Object data) {\r
168     if (data != null) {\r
169       /**\r
170        * @j2sNative\r
171        * \r
172        *            this.s += data.toString();\r
173        * \r
174        */\r
175       {\r
176         sb.append(data);\r
177       }\r
178     }\r
179     return this;\r
180   }\r
181 \r
182   public void appendCB(char[] cb, int off, int len) {\r
183     /**\r
184      * @j2sNative\r
185      * \r
186      * for (var i = len,j=off; --i >= 0;)\r
187      *            this.s += cb[j++];\r
188      * \r
189      */\r
190     {\r
191        sb.append(cb, off, len);\r
192     }\r
193   }\r
194 \r
195   @Override\r
196   public String toString() {\r
197     /**\r
198      * @j2sNative\r
199      * \r
200      *            return this.s;\r
201      * \r
202      */\r
203     {\r
204       return sb.toString();\r
205     }\r
206   }\r
207 \r
208   public int length() {\r
209     /**\r
210      * @j2sNative\r
211      * \r
212      *            return this.s.length;\r
213      * \r
214      */\r
215     {\r
216       return sb.length();\r
217     }\r
218   }\r
219 \r
220   public int indexOf(String s) {\r
221     /**\r
222      * @j2sNative\r
223      * \r
224      *            return this.s.indexOf(s);\r
225      * \r
226      */\r
227     {\r
228       return sb.indexOf(s);\r
229     }\r
230   }\r
231 \r
232   public char charAt(int i) {\r
233     /**\r
234      * @j2sNative\r
235      * \r
236      *            return this.s.charAt(i);\r
237      * \r
238      */\r
239     {\r
240       return sb.charAt(i);\r
241     }\r
242   }\r
243 \r
244   public int charCodeAt(int i) {\r
245     /**\r
246      * @j2sNative\r
247      * \r
248      *            return this.s.charCodeAt(i);\r
249      * \r
250      */\r
251     {\r
252       return sb.codePointAt(i);\r
253     }\r
254   }\r
255 \r
256   public void setLength(int n) {\r
257     /**\r
258      * @j2sNative\r
259      * \r
260      *            this.s = this.s.substring(0, n);\r
261      */\r
262     {\r
263       sb.setLength(n);\r
264     }\r
265   }\r
266 \r
267   public int lastIndexOf(String s) {\r
268     /**\r
269      * @j2sNative\r
270      * \r
271      *            return this.s.lastIndexOf(s);\r
272      */\r
273     {\r
274       return sb.lastIndexOf(s);\r
275     }\r
276   }\r
277 \r
278   public int indexOf2(String s, int i) {\r
279     /**\r
280      * @j2sNative\r
281      * \r
282      *            return this.s.indexOf(s, i);\r
283      */\r
284     {\r
285       return sb.indexOf(s, i);\r
286     }\r
287   }\r
288 \r
289   public String substring(int i) {\r
290     /**\r
291      * @j2sNative\r
292      * \r
293      *            return this.s.substring(i);\r
294      */\r
295     {\r
296       return sb.substring(i);\r
297     }\r
298   }\r
299 \r
300   public String substring2(int i, int j) {\r
301     /**\r
302      * @j2sNative\r
303      * \r
304      *            return this.s.substring(i, j);\r
305      */\r
306     {\r
307       return sb.substring(i, j);\r
308     }\r
309   }\r
310 \r
311   /**\r
312    * simple byte conversion not allowing for unicode.\r
313    * Used for base64 conversion and allows for offset\r
314    * @param off \r
315    * @param len or -1 for full length (then off must = 0)\r
316    * @return byte[]\r
317    */\r
318   public byte[] toBytes(int off, int len) {\r
319     if (len < 0)\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
324     return b;\r
325   }\r
326 \r
327         public void replace(int start, int end, String str) {\r
328                 /**\r
329                  * @j2sNative\r
330                  * \r
331                  * this.s = this.s.substring(0, start) + str + this.s.substring(end);\r
332                  */\r
333                 {\r
334                         sb.replace(start, end, str);\r
335                 }\r
336         }\r
337 \r
338         public void insert(int offset, String str) {\r
339                 replace(offset, offset, str);\r
340         }\r
341 \r
342 }\r