blob: 61fe741e906d0447eef6fe319f984b746c618326 [file] [log] [blame]
/*
* 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());
}
}