/* * 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. */ package org.apache.lucene.analysis.util; /** * 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; } @Override public int length() { return len; } public int capacity() { return buf.length; } @Override public Appendable append(CharSequence csq) { return append(csq, 0, csq.length()); } @Override 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; } @Override public Appendable append(char c) { write(c); return this; } @Override public char charAt(int index) { return buf[index]; } public void setCharAt(int index, char ch) { buf[index] = ch; } @Override 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; } @Override public String toString() { return new String(buf, 0, size()); } }