blob: fdc16f4f0c7ab2cccc13d3de5c8210e95de9eaee [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.util;
/**
* A builder for {@link CharsRef} instances.
* @lucene.internal
*/
public class CharsRefBuilder implements Appendable {
private static final String NULL_STRING = "null";
private final CharsRef ref;
/** Sole constructor. */
public CharsRefBuilder() {
ref = new CharsRef();
}
/** Return a reference to the chars of this builder. */
public char[] chars() {
return ref.chars;
}
/** Return the number of chars in this buffer. */
public int length() {
return ref.length;
}
/** Set the length. */
public void setLength(int length) {
this.ref.length = length;
}
/** Return the char at the given offset. */
public char charAt(int offset) {
return ref.chars[offset];
}
/** Set a char. */
public void setCharAt(int offset, char b) {
ref.chars[offset] = b;
}
/**
* Reset this builder to the empty state.
*/
public void clear() {
ref.length = 0;
}
@Override
public CharsRefBuilder append(CharSequence csq) {
if (csq == null) {
return append(NULL_STRING);
}
return append(csq, 0, csq.length());
}
@Override
public CharsRefBuilder append(CharSequence csq, int start, int end) {
if (csq == null) {
return append(NULL_STRING);
}
grow(ref.length + end - start);
for (int i = start; i < end; ++i) {
setCharAt(ref.length++, csq.charAt(i));
}
return this;
}
@Override
public CharsRefBuilder append(char c) {
grow(ref.length + 1);
setCharAt(ref.length++, c);
return this;
}
/**
* Copies the given {@link CharsRef} referenced content into this instance.
*/
public void copyChars(CharsRef other) {
copyChars(other.chars, other.offset, other.length);
}
/**
* Used to grow the reference array.
*/
public void grow(int newLength) {
ref.chars = ArrayUtil.grow(ref.chars, newLength);
}
/**
* Copy the provided bytes, interpreted as UTF-8 bytes.
*/
public void copyUTF8Bytes(byte[] bytes, int offset, int length) {
grow(length);
ref.length = UnicodeUtil.UTF8toUTF16(bytes, offset, length, ref.chars);
}
/**
* Copy the provided bytes, interpreted as UTF-8 bytes.
*/
public void copyUTF8Bytes(BytesRef bytes) {
copyUTF8Bytes(bytes.bytes, bytes.offset, bytes.length);
}
/**
* Copies the given array into this instance.
*/
public void copyChars(char[] otherChars, int otherOffset, int otherLength) {
grow(otherLength);
System.arraycopy(otherChars, otherOffset, ref.chars, 0, otherLength);
ref.length = otherLength;
}
/**
* Appends the given array to this CharsRef
*/
public void append(char[] otherChars, int otherOffset, int otherLength) {
int newLen = ref.length + otherLength;
grow(newLen);
System.arraycopy(otherChars, otherOffset, ref.chars, ref.length, otherLength);
ref.length = newLen;
}
/**
* Return a {@link CharsRef} that points to the internal content of this
* builder. Any update to the content of this builder might invalidate
* the provided <code>ref</code> and vice-versa.
*/
public CharsRef get() {
assert ref.offset == 0 : "Modifying the offset of the returned ref is illegal";
return ref;
}
/** Build a new {@link CharsRef} that has the same content as this builder. */
public CharsRef toCharsRef() {
return new CharsRef(ArrayUtil.copyOfSubArray(ref.chars, 0, ref.length), 0, ref.length);
}
@Override
public String toString() {
return get().toString();
}
@Override
public boolean equals(Object obj) {
throw new UnsupportedOperationException();
}
@Override
public int hashCode() {
throw new UnsupportedOperationException();
}
}