/**
* Copyright (c) 2012-2016 André Bargull
* Alle Rechte vorbehalten / All Rights Reserved. Use is subject to license terms.
*
* <https://github.com/anba/es6draft>
*/
package com.github.anba.es6draft.parser;
import java.util.Arrays;
/**
* Simple string buffer class for internal use.
*/
final class StrBuffer {
private char[] array;
private int length;
public StrBuffer(int requestedCapacity) {
array = new char[initialCapacity(requestedCapacity)];
}
private static int initialCapacity(int requestedCapacity) {
return Math.max(Math.min(Integer.highestOneBit(requestedCapacity), 512), 8);
}
/**
* Returns the underlying character array.
*
* @return the character array
*/
public char[] array() {
return array;
}
/**
* Returns the current buffer length.
*
* @return the buffer length
*/
public int length() {
return length;
}
/**
* Clears the buffer content.
*/
public void clear() {
length = 0;
}
/**
* Appends the character to the buffer.
*
* @param c
* the character
*/
public void append(int c) {
int len = length;
if (len == array.length) {
array = Arrays.copyOf(array, length << 1);
}
array[len] = (char) c;
length = len + 1;
}
/**
* Appends the code point to the buffer.
*
* @param c
* the code point
*/
public void appendCodePoint(int c) {
if (Character.isBmpCodePoint(c)) {
append(c);
} else {
append(Character.highSurrogate(c));
append(Character.lowSurrogate(c));
}
}
/**
* Appends the character range to the buffer.
*
* @param in
* the token stream input
* @param from
* the start index
* @param to
* the end index
*/
public void append(TokenStreamInput in, int from, int to) {
assert from <= to;
int range = to - from;
if (range > 0) {
int offset = length;
int newLength = offset + range;
if (newLength > array.length) {
array = Arrays.copyOf(array, Integer.highestOneBit(newLength) << 1);
}
in.chars(from, to, array, offset);
length = newLength;
}
}
@Override
public String toString() {
return new String(array, 0, length);
}
}