private static void flushAndReset(LinkedBuffer node, final WriteSession session) throws IOException { int len; do { if ((len = node.offset - node.start) > 0) node.offset = session.flush(node, node.buffer, node.start, len); } while ((node = node.next) != null); }
@Override public LinkedBuffer drain(final WriteSession session, final LinkedBuffer lb) throws IOException { // flush and reset lb.offset = session.flush(lb.buffer, lb.start, lb.offset - lb.start); return lb; }
@Override public LinkedBuffer writeByte(final byte value, final WriteSession session, LinkedBuffer lb) throws IOException { session.size++; if (lb.offset == lb.buffer.length) { // flush and reset lb.offset = session.flush(lb.buffer, lb.start, lb.offset - lb.start); } lb.buffer[lb.offset++] = value; return lb; }
@Override public LinkedBuffer writeVarInt64(long value, final WriteSession session, final LinkedBuffer lb) throws IOException { while (true) { session.size++; if (lb.offset == lb.buffer.length) { // flush and reset lb.offset = session.flush(lb.buffer, lb.start, lb.offset - lb.start); } if ((value & ~0x7FL) == 0) { lb.buffer[lb.offset++] = (byte) value; return lb; } lb.buffer[lb.offset++] = (byte) (((int) value & 0x7F) | 0x80); value >>>= 7; } }
@Override public LinkedBuffer writeVarInt32(int value, final WriteSession session, final LinkedBuffer lb) throws IOException { while (true) { session.size++; if (lb.offset == lb.buffer.length) { // flush and reset lb.offset = session.flush(lb.buffer, lb.start, lb.offset - lb.start); } if ((value & ~0x7F) == 0) { lb.buffer[lb.offset++] = (byte) value; return lb; } lb.buffer[lb.offset++] = (byte) ((value & 0x7F) | 0x80); value >>>= 7; } }
@Override public LinkedBuffer writeByteArray(final byte[] value, final int offset, final int valueLen, final WriteSession session, final LinkedBuffer lb) throws IOException { if (valueLen == 0) return lb; session.size += valueLen; if (lb.offset + valueLen > lb.buffer.length) { // flush and reset lb.offset = session.flush(lb.buffer, lb.start, lb.offset - lb.start, value, offset, valueLen); return lb; } System.arraycopy(value, offset, lb.buffer, lb.offset, valueLen); lb.offset += valueLen; return lb; }
@Override public LinkedBuffer writeInt16(final int value, final WriteSession session, LinkedBuffer lb) throws IOException { session.size += 2; if (lb.offset + 2 > lb.buffer.length) { // flush and reset lb.offset = session.flush(lb.buffer, lb.start, lb.offset - lb.start); } IntSerializer.writeInt16(value, lb.buffer, lb.offset); lb.offset += 2; return lb; }
@Override public LinkedBuffer writeInt64LE(final long value, final WriteSession session, LinkedBuffer lb) throws IOException { session.size += 8; if (lb.offset + 8 > lb.buffer.length) { // flush and reset lb.offset = session.flush(lb.buffer, lb.start, lb.offset - lb.start); } IntSerializer.writeInt64LE(value, lb.buffer, lb.offset); lb.offset += 8; return lb; }
@Override public LinkedBuffer writeInt16LE(final int value, final WriteSession session, LinkedBuffer lb) throws IOException { session.size += 2; if (lb.offset + 2 > lb.buffer.length) { // flush and reset lb.offset = session.flush(lb.buffer, lb.start, lb.offset - lb.start); } IntSerializer.writeInt16LE(value, lb.buffer, lb.offset); lb.offset += 2; return lb; }
@Override public LinkedBuffer writeInt32(final int value, final WriteSession session, LinkedBuffer lb) throws IOException { session.size += 4; if (lb.offset + 4 > lb.buffer.length) { // flush and reset lb.offset = session.flush(lb.buffer, lb.start, lb.offset - lb.start); } IntSerializer.writeInt32(value, lb.buffer, lb.offset); lb.offset += 4; return lb; }
@Override public LinkedBuffer writeInt32LE(final int value, final WriteSession session, LinkedBuffer lb) throws IOException { session.size += 4; if (lb.offset + 4 > lb.buffer.length) { // flush and reset lb.offset = session.flush(lb.buffer, lb.start, lb.offset - lb.start); } IntSerializer.writeInt32LE(value, lb.buffer, lb.offset); lb.offset += 4; return lb; }
@Override public LinkedBuffer writeInt64(final long value, final WriteSession session, LinkedBuffer lb) throws IOException { session.size += 8; if (lb.offset + 8 > lb.buffer.length) { // flush and reset lb.offset = session.flush(lb.buffer, lb.start, lb.offset - lb.start); } IntSerializer.writeInt64(value, lb.buffer, lb.offset); lb.offset += 8; return lb; }
private static LinkedBuffer writeUTF8OneByteDelimited(final CharSequence str, final int index, final int len, final WriteSession session, final LinkedBuffer lb) throws IOException { int lastSize = session.size, withIntOffset = lb.offset + 1; // the buffer could very well be almost-full. if (withIntOffset + len > lb.buffer.length) { // flush what we have. lb.offset = session.flush(lb.buffer, lb.start, lb.offset - lb.start); withIntOffset = lb.offset + 1; } // everything fits lb.offset = withIntOffset; final LinkedBuffer rb = StringSerializer.writeUTF8(str, index, len, session, lb); lb.buffer[withIntOffset - 1] = (byte) (session.size - lastSize); // update size session.size++; if (rb != lb) { // flush and reset nodes flushAndReset(lb, session); } return lb; }
lb.offset = session.flush(lb.buffer, lb.start, lb.offset - lb.start);
lb.offset = session.flush(lb.buffer, lb.start, lb.offset - lb.start); withIntOffset = lb.offset + 2;