--- /dev/null
+package org.apache.lucene.analysis.util;
+
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/**
+ * A StringBuilder that allows one to access the array.
+ */
+public class OpenStringBuilder implements Appendable, CharSequence {
+ protected char[] buf;
+ protected int len;
+
+ public OpenStringBuilder() {
+ this(32);
+ }
+
+ public OpenStringBuilder(int size) {
+ buf = new char[size];
+ }
+
+ public OpenStringBuilder(char[] arr, int len) {
+ set(arr, len);
+ }
+
+ public void setLength(int len) { this.len = len; }
+
+ public void set(char[] arr, int end) {
+ this.buf = arr;
+ this.len = end;
+ }
+
+ public char[] getArray() { return buf; }
+ public int size() { return len; }
+ public int length() { return len; }
+ public int capacity() { return buf.length; }
+
+ public Appendable append(CharSequence csq) {
+ return append(csq, 0, csq.length());
+ }
+
+ public Appendable append(CharSequence csq, int start, int end) {
+ reserve(end-start);
+ for (int i=start; i<end; i++) {
+ unsafeWrite(csq.charAt(i));
+ }
+ return this;
+ }
+
+ public Appendable append(char c) {
+ write(c);
+ return this;
+ }
+
+ public char charAt(int index) {
+ return buf[index];
+ }
+
+ public void setCharAt(int index, char ch) {
+ buf[index] = ch;
+ }
+
+ public CharSequence subSequence(int start, int end) {
+ throw new UnsupportedOperationException(); // todo
+ }
+
+ public void unsafeWrite(char b) {
+ buf[len++] = b;
+ }
+
+ public void unsafeWrite(int b) { unsafeWrite((char)b); }
+
+ public void unsafeWrite(char b[], int off, int len) {
+ System.arraycopy(b, off, buf, this.len, len);
+ this.len += len;
+ }
+
+ protected void resize(int len) {
+ char newbuf[] = new char[Math.max(buf.length << 1, len)];
+ System.arraycopy(buf, 0, newbuf, 0, size());
+ buf = newbuf;
+ }
+
+ public void reserve(int num) {
+ if (len + num > buf.length) resize(len + num);
+ }
+
+ public void write(char b) {
+ if (len >= buf.length) {
+ resize(len +1);
+ }
+ unsafeWrite(b);
+ }
+
+ public void write(int b) { write((char)b); }
+
+ public final void write(char[] b) {
+ write(b,0,b.length);
+ }
+
+ public void write(char b[], int off, int len) {
+ reserve(len);
+ unsafeWrite(b, off, len);
+ }
+
+ public final void write(OpenStringBuilder arr) {
+ write(arr.buf, 0, len);
+ }
+
+ public void write(String s) {
+ reserve(s.length());
+ s.getChars(0,s.length(),buf, len);
+ len +=s.length();
+ }
+
+ public void flush() {
+ }
+
+ public final void reset() {
+ len =0;
+ }
+
+ public char[] toCharArray() {
+ char newbuf[] = new char[size()];
+ System.arraycopy(buf, 0, newbuf, 0, size());
+ return newbuf;
+ }
+
+ public String toString() {
+ return new String(buf, 0, size());
+ }
+}