You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
96 lines
2.7 KiB
96 lines
2.7 KiB
5 years ago
|
package com.fr.third.antlr;
|
||
|
|
||
|
/* ANTLR Translator Generator
|
||
|
* Project led by Terence Parr at http://www.cs.usfca.edu
|
||
|
* Software rights: http://www.antlr.org/license.html
|
||
|
*
|
||
|
* $Id: //depot/code/org.antlr/release/antlr-2.7.7/antlr/CharQueue.java#2 $
|
||
|
*/
|
||
|
|
||
|
/** A circular buffer object used by CharBuffer */
|
||
|
public class CharQueue {
|
||
|
/** Physical circular buffer of tokens */
|
||
|
protected char[] buffer;
|
||
|
/** buffer.length-1 for quick modulos */
|
||
|
private int sizeLessOne;
|
||
|
/** physical index of front token */
|
||
|
private int offset;
|
||
|
/** number of tokens in the queue */
|
||
|
protected int nbrEntries;
|
||
|
|
||
|
public CharQueue(int minSize) {
|
||
|
// Find first power of 2 >= to requested size
|
||
|
int size;
|
||
|
if ( minSize<0 ) {
|
||
|
init(16); // pick some value for them
|
||
|
return;
|
||
|
}
|
||
|
// check for overflow
|
||
|
if ( minSize>=(Integer.MAX_VALUE/2) ) {
|
||
|
init(Integer.MAX_VALUE); // wow that's big.
|
||
|
return;
|
||
|
}
|
||
|
for (size = 2; size < minSize; size *= 2) {
|
||
|
}
|
||
|
init(size);
|
||
|
}
|
||
|
|
||
|
/** Add token to end of the queue
|
||
|
* @param tok The token to add
|
||
|
*/
|
||
|
public final void append(char tok) {
|
||
|
if (nbrEntries == buffer.length) {
|
||
|
expand();
|
||
|
}
|
||
|
buffer[(offset + nbrEntries) & sizeLessOne] = tok;
|
||
|
nbrEntries++;
|
||
|
}
|
||
|
|
||
|
/** Fetch a token from the queue by index
|
||
|
* @param idx The index of the token to fetch, where zero is the token at the front of the queue
|
||
|
*/
|
||
|
public final char elementAt(int idx) {
|
||
|
return buffer[(offset + idx) & sizeLessOne];
|
||
|
}
|
||
|
|
||
|
/** Expand the token buffer by doubling its capacity */
|
||
|
private final void expand() {
|
||
|
char[] newBuffer = new char[buffer.length * 2];
|
||
|
// Copy the contents to the new buffer
|
||
|
// Note that this will store the first logical item in the
|
||
|
// first physical array element.
|
||
|
for (int i = 0; i < buffer.length; i++) {
|
||
|
newBuffer[i] = elementAt(i);
|
||
|
}
|
||
|
// Re-initialize with new contents, keep old nbrEntries
|
||
|
buffer = newBuffer;
|
||
|
sizeLessOne = buffer.length - 1;
|
||
|
offset = 0;
|
||
|
}
|
||
|
|
||
|
/** Initialize the queue.
|
||
|
* @param size The initial size of the queue
|
||
|
*/
|
||
|
public void init(int size) {
|
||
|
// Allocate buffer
|
||
|
buffer = new char[size];
|
||
|
// Other initialization
|
||
|
sizeLessOne = size - 1;
|
||
|
offset = 0;
|
||
|
nbrEntries = 0;
|
||
|
}
|
||
|
|
||
|
/** Clear the queue. Leaving the previous buffer alone.
|
||
|
*/
|
||
|
public final void reset() {
|
||
|
offset = 0;
|
||
|
nbrEntries = 0;
|
||
|
}
|
||
|
|
||
|
/** Remove char from front of queue */
|
||
|
public final void removeFirst() {
|
||
|
offset = (offset + 1) & sizeLessOne;
|
||
|
nbrEntries--;
|
||
|
}
|
||
|
}
|