package org.nutz.el.parse;
import java.io.IOException;
import java.io.Reader;
import java.util.LinkedList;
/**
* 字符队列默认实现.
* @author juqkai(juqkai@gmail.com)
*
*/
public class CharQueueDefault implements CharQueue{
private Reader reader;
private LinkedList<Integer> cache;
private int cursor;
public CharQueueDefault(Reader reader) {
this.reader = reader;
cache = new LinkedList<Integer>();
try {
cursor = reader.read();
} catch (IOException e) {
e.printStackTrace();
}
}
public char peek() {
return (char) cursor;
}
public char peek(int ofset){
if(ofset == 0){
return (char) cursor;
}
//这个地方因为已经预读了cursor 所以,偏移量要向后移动一位
if(cache.size() > ofset - 1){
return (char)cache.get(ofset - 1).intValue();
}
int t = 0;
for(int i = 0; i < ofset - cache.size(); i++){
try {
t = reader.read();
cache.add(t);
} catch (IOException e) {
e.printStackTrace();
}
}
return (char) t;
}
public char poll() {
char x = (char) cursor;
try {
if(cache.isEmpty()){
cursor = reader.read();
} else {
cursor = cache.poll();
}
} catch (IOException e) {
e.printStackTrace();
}
return x;
}
public boolean isEmpty() {
return cursor == -1;
}
}