peek()/slice() now use upcomingASCII()

This commit is contained in:
Ferdinand Majerech 2014-08-05 20:44:15 +02:00
parent d9079de427
commit c828c6b132

View file

@ -145,6 +145,7 @@ final class Reader
// Throws: ReaderException if trying to read past the end of the buffer. // Throws: ReaderException if trying to read past the end of the buffer.
dchar peek(const size_t index) @safe pure nothrow @nogc dchar peek(const size_t index) @safe pure nothrow @nogc
{ {
if(index < upcomingASCII_) { return buffer_[bufferOffset_ + index]; }
if(characterCount_ <= charIndex_ + index) if(characterCount_ <= charIndex_ + index)
{ {
// XXX This is risky; revert this if bugs are introduced. We rely on // XXX This is risky; revert this if bugs are introduced. We rely on
@ -172,8 +173,9 @@ final class Reader
} }
// 'Slow' path where we decode everything up to the requested character. // 'Slow' path where we decode everything up to the requested character.
lastDecodedCharOffset_ = 0; const asciiToTake = min(upcomingASCII_, index);
lastDecodedBufferOffset_ = bufferOffset_; lastDecodedCharOffset_ = asciiToTake;
lastDecodedBufferOffset_ = bufferOffset_ + asciiToTake;
dchar d; dchar d;
while(lastDecodedCharOffset_ <= index) while(lastDecodedCharOffset_ <= index)
{ {
@ -186,6 +188,7 @@ final class Reader
/// Optimized version of peek() for the case where peek index is 0. /// Optimized version of peek() for the case where peek index is 0.
dchar peek() @safe pure nothrow @nogc dchar peek() @safe pure nothrow @nogc
{ {
if(upcomingASCII_ > 0) { return buffer_[bufferOffset_]; }
if(characterCount_ <= charIndex_) { return '\0'; } if(characterCount_ <= charIndex_) { return '\0'; }
lastDecodedCharOffset_ = 0; lastDecodedCharOffset_ = 0;
@ -246,8 +249,9 @@ final class Reader
return buffer_[bufferOffset_ .. lastDecodedBufferOffset_]; return buffer_[bufferOffset_ .. lastDecodedBufferOffset_];
} }
lastDecodedCharOffset_ = 0; const asciiToTake = min(upcomingASCII_, end, buffer_.length);
lastDecodedBufferOffset_ = bufferOffset_; lastDecodedCharOffset_ = asciiToTake;
lastDecodedBufferOffset_ = bufferOffset_ + asciiToTake;
// 'Slow' path - decode everything up to end. // 'Slow' path - decode everything up to end.
while(lastDecodedCharOffset_ < end && while(lastDecodedCharOffset_ < end &&