package org.basex.util;
import static org.basex.util.Token.*;
import org.basex.util.list.*;
/**
* <p>This class can be used to iterate through all codepoints of a token.</p>
*
* @author BaseX Team 2005-17, BSD License
* @author Christian Gruen
*/
public class TokenParser {
/** Token to be parsed. */
protected final byte[] token;
/** Token length. */
private final int size;
/** Current position. */
private int pos;
/**
* Constructor.
* @param token token
*/
public TokenParser(final byte[] token) {
this.token = token;
size = token.length;
}
/**
* Resets the cursor position.
*/
public final void reset() {
pos = 0;
}
/**
* Checks if the parser will return more codepoints.
* @return result of check
*/
public final boolean more() {
return pos < size;
}
/**
* Returns the current codepoint and advances the cursor.
* @return current codepoint, or {@code -1}
*/
public final int next() {
final int p = pos;
if(p < size) {
pos += cl(token, p);
return cp(token, p);
}
return -1;
}
/**
* Tries to consume the specified codepoint.
* @param ch codepoint to be consumed
* @return indicates if the codepoint was consumed
*/
public final boolean consume(final int ch) {
final int p = pos;
if(p >= size || cp(token, p) != ch) return false;
pos += cl(token, p);
return true;
}
/**
* Returns an array with all codepoints.
* @return array
*/
public final int[] toArray() {
final IntList il = new IntList(size);
while(more()) il.add(next());
return il.finish();
}
@Override
public String toString() {
return string(token);
}
}