package org.lc.core;


import org.apache.lucene.analysis.CharacterUtils;

import java.io.IOException;
import java.io.Reader;

public class CharBufferReader implements IResetable {
    //字符窜reader
    private Reader input;
    //读取游标
    private int readCursor = 0;
    //字符读入缓冲
    private CharacterUtils.CharacterBuffer charBuffer;
    //字符缓冲区大小
    private int bufferSize;

    public CharBufferReader(Reader input, int bufferSize) {
        this.input = input;
        this.bufferSize = bufferSize;
        charBuffer = CharacterUtils.newCharacterBuffer(bufferSize);
    }

    public Character seek() throws IOException {
        if (readCursor < charBuffer.getLength()) {
            return charBuffer.getBuffer()[readCursor];
        }
        if (readToBuffer()) {
            return seek();
        }
        return null;
    }

    public Character read() throws IOException {
        if (readCursor < charBuffer.getLength()) {
            ++readCursor;
            return charBuffer.getBuffer()[readCursor - 1];
        }
        if (readToBuffer()) {
            return read();
        }
        return null;
    }


    private boolean readToBuffer() throws IOException {
        CharacterUtils.fill(charBuffer, input);
        readCursor = charBuffer.getOffset();
        return charBuffer.getLength() > charBuffer.getOffset();
    }

    public void reset(Reader input) {
        this.input = input;
        readCursor = 0;
        charBuffer = CharacterUtils.newCharacterBuffer(bufferSize);
    }

}