diff --git a/src/main/java/io/netty/buffer/api/CompositeBuf.java b/src/main/java/io/netty/buffer/api/CompositeBuf.java index d030d9a..0f1346e 100644 --- a/src/main/java/io/netty/buffer/api/CompositeBuf.java +++ b/src/main/java/io/netty/buffer/api/CompositeBuf.java @@ -329,25 +329,31 @@ final class CompositeBuf extends RcSupport implements Buf { int index = fromOffset; final int end = fromOffset + length; int bufferIndex = startBufferIndex; + int initOffset = startCursor.currentOffset(); ByteCursor cursor = startCursor; long longValue = -1; byte byteValue = -1; @Override public boolean readLong() { + if (cursor.readLong()) { + longValue = cursor.getLong(); + return true; + } if (bytesLeft() >= Long.BYTES) { - if (cursor.readLong()) { - longValue = cursor.getLong(); - index += Long.BYTES; - } else { - longValue = nextLongFromBytes(); // Leave index increments to 'readByte' - } + longValue = nextLongFromBytes(); return true; } return false; } private long nextLongFromBytes() { + if (cursor.bytesLeft() == 0) { + nextCursor(); + if (cursor.readLong()) { + return cursor.getLong(); + } + } long val = 0; for (int i = 0; i < 8; i++) { readByte(); @@ -364,20 +370,26 @@ final class CompositeBuf extends RcSupport implements Buf { @Override public boolean readByte() { - if (index < end) { - if (!cursor.readByte()) { - bufferIndex++; - Buf nextBuf = bufs[bufferIndex]; - cursor = nextBuf.openCursor(0, Math.min(nextBuf.capacity(), bytesLeft())); - cursor.readByte(); - } + if (cursor.readByte()) { + byteValue = cursor.getByte(); + return true; + } + if (bytesLeft() > 0) { + nextCursor(); + cursor.readByte(); byteValue = cursor.getByte(); - index++; return true; } return false; } + private void nextCursor() { + bufferIndex++; + Buf nextBuf = bufs[bufferIndex]; + cursor = nextBuf.openCursor(0, Math.min(nextBuf.capacity(), bytesLeft())); + initOffset = 0; + } + @Override public byte getByte() { return byteValue; @@ -385,12 +397,15 @@ final class CompositeBuf extends RcSupport implements Buf { @Override public int currentOffset() { + int currOff = cursor.currentOffset(); + index += currOff - initOffset; + initOffset = currOff; return index; } @Override public int bytesLeft() { - return end - index; + return end - currentOffset(); } }; } @@ -415,25 +430,31 @@ final class CompositeBuf extends RcSupport implements Buf { int index = fromOffset; final int end = fromOffset - length; int bufferIndex = startBufferIndex; + int initOffset = startCursor.currentOffset(); ByteCursor cursor = startCursor; long longValue = -1; byte byteValue = -1; @Override public boolean readLong() { + if (cursor.readLong()) { + longValue = cursor.getLong(); + return true; + } if (bytesLeft() >= Long.BYTES) { - if (cursor.readLong()) { - index -= Long.BYTES; - longValue = cursor.getLong(); - } else { - longValue = nextLongFromBytes(); // Leave index increments to 'readByte' - } + longValue = nextLongFromBytes(); return true; } return false; } private long nextLongFromBytes() { + if (cursor.bytesLeft() == 0) { + nextCursor(); + if (cursor.readLong()) { + return cursor.getLong(); + } + } long val = 0; for (int i = 0; i < 8; i++) { readByte(); @@ -450,21 +471,28 @@ final class CompositeBuf extends RcSupport implements Buf { @Override public boolean readByte() { - if (index > end) { - if (!cursor.readByte()) { - bufferIndex--; - Buf nextBuf = bufs[bufferIndex]; - int length = Math.min(nextBuf.capacity(), bytesLeft()); - cursor = nextBuf.openReverseCursor(nextBuf.capacity() - 1, length); - cursor.readByte(); - } + if (cursor.readByte()) { + byteValue = cursor.getByte(); + return true; + } + if (bytesLeft() > 0) { + nextCursor(); + cursor.readByte(); byteValue = cursor.getByte(); - index--; return true; } return false; } + private void nextCursor() { + bufferIndex--; + Buf nextBuf = bufs[bufferIndex]; + int length = Math.min(nextBuf.capacity(), bytesLeft()); + int offset = nextBuf.capacity() - 1; + cursor = nextBuf.openReverseCursor(offset, length); + initOffset = offset; + } + @Override public byte getByte() { return byteValue; @@ -472,12 +500,15 @@ final class CompositeBuf extends RcSupport implements Buf { @Override public int currentOffset() { + int currOff = cursor.currentOffset(); + index -= initOffset - currOff; + initOffset = currOff; return index; } @Override public int bytesLeft() { - return index - end; + return currentOffset() - end; } }; }