31 package com.google.protobuf;
48 import java.io.IOException;
49 import java.nio.ByteBuffer;
50 import java.nio.ByteOrder;
51 import java.util.ArrayDeque;
52 import java.util.List;
54 import java.util.Queue;
69 abstract class BinaryWriter
extends ByteOutput implements Writer {
70 public static final int DEFAULT_CHUNK_SIZE = 4096;
72 private final BufferAllocator alloc;
73 private final int chunkSize;
75 final ArrayDeque<AllocatedBuffer>
buffers =
new ArrayDeque<AllocatedBuffer>(4);
82 public static BinaryWriter newHeapInstance(BufferAllocator alloc) {
83 return newHeapInstance(alloc, DEFAULT_CHUNK_SIZE);
90 public static BinaryWriter newHeapInstance(BufferAllocator alloc,
int chunkSize) {
91 return isUnsafeHeapSupported()
92 ? newUnsafeHeapInstance(alloc, chunkSize)
93 : newSafeHeapInstance(alloc, chunkSize);
100 public static BinaryWriter newDirectInstance(BufferAllocator alloc) {
101 return newDirectInstance(alloc, DEFAULT_CHUNK_SIZE);
108 public static BinaryWriter newDirectInstance(BufferAllocator alloc,
int chunkSize) {
109 return isUnsafeDirectSupported()
110 ? newUnsafeDirectInstance(alloc, chunkSize)
111 : newSafeDirectInstance(alloc, chunkSize);
114 static boolean isUnsafeHeapSupported() {
115 return UnsafeHeapWriter.isSupported();
118 static boolean isUnsafeDirectSupported() {
119 return UnsafeDirectWriter.isSupported();
122 static BinaryWriter newSafeHeapInstance(BufferAllocator alloc,
int chunkSize) {
123 return new SafeHeapWriter(alloc, chunkSize);
126 static BinaryWriter newUnsafeHeapInstance(BufferAllocator alloc,
int chunkSize) {
127 if (!isUnsafeHeapSupported()) {
128 throw new UnsupportedOperationException(
"Unsafe operations not supported");
130 return new UnsafeHeapWriter(alloc, chunkSize);
133 static BinaryWriter newSafeDirectInstance(BufferAllocator alloc,
int chunkSize) {
134 return new SafeDirectWriter(alloc, chunkSize);
137 static BinaryWriter newUnsafeDirectInstance(BufferAllocator alloc,
int chunkSize) {
138 if (!isUnsafeDirectSupported()) {
139 throw new UnsupportedOperationException(
"Unsafe operations not supported");
141 return new UnsafeDirectWriter(alloc, chunkSize);
145 private BinaryWriter(BufferAllocator alloc,
int chunkSize) {
146 if (chunkSize <= 0) {
147 throw new IllegalArgumentException(
"chunkSize must be > 0");
149 this.alloc = checkNotNull(alloc,
"alloc");
150 this.chunkSize = chunkSize;
154 public final FieldOrder fieldOrder() {
155 return FieldOrder.DESCENDING;
166 finishCurrentBuffer();
171 public final void writeSFixed32(
int fieldNumber,
int value)
throws IOException {
172 writeFixed32(fieldNumber,
value);
176 public final void writeInt64(
int fieldNumber,
long value)
throws IOException {
177 writeUInt64(fieldNumber,
value);
181 public final void writeSFixed64(
int fieldNumber,
long value)
throws IOException {
182 writeFixed64(fieldNumber,
value);
186 public final void writeFloat(
int fieldNumber,
float value)
throws IOException {
187 writeFixed32(fieldNumber,
Float.floatToRawIntBits(
value));
191 public final void writeDouble(
int fieldNumber,
double value)
throws IOException {
192 writeFixed64(fieldNumber,
Double.doubleToRawLongBits(
value));
196 public final void writeEnum(
int fieldNumber,
int value)
throws IOException {
197 writeInt32(fieldNumber,
value);
201 public final void writeInt32List(
int fieldNumber, List<Integer> list,
boolean packed)
203 if (list instanceof IntArrayList) {
204 writeInt32List_Internal(fieldNumber, (IntArrayList) list, packed);
206 writeInt32List_Internal(fieldNumber, list, packed);
210 private final void writeInt32List_Internal(
int fieldNumber, List<Integer> list,
boolean packed)
213 requireSpace((MAX_VARINT32_SIZE * 2) + (list.size() * MAX_VARINT64_SIZE));
214 int prevBytes = getTotalBytesWritten();
215 for (
int i = list.size() - 1;
i >= 0; --
i) {
216 writeInt32(list.get(
i));
218 int length = getTotalBytesWritten() - prevBytes;
222 for (
int i = list.size() - 1;
i >= 0; --
i) {
223 writeInt32(fieldNumber, list.get(
i));
228 private final void writeInt32List_Internal(
int fieldNumber, IntArrayList list,
boolean packed)
231 requireSpace((MAX_VARINT32_SIZE * 2) + (list.size() * MAX_VARINT64_SIZE));
232 int prevBytes = getTotalBytesWritten();
233 for (
int i = list.size() - 1;
i >= 0; --
i) {
234 writeInt32(list.getInt(
i));
236 int length = getTotalBytesWritten() - prevBytes;
240 for (
int i = list.size() - 1;
i >= 0; --
i) {
241 writeInt32(fieldNumber, list.getInt(
i));
247 public final void writeFixed32List(
int fieldNumber, List<Integer> list,
boolean packed)
249 if (list instanceof IntArrayList) {
250 writeFixed32List_Internal(fieldNumber, (IntArrayList) list, packed);
252 writeFixed32List_Internal(fieldNumber, list, packed);
256 private final void writeFixed32List_Internal(
int fieldNumber, List<Integer> list,
boolean packed)
259 requireSpace((MAX_VARINT32_SIZE * 2) + (list.size() * FIXED32_SIZE));
260 int prevBytes = getTotalBytesWritten();
261 for (
int i = list.size() - 1;
i >= 0; --
i) {
262 writeFixed32(list.get(
i));
264 int length = getTotalBytesWritten() - prevBytes;
268 for (
int i = list.size() - 1;
i >= 0; --
i) {
269 writeFixed32(fieldNumber, list.get(
i));
274 private final void writeFixed32List_Internal(
int fieldNumber, IntArrayList list,
boolean packed)
277 requireSpace((MAX_VARINT32_SIZE * 2) + (list.size() * FIXED32_SIZE));
278 int prevBytes = getTotalBytesWritten();
279 for (
int i = list.size() - 1;
i >= 0; --
i) {
280 writeFixed32(list.getInt(
i));
282 int length = getTotalBytesWritten() - prevBytes;
286 for (
int i = list.size() - 1;
i >= 0; --
i) {
287 writeFixed32(fieldNumber, list.getInt(
i));
293 public final void writeInt64List(
int fieldNumber, List<Long> list,
boolean packed)
295 writeUInt64List(fieldNumber, list, packed);
299 public final void writeUInt64List(
int fieldNumber, List<Long> list,
boolean packed)
301 if (list instanceof LongArrayList) {
302 writeUInt64List_Internal(fieldNumber, (LongArrayList) list, packed);
304 writeUInt64List_Internal(fieldNumber, list, packed);
308 private final void writeUInt64List_Internal(
int fieldNumber, List<Long> list,
boolean packed)
311 requireSpace((MAX_VARINT32_SIZE * 2) + (list.size() * MAX_VARINT64_SIZE));
312 int prevBytes = getTotalBytesWritten();
313 for (
int i = list.size() - 1;
i >= 0; --
i) {
314 writeVarint64(list.get(
i));
316 int length = getTotalBytesWritten() - prevBytes;
320 for (
int i = list.size() - 1;
i >= 0; --
i) {
321 writeUInt64(fieldNumber, list.get(
i));
326 private final void writeUInt64List_Internal(
int fieldNumber, LongArrayList list,
boolean packed)
329 requireSpace((MAX_VARINT32_SIZE * 2) + (list.size() * MAX_VARINT64_SIZE));
330 int prevBytes = getTotalBytesWritten();
331 for (
int i = list.size() - 1;
i >= 0; --
i) {
332 writeVarint64(list.getLong(
i));
334 int length = getTotalBytesWritten() - prevBytes;
338 for (
int i = list.size() - 1;
i >= 0; --
i) {
339 writeUInt64(fieldNumber, list.getLong(
i));
345 public final void writeFixed64List(
int fieldNumber, List<Long> list,
boolean packed)
347 if (list instanceof LongArrayList) {
348 writeFixed64List_Internal(fieldNumber, (LongArrayList) list, packed);
350 writeFixed64List_Internal(fieldNumber, list, packed);
354 private final void writeFixed64List_Internal(
int fieldNumber, List<Long> list,
boolean packed)
357 requireSpace((MAX_VARINT32_SIZE * 2) + (list.size() * FIXED64_SIZE));
358 int prevBytes = getTotalBytesWritten();
359 for (
int i = list.size() - 1;
i >= 0; --
i) {
360 writeFixed64(list.get(
i));
362 int length = getTotalBytesWritten() - prevBytes;
366 for (
int i = list.size() - 1;
i >= 0; --
i) {
367 writeFixed64(fieldNumber, list.get(
i));
372 private final void writeFixed64List_Internal(
int fieldNumber, LongArrayList list,
boolean packed)
375 requireSpace((MAX_VARINT32_SIZE * 2) + (list.size() * FIXED64_SIZE));
376 int prevBytes = getTotalBytesWritten();
377 for (
int i = list.size() - 1;
i >= 0; --
i) {
378 writeFixed64(list.getLong(
i));
380 int length = getTotalBytesWritten() - prevBytes;
384 for (
int i = list.size() - 1;
i >= 0; --
i) {
385 writeFixed64(fieldNumber, list.getLong(
i));
391 public final void writeFloatList(
int fieldNumber, List<Float> list,
boolean packed)
393 if (list instanceof FloatArrayList) {
394 writeFloatList_Internal(fieldNumber, (FloatArrayList) list, packed);
396 writeFloatList_Internal(fieldNumber, list, packed);
400 private final void writeFloatList_Internal(
int fieldNumber, List<Float> list,
boolean packed)
403 requireSpace((MAX_VARINT32_SIZE * 2) + (list.size() * FIXED32_SIZE));
404 int prevBytes = getTotalBytesWritten();
405 for (
int i = list.size() - 1;
i >= 0; --
i) {
406 writeFixed32(
Float.floatToRawIntBits(list.get(
i)));
408 int length = getTotalBytesWritten() - prevBytes;
412 for (
int i = list.size() - 1;
i >= 0; --
i) {
413 writeFloat(fieldNumber, list.get(
i));
418 private final void writeFloatList_Internal(
int fieldNumber, FloatArrayList list,
boolean packed)
421 requireSpace((MAX_VARINT32_SIZE * 2) + (list.size() * FIXED32_SIZE));
422 int prevBytes = getTotalBytesWritten();
423 for (
int i = list.size() - 1;
i >= 0; --
i) {
424 writeFixed32(
Float.floatToRawIntBits(list.getFloat(
i)));
426 int length = getTotalBytesWritten() - prevBytes;
430 for (
int i = list.size() - 1;
i >= 0; --
i) {
431 writeFloat(fieldNumber, list.getFloat(
i));
437 public final void writeDoubleList(
int fieldNumber, List<Double> list,
boolean packed)
439 if (list instanceof DoubleArrayList) {
440 writeDoubleList_Internal(fieldNumber, (DoubleArrayList) list, packed);
442 writeDoubleList_Internal(fieldNumber, list, packed);
446 private final void writeDoubleList_Internal(
int fieldNumber, List<Double> list,
boolean packed)
449 requireSpace((MAX_VARINT32_SIZE * 2) + (list.size() * FIXED64_SIZE));
450 int prevBytes = getTotalBytesWritten();
451 for (
int i = list.size() - 1;
i >= 0; --
i) {
452 writeFixed64(
Double.doubleToRawLongBits(list.get(
i)));
454 int length = getTotalBytesWritten() - prevBytes;
458 for (
int i = list.size() - 1;
i >= 0; --
i) {
459 writeDouble(fieldNumber, list.get(
i));
464 private final void writeDoubleList_Internal(
int fieldNumber, DoubleArrayList list,
boolean packed)
467 requireSpace((MAX_VARINT32_SIZE * 2) + (list.size() * FIXED64_SIZE));
468 int prevBytes = getTotalBytesWritten();
469 for (
int i = list.size() - 1;
i >= 0; --
i) {
470 writeFixed64(
Double.doubleToRawLongBits(list.getDouble(
i)));
472 int length = getTotalBytesWritten() - prevBytes;
476 for (
int i = list.size() - 1;
i >= 0; --
i) {
477 writeDouble(fieldNumber, list.getDouble(
i));
483 public final void writeEnumList(
int fieldNumber, List<Integer> list,
boolean packed)
485 writeInt32List(fieldNumber, list, packed);
489 public final void writeBoolList(
int fieldNumber, List<Boolean> list,
boolean packed)
491 if (list instanceof BooleanArrayList) {
492 writeBoolList_Internal(fieldNumber, (BooleanArrayList) list, packed);
494 writeBoolList_Internal(fieldNumber, list, packed);
498 private final void writeBoolList_Internal(
int fieldNumber, List<Boolean> list,
boolean packed)
501 requireSpace((MAX_VARINT32_SIZE * 2) + list.size());
502 int prevBytes = getTotalBytesWritten();
503 for (
int i = list.size() - 1;
i >= 0; --
i) {
504 writeBool(list.get(
i));
506 int length = getTotalBytesWritten() - prevBytes;
510 for (
int i = list.size() - 1;
i >= 0; --
i) {
511 writeBool(fieldNumber, list.get(
i));
516 private final void writeBoolList_Internal(
int fieldNumber, BooleanArrayList list,
boolean packed)
519 requireSpace((MAX_VARINT32_SIZE * 2) + list.size());
520 int prevBytes = getTotalBytesWritten();
521 for (
int i = list.size() - 1;
i >= 0; --
i) {
522 writeBool(list.getBoolean(
i));
524 int length = getTotalBytesWritten() - prevBytes;
528 for (
int i = list.size() - 1;
i >= 0; --
i) {
529 writeBool(fieldNumber, list.getBoolean(
i));
535 public final void writeStringList(
int fieldNumber, List<String> list)
throws IOException {
536 if (list instanceof LazyStringList) {
537 final LazyStringList lazyList = (LazyStringList) list;
538 for (
int i = list.size() - 1;
i >= 0;
i--) {
539 writeLazyString(fieldNumber, lazyList.getRaw(
i));
542 for (
int i = list.size() - 1;
i >= 0;
i--) {
548 private void writeLazyString(
int fieldNumber, Object
value)
throws IOException {
549 if (
value instanceof String) {
552 writeBytes(fieldNumber, (ByteString)
value);
557 public final void writeBytesList(
int fieldNumber, List<ByteString> list)
throws IOException {
558 for (
int i = list.size() - 1;
i >= 0;
i--) {
559 writeBytes(fieldNumber, list.get(
i));
564 public final void writeUInt32List(
int fieldNumber, List<Integer> list,
boolean packed)
566 if (list instanceof IntArrayList) {
567 writeUInt32List_Internal(fieldNumber, (IntArrayList) list, packed);
569 writeUInt32List_Internal(fieldNumber, list, packed);
573 private final void writeUInt32List_Internal(
int fieldNumber, List<Integer> list,
boolean packed)
576 requireSpace((MAX_VARINT32_SIZE * 2) + (list.size() * MAX_VARINT32_SIZE));
577 int prevBytes = getTotalBytesWritten();
578 for (
int i = list.size() - 1;
i >= 0; --
i) {
579 writeVarint32(list.get(
i));
581 int length = getTotalBytesWritten() - prevBytes;
585 for (
int i = list.size() - 1;
i >= 0; --
i) {
586 writeUInt32(fieldNumber, list.get(
i));
591 private final void writeUInt32List_Internal(
int fieldNumber, IntArrayList list,
boolean packed)
594 requireSpace((MAX_VARINT32_SIZE * 2) + (list.size() * MAX_VARINT32_SIZE));
595 int prevBytes = getTotalBytesWritten();
596 for (
int i = list.size() - 1;
i >= 0; --
i) {
597 writeVarint32(list.getInt(
i));
599 int length = getTotalBytesWritten() - prevBytes;
603 for (
int i = list.size() - 1;
i >= 0; --
i) {
604 writeUInt32(fieldNumber, list.getInt(
i));
610 public final void writeSFixed32List(
int fieldNumber, List<Integer> list,
boolean packed)
612 writeFixed32List(fieldNumber, list, packed);
616 public final void writeSFixed64List(
int fieldNumber, List<Long> list,
boolean packed)
618 writeFixed64List(fieldNumber, list, packed);
622 public final void writeSInt32List(
int fieldNumber, List<Integer> list,
boolean packed)
624 if (list instanceof IntArrayList) {
625 writeSInt32List_Internal(fieldNumber, (IntArrayList) list, packed);
627 writeSInt32List_Internal(fieldNumber, list, packed);
631 private final void writeSInt32List_Internal(
int fieldNumber, List<Integer> list,
boolean packed)
634 requireSpace((MAX_VARINT32_SIZE * 2) + (list.size() * MAX_VARINT32_SIZE));
635 int prevBytes = getTotalBytesWritten();
636 for (
int i = list.size() - 1;
i >= 0; --
i) {
637 writeSInt32(list.get(
i));
639 int length = getTotalBytesWritten() - prevBytes;
643 for (
int i = list.size() - 1;
i >= 0; --
i) {
644 writeSInt32(fieldNumber, list.get(
i));
649 private final void writeSInt32List_Internal(
int fieldNumber, IntArrayList list,
boolean packed)
652 requireSpace((MAX_VARINT32_SIZE * 2) + (list.size() * MAX_VARINT32_SIZE));
653 int prevBytes = getTotalBytesWritten();
654 for (
int i = list.size() - 1;
i >= 0; --
i) {
655 writeSInt32(list.getInt(
i));
657 int length = getTotalBytesWritten() - prevBytes;
661 for (
int i = list.size() - 1;
i >= 0; --
i) {
662 writeSInt32(fieldNumber, list.getInt(
i));
668 public final void writeSInt64List(
int fieldNumber, List<Long> list,
boolean packed)
670 if (list instanceof LongArrayList) {
671 writeSInt64List_Internal(fieldNumber, (LongArrayList) list, packed);
673 writeSInt64List_Internal(fieldNumber, list, packed);
677 private static final int MAP_KEY_NUMBER = 1;
678 private static final int MAP_VALUE_NUMBER = 2;
684 for (
Map.Entry<
K, V> entry :
map.entrySet()) {
685 int prevBytes = getTotalBytesWritten();
686 writeMapEntryField(
this, MAP_VALUE_NUMBER,
metadata.valueType, entry.getValue());
687 writeMapEntryField(
this, MAP_KEY_NUMBER,
metadata.keyType, entry.getKey());
688 int length = getTotalBytesWritten() - prevBytes;
694 static final void writeMapEntryField(
695 Writer writer,
int fieldNumber, WireFormat.FieldType fieldType, Object
object)
699 writer.writeBool(fieldNumber, (Boolean)
object);
702 writer.writeFixed32(fieldNumber, (Integer)
object);
705 writer.writeFixed64(fieldNumber, (Long)
object);
708 writer.writeInt32(fieldNumber, (Integer)
object);
711 writer.writeInt64(fieldNumber, (Long)
object);
714 writer.writeSFixed32(fieldNumber, (Integer)
object);
717 writer.writeSFixed64(fieldNumber, (Long)
object);
720 writer.writeSInt32(fieldNumber, (Integer)
object);
723 writer.writeSInt64(fieldNumber, (Long)
object);
726 writer.writeString(fieldNumber, (String)
object);
729 writer.writeUInt32(fieldNumber, (Integer)
object);
732 writer.writeUInt64(fieldNumber, (Long)
object);
735 writer.writeFloat(fieldNumber, (
Float)
object);
738 writer.writeDouble(fieldNumber, (
Double)
object);
741 writer.writeMessage(fieldNumber,
object);
744 writer.writeBytes(fieldNumber, (ByteString)
object);
747 if (
object instanceof Internal.EnumLite) {
748 writer.writeEnum(fieldNumber, ((Internal.EnumLite)
object).getNumber());
749 }
else if (
object instanceof Integer) {
750 writer.writeEnum(fieldNumber, (Integer)
object);
752 throw new IllegalArgumentException(
"Unexpected type for enum in map.");
756 throw new IllegalArgumentException(
"Unsupported map value type for: " + fieldType);
760 private final void writeSInt64List_Internal(
int fieldNumber, List<Long> list,
boolean packed)
763 requireSpace((MAX_VARINT32_SIZE * 2) + (list.size() * MAX_VARINT64_SIZE));
764 int prevBytes = getTotalBytesWritten();
765 for (
int i = list.size() - 1;
i >= 0; --
i) {
766 writeSInt64(list.get(
i));
768 int length = getTotalBytesWritten() - prevBytes;
772 for (
int i = list.size() - 1;
i >= 0; --
i) {
773 writeSInt64(fieldNumber, list.get(
i));
778 private final void writeSInt64List_Internal(
int fieldNumber, LongArrayList list,
boolean packed)
781 requireSpace((MAX_VARINT32_SIZE * 2) + (list.size() * MAX_VARINT64_SIZE));
782 int prevBytes = getTotalBytesWritten();
783 for (
int i = list.size() - 1;
i >= 0; --
i) {
784 writeSInt64(list.getLong(
i));
786 int length = getTotalBytesWritten() - prevBytes;
790 for (
int i = list.size() - 1;
i >= 0; --
i) {
791 writeSInt64(fieldNumber, list.getLong(
i));
797 public final void writeMessageList(
int fieldNumber, List<?> list)
throws IOException {
798 for (
int i = list.size() - 1;
i >= 0;
i--) {
799 writeMessage(fieldNumber, list.get(
i));
804 public final void writeMessageList(
int fieldNumber, List<?> list, Schema schema)
806 for (
int i = list.size() - 1;
i >= 0;
i--) {
807 writeMessage(fieldNumber, list.get(
i), schema);
812 public final void writeGroupList(
int fieldNumber, List<?> list)
throws IOException {
813 for (
int i = list.size() - 1;
i >= 0;
i--) {
814 writeGroup(fieldNumber, list.get(
i));
819 public final void writeGroupList(
int fieldNumber, List<?> list, Schema schema)
821 for (
int i = list.size() - 1;
i >= 0;
i--) {
822 writeGroup(fieldNumber, list.get(
i), schema);
827 public final void writeMessageSetItem(
int fieldNumber, Object
value)
throws IOException {
829 if (
value instanceof ByteString) {
830 writeBytes(MESSAGE_SET_MESSAGE, (ByteString)
value);
832 writeMessage(MESSAGE_SET_MESSAGE,
value);
834 writeUInt32(MESSAGE_SET_TYPE_ID, fieldNumber);
838 final AllocatedBuffer newHeapBuffer() {
839 return alloc.allocateHeapBuffer(chunkSize);
842 final AllocatedBuffer newHeapBuffer(
int capacity) {
843 return alloc.allocateHeapBuffer(Math.max(capacity, chunkSize));
846 final AllocatedBuffer newDirectBuffer() {
847 return alloc.allocateDirectBuffer(chunkSize);
850 final AllocatedBuffer newDirectBuffer(
int capacity) {
851 return alloc.allocateDirectBuffer(Math.max(capacity, chunkSize));
858 public abstract int getTotalBytesWritten();
860 abstract void requireSpace(
int size);
862 abstract void finishCurrentBuffer();
864 abstract void writeTag(
int fieldNumber,
int wireType);
866 abstract void writeVarint32(
int value);
868 abstract void writeInt32(
int value);
870 abstract void writeSInt32(
int value);
872 abstract void writeFixed32(
int value);
874 abstract void writeVarint64(
long value);
876 abstract void writeSInt64(
long value);
878 abstract void writeFixed64(
long value);
880 abstract void writeBool(
boolean value);
888 private static byte computeUInt64SizeNoTag(
long value) {
890 if ((
value & (~0L << 7)) == 0L) {
900 if ((
value & (~0L << 35)) != 0L) {
905 if ((
value & (~0L << 21)) != 0L) {
910 if ((
value & (~0L << 14)) != 0L) {
928 super(alloc, chunkSize);
933 void finishCurrentBuffer() {
935 totalDoneBytes += bytesWrittenToCurrentBuffer();
953 throw new RuntimeException(
"Allocator returned non-heap buffer");
956 finishCurrentBuffer();
965 this.offsetMinusOne =
offset - 1;
966 this.limitMinusOne =
limit - 1;
972 return totalDoneBytes + bytesWrittenToCurrentBuffer();
975 int bytesWrittenToCurrentBuffer() {
985 requireSpace(MAX_VARINT32_SIZE * 2);
986 writeVarint32(
value);
992 requireSpace(MAX_VARINT32_SIZE + MAX_VARINT64_SIZE);
999 requireSpace(MAX_VARINT32_SIZE * 2);
1006 requireSpace(MAX_VARINT32_SIZE + FIXED32_SIZE);
1013 requireSpace(MAX_VARINT32_SIZE + MAX_VARINT64_SIZE);
1014 writeVarint64(
value);
1020 requireSpace(MAX_VARINT32_SIZE + MAX_VARINT64_SIZE);
1027 requireSpace(MAX_VARINT32_SIZE + FIXED64_SIZE);
1034 requireSpace(MAX_VARINT32_SIZE + 1);
1044 requireSpace(2 * MAX_VARINT32_SIZE);
1052 value.writeToReverse(
this);
1053 }
catch (IOException e) {
1055 throw new RuntimeException(e);
1058 requireSpace(MAX_VARINT32_SIZE * 2);
1059 writeVarint32(
value.size());
1066 Protobuf.getInstance().writeTo(
value,
this);
1068 requireSpace(MAX_VARINT32_SIZE * 2);
1076 schema.writeTo(
value,
this);
1078 requireSpace(MAX_VARINT32_SIZE * 2);
1086 Protobuf.getInstance().writeTo(
value,
this);
1093 schema.writeTo(
value,
this);
1110 writeVarint32(
value);
1112 writeVarint64(
value);
1118 writeVarint32(CodedOutputStream.encodeZigZag32(
value));
1123 writeVarint64(CodedOutputStream.encodeZigZag64(
value));
1132 void writeTag(
int fieldNumber,
int wireType) {
1133 writeVarint32(WireFormat.makeTag(fieldNumber, wireType));
1137 void writeVarint32(
int value) {
1138 if ((
value & (~0 << 7)) == 0) {
1140 }
else if ((
value & (~0 << 14)) == 0) {
1142 }
else if ((
value & (~0 << 21)) == 0) {
1144 }
else if ((
value & (~0 << 28)) == 0) {
1182 void writeVarint64(
long value) {
1183 switch (computeUInt64SizeNoTag(
value)) {
1325 requireSpace(in.length());
1328 int i = in.length() - 1;
1333 for (
char c;
i >= 0 && (c = in.charAt(
i)) < 0x80;
i--) {
1342 for (
char c;
i >= 0;
i--) {
1346 }
else if (c < 0x800 && pos >
offset) {
1349 }
else if ((c < Character.MIN_SURROGATE || Character.MAX_SURROGATE < c)
1359 if (
i == 0 || !Character.isSurrogatePair(high = in.charAt(
i - 1), c)) {
1360 throw new Utf8.UnpairedSurrogateException(
i - 1,
i);
1363 int codePoint = Character.toCodePoint(high, c);
1366 buffer[
pos--] = (
byte) (0x80 | (0x3F & (codePoint >>> 12)));
1383 if (spaceLeft() <
length) {
1393 if (spaceLeft() <
length) {
1396 totalDoneBytes +=
length;
1412 if (spaceLeft() <
length) {
1423 if (spaceLeft() <
length) {
1426 totalDoneBytes +=
length;
1439 void requireSpace(
int size) {
1440 if (spaceLeft() <
size) {
1457 super(alloc, chunkSize);
1462 static boolean isSupported() {
1463 return UnsafeUtil.hasUnsafeArrayOperations();
1467 void finishCurrentBuffer() {
1469 totalDoneBytes += bytesWrittenToCurrentBuffer();
1491 throw new RuntimeException(
"Allocator returned non-heap buffer");
1494 finishCurrentBuffer();
1502 this.offsetMinusOne =
offset - 1;
1503 this.limitMinusOne =
limit - 1;
1509 return totalDoneBytes + bytesWrittenToCurrentBuffer();
1512 int bytesWrittenToCurrentBuffer() {
1522 requireSpace(MAX_VARINT32_SIZE * 2);
1523 writeVarint32(
value);
1529 requireSpace(MAX_VARINT32_SIZE + MAX_VARINT64_SIZE);
1536 requireSpace(MAX_VARINT32_SIZE * 2);
1543 requireSpace(MAX_VARINT32_SIZE + FIXED32_SIZE);
1550 requireSpace(MAX_VARINT32_SIZE + MAX_VARINT64_SIZE);
1551 writeVarint64(
value);
1557 requireSpace(MAX_VARINT32_SIZE + MAX_VARINT64_SIZE);
1564 requireSpace(MAX_VARINT32_SIZE + FIXED64_SIZE);
1571 requireSpace(MAX_VARINT32_SIZE + 1);
1581 requireSpace(2 * MAX_VARINT32_SIZE);
1589 value.writeToReverse(
this);
1590 }
catch (IOException e) {
1592 throw new RuntimeException(e);
1595 requireSpace(MAX_VARINT32_SIZE * 2);
1596 writeVarint32(
value.size());
1603 Protobuf.getInstance().writeTo(
value,
this);
1605 requireSpace(MAX_VARINT32_SIZE * 2);
1613 schema.writeTo(
value,
this);
1615 requireSpace(MAX_VARINT32_SIZE * 2);
1623 Protobuf.getInstance().writeTo(
value,
this);
1630 schema.writeTo(
value,
this);
1647 writeVarint32(
value);
1649 writeVarint64(
value);
1655 writeVarint32(CodedOutputStream.encodeZigZag32(
value));
1660 writeVarint64(CodedOutputStream.encodeZigZag64(
value));
1669 void writeTag(
int fieldNumber,
int wireType) {
1670 writeVarint32(WireFormat.makeTag(fieldNumber, wireType));
1674 void writeVarint32(
int value) {
1675 if ((
value & (~0 << 7)) == 0) {
1677 }
else if ((
value & (~0 << 14)) == 0) {
1679 }
else if ((
value & (~0 << 21)) == 0) {
1681 }
else if ((
value & (~0 << 28)) == 0) {
1694 UnsafeUtil.putByte(
buffer,
pos--, (
byte) ((
value & 0x7F) | 0x80));
1699 UnsafeUtil.putByte(
buffer,
pos--, (
byte) (((
value >>> 7) & 0x7F) | 0x80));
1700 UnsafeUtil.putByte(
buffer,
pos--, (
byte) ((
value & 0x7F) | 0x80));
1705 UnsafeUtil.putByte(
buffer,
pos--, (
byte) (((
value >>> 14) & 0x7F) | 0x80));
1706 UnsafeUtil.putByte(
buffer,
pos--, (
byte) (((
value >>> 7) & 0x7F) | 0x80));
1707 UnsafeUtil.putByte(
buffer,
pos--, (
byte) ((
value & 0x7F) | 0x80));
1712 UnsafeUtil.putByte(
buffer,
pos--, (
byte) (((
value >>> 21) & 0x7F) | 0x80));
1713 UnsafeUtil.putByte(
buffer,
pos--, (
byte) (((
value >>> 14) & 0x7F) | 0x80));
1714 UnsafeUtil.putByte(
buffer,
pos--, (
byte) (((
value >>> 7) & 0x7F) | 0x80));
1715 UnsafeUtil.putByte(
buffer,
pos--, (
byte) ((
value & 0x7F) | 0x80));
1719 void writeVarint64(
long value) {
1720 switch (computeUInt64SizeNoTag(
value)) {
1760 UnsafeUtil.putByte(
buffer,
pos--, (
byte) (((
int)
value & 0x7F) | 0x80));
1764 UnsafeUtil.putByte(
buffer,
pos--, (
byte) (((
int)
value) >>> 14));
1765 UnsafeUtil.putByte(
buffer,
pos--, (
byte) (((
value >>> 7) & 0x7F) | 0x80));
1766 UnsafeUtil.putByte(
buffer,
pos--, (
byte) ((
value & 0x7F) | 0x80));
1771 UnsafeUtil.putByte(
buffer,
pos--, (
byte) (((
value >>> 14) & 0x7F) | 0x80));
1772 UnsafeUtil.putByte(
buffer,
pos--, (
byte) (((
value >>> 7) & 0x7F) | 0x80));
1773 UnsafeUtil.putByte(
buffer,
pos--, (
byte) ((
value & 0x7F) | 0x80));
1778 UnsafeUtil.putByte(
buffer,
pos--, (
byte) (((
value >>> 21) & 0x7F) | 0x80));
1779 UnsafeUtil.putByte(
buffer,
pos--, (
byte) (((
value >>> 14) & 0x7F) | 0x80));
1780 UnsafeUtil.putByte(
buffer,
pos--, (
byte) (((
value >>> 7) & 0x7F) | 0x80));
1781 UnsafeUtil.putByte(
buffer,
pos--, (
byte) ((
value & 0x7F) | 0x80));
1786 UnsafeUtil.putByte(
buffer,
pos--, (
byte) (((
value >>> 28) & 0x7F) | 0x80));
1787 UnsafeUtil.putByte(
buffer,
pos--, (
byte) (((
value >>> 21) & 0x7F) | 0x80));
1788 UnsafeUtil.putByte(
buffer,
pos--, (
byte) (((
value >>> 14) & 0x7F) | 0x80));
1789 UnsafeUtil.putByte(
buffer,
pos--, (
byte) (((
value >>> 7) & 0x7F) | 0x80));
1790 UnsafeUtil.putByte(
buffer,
pos--, (
byte) ((
value & 0x7F) | 0x80));
1795 UnsafeUtil.putByte(
buffer,
pos--, (
byte) (((
value >>> 35) & 0x7F) | 0x80));
1796 UnsafeUtil.putByte(
buffer,
pos--, (
byte) (((
value >>> 28) & 0x7F) | 0x80));
1797 UnsafeUtil.putByte(
buffer,
pos--, (
byte) (((
value >>> 21) & 0x7F) | 0x80));
1798 UnsafeUtil.putByte(
buffer,
pos--, (
byte) (((
value >>> 14) & 0x7F) | 0x80));
1799 UnsafeUtil.putByte(
buffer,
pos--, (
byte) (((
value >>> 7) & 0x7F) | 0x80));
1800 UnsafeUtil.putByte(
buffer,
pos--, (
byte) ((
value & 0x7F) | 0x80));
1805 UnsafeUtil.putByte(
buffer,
pos--, (
byte) (((
value >>> 42) & 0x7F) | 0x80));
1806 UnsafeUtil.putByte(
buffer,
pos--, (
byte) (((
value >>> 35) & 0x7F) | 0x80));
1807 UnsafeUtil.putByte(
buffer,
pos--, (
byte) (((
value >>> 28) & 0x7F) | 0x80));
1808 UnsafeUtil.putByte(
buffer,
pos--, (
byte) (((
value >>> 21) & 0x7F) | 0x80));
1809 UnsafeUtil.putByte(
buffer,
pos--, (
byte) (((
value >>> 14) & 0x7F) | 0x80));
1810 UnsafeUtil.putByte(
buffer,
pos--, (
byte) (((
value >>> 7) & 0x7F) | 0x80));
1811 UnsafeUtil.putByte(
buffer,
pos--, (
byte) ((
value & 0x7F) | 0x80));
1816 UnsafeUtil.putByte(
buffer,
pos--, (
byte) (((
value >>> 49) & 0x7F) | 0x80));
1817 UnsafeUtil.putByte(
buffer,
pos--, (
byte) (((
value >>> 42) & 0x7F) | 0x80));
1818 UnsafeUtil.putByte(
buffer,
pos--, (
byte) (((
value >>> 35) & 0x7F) | 0x80));
1819 UnsafeUtil.putByte(
buffer,
pos--, (
byte) (((
value >>> 28) & 0x7F) | 0x80));
1820 UnsafeUtil.putByte(
buffer,
pos--, (
byte) (((
value >>> 21) & 0x7F) | 0x80));
1821 UnsafeUtil.putByte(
buffer,
pos--, (
byte) (((
value >>> 14) & 0x7F) | 0x80));
1822 UnsafeUtil.putByte(
buffer,
pos--, (
byte) (((
value >>> 7) & 0x7F) | 0x80));
1823 UnsafeUtil.putByte(
buffer,
pos--, (
byte) ((
value & 0x7F) | 0x80));
1828 UnsafeUtil.putByte(
buffer,
pos--, (
byte) (((
value >>> 56) & 0x7F) | 0x80));
1829 UnsafeUtil.putByte(
buffer,
pos--, (
byte) (((
value >>> 49) & 0x7F) | 0x80));
1830 UnsafeUtil.putByte(
buffer,
pos--, (
byte) (((
value >>> 42) & 0x7F) | 0x80));
1831 UnsafeUtil.putByte(
buffer,
pos--, (
byte) (((
value >>> 35) & 0x7F) | 0x80));
1832 UnsafeUtil.putByte(
buffer,
pos--, (
byte) (((
value >>> 28) & 0x7F) | 0x80));
1833 UnsafeUtil.putByte(
buffer,
pos--, (
byte) (((
value >>> 21) & 0x7F) | 0x80));
1834 UnsafeUtil.putByte(
buffer,
pos--, (
byte) (((
value >>> 14) & 0x7F) | 0x80));
1835 UnsafeUtil.putByte(
buffer,
pos--, (
byte) (((
value >>> 7) & 0x7F) | 0x80));
1836 UnsafeUtil.putByte(
buffer,
pos--, (
byte) ((
value & 0x7F) | 0x80));
1841 UnsafeUtil.putByte(
buffer,
pos--, (
byte) ((
value >> 24) & 0xFF));
1842 UnsafeUtil.putByte(
buffer,
pos--, (
byte) ((
value >> 16) & 0xFF));
1849 UnsafeUtil.putByte(
buffer,
pos--, (
byte) ((
int) (
value >> 56) & 0xFF));
1850 UnsafeUtil.putByte(
buffer,
pos--, (
byte) ((
int) (
value >> 48) & 0xFF));
1851 UnsafeUtil.putByte(
buffer,
pos--, (
byte) ((
int) (
value >> 40) & 0xFF));
1852 UnsafeUtil.putByte(
buffer,
pos--, (
byte) ((
int) (
value >> 32) & 0xFF));
1853 UnsafeUtil.putByte(
buffer,
pos--, (
byte) ((
int) (
value >> 24) & 0xFF));
1854 UnsafeUtil.putByte(
buffer,
pos--, (
byte) ((
int) (
value >> 16) & 0xFF));
1855 UnsafeUtil.putByte(
buffer,
pos--, (
byte) ((
int) (
value >> 8) & 0xFF));
1856 UnsafeUtil.putByte(
buffer,
pos--, (
byte) ((
int) (
value) & 0xFF));
1862 requireSpace(in.length());
1865 int i = in.length() - 1;
1870 for (
char c;
i >= 0 && (c = in.charAt(
i)) < 0x80;
i--) {
1871 UnsafeUtil.putByte(
buffer,
pos--, (
byte) c);
1877 for (
char c;
i >= 0;
i--) {
1880 UnsafeUtil.putByte(
buffer,
pos--, (
byte) c);
1881 }
else if (c < 0x800 && pos >
offset) {
1882 UnsafeUtil.putByte(
buffer,
pos--, (
byte) (0x80 | (0x3F & c)));
1883 UnsafeUtil.putByte(
buffer,
pos--, (
byte) ((0xF << 6) | (c >>> 6)));
1884 }
else if ((c < Character.MIN_SURROGATE || Character.MAX_SURROGATE < c)
1887 UnsafeUtil.putByte(
buffer,
pos--, (
byte) (0x80 | (0x3F & c)));
1888 UnsafeUtil.putByte(
buffer,
pos--, (
byte) (0x80 | (0x3F & (c >>> 6))));
1889 UnsafeUtil.putByte(
buffer,
pos--, (
byte) ((0xF << 5) | (c >>> 12)));
1894 if (
i == 0 || !Character.isSurrogatePair(high = in.charAt(
i - 1), c)) {
1895 throw new Utf8.UnpairedSurrogateException(
i - 1,
i);
1898 int codePoint = Character.toCodePoint(high, c);
1899 UnsafeUtil.putByte(
buffer,
pos--, (
byte) (0x80 | (0x3F & codePoint)));
1900 UnsafeUtil.putByte(
buffer,
pos--, (
byte) (0x80 | (0x3F & (codePoint >>> 6))));
1901 UnsafeUtil.putByte(
buffer,
pos--, (
byte) (0x80 | (0x3F & (codePoint >>> 12))));
1902 UnsafeUtil.putByte(
buffer,
pos--, (
byte) ((0xF << 4) | (codePoint >>> 18)));
1919 throw new ArrayIndexOutOfBoundsException(
1920 String.format(
"value.length=%d, offset=%d, length=%d",
value.length,
offset,
length));
1931 throw new ArrayIndexOutOfBoundsException(
1932 String.format(
"value.length=%d, offset=%d, length=%d",
value.length,
offset,
length));
1934 if (spaceLeft() <
length) {
1937 totalDoneBytes +=
length;
1962 if (spaceLeft() <
length) {
1965 totalDoneBytes +=
length;
1978 void requireSpace(
int size) {
1979 if (spaceLeft() <
size) {
1992 super(alloc, chunkSize);
2005 if (!allocatedBuffer.hasNioBuffer()) {
2006 throw new RuntimeException(
"Allocated buffer does not have NIO buffer");
2008 ByteBuffer nioBuffer = allocatedBuffer.nioBuffer();
2009 if (!nioBuffer.isDirect()) {
2010 throw new RuntimeException(
"Allocator returned non-direct buffer");
2013 finishCurrentBuffer();
2014 buffers.addFirst(allocatedBuffer);
2020 buffer.order(ByteOrder.LITTLE_ENDIAN);
2040 void finishCurrentBuffer() {
2053 requireSpace(MAX_VARINT32_SIZE * 2);
2054 writeVarint32(
value);
2060 requireSpace(MAX_VARINT32_SIZE + MAX_VARINT64_SIZE);
2067 requireSpace(MAX_VARINT32_SIZE * 2);
2074 requireSpace(MAX_VARINT32_SIZE + FIXED32_SIZE);
2081 requireSpace(MAX_VARINT32_SIZE + MAX_VARINT64_SIZE);
2082 writeVarint64(
value);
2088 requireSpace(MAX_VARINT32_SIZE + MAX_VARINT64_SIZE);
2095 requireSpace(MAX_VARINT32_SIZE + FIXED64_SIZE);
2102 requireSpace(MAX_VARINT32_SIZE + 1);
2112 requireSpace(2 * MAX_VARINT32_SIZE);
2120 value.writeToReverse(
this);
2121 }
catch (IOException e) {
2123 throw new RuntimeException(e);
2126 requireSpace(MAX_VARINT32_SIZE * 2);
2127 writeVarint32(
value.size());
2134 Protobuf.getInstance().writeTo(
value,
this);
2136 requireSpace(MAX_VARINT32_SIZE * 2);
2144 schema.writeTo(
value,
this);
2146 requireSpace(MAX_VARINT32_SIZE * 2);
2154 Protobuf.getInstance().writeTo(
value,
this);
2161 schema.writeTo(
value,
this);
2178 writeVarint32(
value);
2180 writeVarint64(
value);
2186 writeVarint32(CodedOutputStream.encodeZigZag32(
value));
2191 writeVarint64(CodedOutputStream.encodeZigZag64(
value));
2200 void writeTag(
int fieldNumber,
int wireType) {
2201 writeVarint32(WireFormat.makeTag(fieldNumber, wireType));
2205 void writeVarint32(
int value) {
2206 if ((
value & (~0 << 7)) == 0) {
2208 }
else if ((
value & (~0 << 14)) == 0) {
2210 }
else if ((
value & (~0 << 21)) == 0) {
2212 }
else if ((
value & (~0 << 28)) == 0) {
2226 buffer.putShort(
pos + 1, (
short) (((
value & (0x7F << 7)) << 1) | ((
value & 0x7F) | 0x80)));
2234 ((
value & (0x7F << 14)) << 10)
2235 | (((
value & (0x7F << 7)) | (0x80 << 7)) << 9)
2236 | ((
value & 0x7F) | 0x80) << 8);
2244 ((
value & (0x7F << 21)) << 3)
2245 | (((
value & (0x7F << 14)) | (0x80 << 14)) << 2)
2246 | (((
value & (0x7F << 7)) | (0x80 << 7)) << 1)
2247 | ((
value & 0x7F) | 0x80));
2256 ((((
value >>> 21) & 0x7F) | 0x80) << 24)
2257 | ((((
value >>> 14) & 0x7F) | 0x80) << 16)
2258 | ((((
value >>> 7) & 0x7F) | 0x80) << 8)
2259 | ((
value & 0x7F) | 0x80));
2263 void writeVarint64(
long value) {
2264 switch (computeUInt64SizeNoTag(
value)) {
2319 ((
value & (0x7FL << 28)) << 28)
2320 | (((
value & (0x7F << 21)) | (0x80 << 21)) << 27)
2321 | (((
value & (0x7F << 14)) | (0x80 << 14)) << 26)
2322 | (((
value & (0x7F << 7)) | (0x80 << 7)) << 25)
2323 | (((
value & 0x7F) | 0x80)) << 24);
2331 ((
value & (0x7FL << 35)) << 21)
2332 | (((
value & (0x7FL << 28)) | (0x80L << 28)) << 20)
2333 | (((
value & (0x7F << 21)) | (0x80 << 21)) << 19)
2334 | (((
value & (0x7F << 14)) | (0x80 << 14)) << 18)
2335 | (((
value & (0x7F << 7)) | (0x80 << 7)) << 17)
2336 | (((
value & 0x7F) | 0x80)) << 16);
2344 ((
value & (0x7FL << 42)) << 14)
2345 | (((
value & (0x7FL << 35)) | (0x80L << 35)) << 13)
2346 | (((
value & (0x7FL << 28)) | (0x80L << 28)) << 12)
2347 | (((
value & (0x7F << 21)) | (0x80 << 21)) << 11)
2348 | (((
value & (0x7F << 14)) | (0x80 << 14)) << 10)
2349 | (((
value & (0x7F << 7)) | (0x80 << 7)) << 9)
2350 | (((
value & 0x7F) | 0x80)) << 8);
2358 ((
value & (0x7FL << 49)) << 7)
2359 | (((
value & (0x7FL << 42)) | (0x80L << 42)) << 6)
2360 | (((
value & (0x7FL << 35)) | (0x80L << 35)) << 5)
2361 | (((
value & (0x7FL << 28)) | (0x80L << 28)) << 4)
2362 | (((
value & (0x7F << 21)) | (0x80 << 21)) << 3)
2363 | (((
value & (0x7F << 14)) | (0x80 << 14)) << 2)
2364 | (((
value & (0x7F << 7)) | (0x80 << 7)) << 1)
2365 | ((
value & 0x7F) | 0x80));
2373 (((
value & (0x7FL << 49)) | (0x80L << 49)) << 7)
2374 | (((
value & (0x7FL << 42)) | (0x80L << 42)) << 6)
2375 | (((
value & (0x7FL << 35)) | (0x80L << 35)) << 5)
2376 | (((
value & (0x7FL << 28)) | (0x80L << 28)) << 4)
2377 | (((
value & (0x7F << 21)) | (0x80 << 21)) << 3)
2378 | (((
value & (0x7F << 14)) | (0x80 << 14)) << 2)
2379 | (((
value & (0x7F << 7)) | (0x80 << 7)) << 1)
2380 | ((
value & 0x7F) | 0x80));
2409 requireSpace(in.length());
2412 int i = in.length() - 1;
2416 for (
char c;
i >= 0 && (c = in.charAt(
i)) < 0x80;
i--) {
2425 for (
char c;
i >= 0;
i--) {
2427 if (c < 0x80 && pos >= 0) {
2429 }
else if (c < 0x800 && pos > 0) {
2430 buffer.put(
pos--, (
byte) (0x80 | (0x3F & c)));
2431 buffer.put(
pos--, (
byte) ((0xF << 6) | (c >>> 6)));
2432 }
else if ((c < Character.MIN_SURROGATE || Character.MAX_SURROGATE < c) &&
pos > 1) {
2434 buffer.put(
pos--, (
byte) (0x80 | (0x3F & c)));
2435 buffer.put(
pos--, (
byte) (0x80 | (0x3F & (c >>> 6))));
2436 buffer.put(
pos--, (
byte) ((0xF << 5) | (c >>> 12)));
2437 }
else if (
pos > 2) {
2441 if (
i == 0 || !Character.isSurrogatePair(high = in.charAt(
i - 1), c)) {
2442 throw new Utf8.UnpairedSurrogateException(
i - 1,
i);
2445 int codePoint = Character.toCodePoint(high, c);
2446 buffer.put(
pos--, (
byte) (0x80 | (0x3F & codePoint)));
2447 buffer.put(
pos--, (
byte) (0x80 | (0x3F & (codePoint >>> 6))));
2448 buffer.put(
pos--, (
byte) (0x80 | (0x3F & (codePoint >>> 12))));
2449 buffer.put(
pos--, (
byte) ((0xF << 4) | (codePoint >>> 18)));
2479 totalDoneBytes +=
length;
2511 totalDoneBytes +=
length;
2526 void requireSpace(
int size) {
2541 super(alloc, chunkSize);
2547 return UnsafeUtil.hasUnsafeByteBufferOperations();
2559 if (!allocatedBuffer.hasNioBuffer()) {
2560 throw new RuntimeException(
"Allocated buffer does not have NIO buffer");
2562 ByteBuffer nioBuffer = allocatedBuffer.nioBuffer();
2563 if (!nioBuffer.isDirect()) {
2564 throw new RuntimeException(
"Allocator returned non-direct buffer");
2567 finishCurrentBuffer();
2568 buffers.addFirst(allocatedBuffer);
2593 void finishCurrentBuffer() {
2610 requireSpace(MAX_VARINT32_SIZE * 2);
2611 writeVarint32(
value);
2617 requireSpace(MAX_VARINT32_SIZE + MAX_VARINT64_SIZE);
2624 requireSpace(MAX_VARINT32_SIZE * 2);
2631 requireSpace(MAX_VARINT32_SIZE + FIXED32_SIZE);
2638 requireSpace(MAX_VARINT32_SIZE + MAX_VARINT64_SIZE);
2639 writeVarint64(
value);
2645 requireSpace(MAX_VARINT32_SIZE + MAX_VARINT64_SIZE);
2652 requireSpace(MAX_VARINT32_SIZE + FIXED64_SIZE);
2659 requireSpace(MAX_VARINT32_SIZE + 1);
2669 requireSpace(2 * MAX_VARINT32_SIZE);
2677 value.writeToReverse(
this);
2678 }
catch (IOException e) {
2680 throw new RuntimeException(e);
2683 requireSpace(MAX_VARINT32_SIZE * 2);
2684 writeVarint32(
value.size());
2691 Protobuf.getInstance().writeTo(
value,
this);
2693 requireSpace(MAX_VARINT32_SIZE * 2);
2701 schema.writeTo(
value,
this);
2703 requireSpace(MAX_VARINT32_SIZE * 2);
2711 Protobuf.getInstance().writeTo(
value,
this);
2718 schema.writeTo(
value,
this);
2735 writeVarint32(
value);
2737 writeVarint64(
value);
2743 writeVarint32(CodedOutputStream.encodeZigZag32(
value));
2748 writeVarint64(CodedOutputStream.encodeZigZag64(
value));
2757 void writeTag(
int fieldNumber,
int wireType) {
2758 writeVarint32(WireFormat.makeTag(fieldNumber, wireType));
2762 void writeVarint32(
int value) {
2763 if ((
value & (~0 << 7)) == 0) {
2765 }
else if ((
value & (~0 << 14)) == 0) {
2767 }
else if ((
value & (~0 << 21)) == 0) {
2769 }
else if ((
value & (~0 << 28)) == 0) {
2777 UnsafeUtil.putByte(
pos--, (
byte)
value);
2781 UnsafeUtil.putByte(
pos--, (
byte) (
value >>> 7));
2782 UnsafeUtil.putByte(
pos--, (
byte) ((
value & 0x7F) | 0x80));
2786 UnsafeUtil.putByte(
pos--, (
byte) (
value >>> 14));
2787 UnsafeUtil.putByte(
pos--, (
byte) (((
value >>> 7) & 0x7F) | 0x80));
2788 UnsafeUtil.putByte(
pos--, (
byte) ((
value & 0x7F) | 0x80));
2792 UnsafeUtil.putByte(
pos--, (
byte) (
value >>> 21));
2793 UnsafeUtil.putByte(
pos--, (
byte) (((
value >>> 14) & 0x7F) | 0x80));
2794 UnsafeUtil.putByte(
pos--, (
byte) (((
value >>> 7) & 0x7F) | 0x80));
2795 UnsafeUtil.putByte(
pos--, (
byte) ((
value & 0x7F) | 0x80));
2799 UnsafeUtil.putByte(
pos--, (
byte) (
value >>> 28));
2800 UnsafeUtil.putByte(
pos--, (
byte) (((
value >>> 21) & 0x7F) | 0x80));
2801 UnsafeUtil.putByte(
pos--, (
byte) (((
value >>> 14) & 0x7F) | 0x80));
2802 UnsafeUtil.putByte(
pos--, (
byte) (((
value >>> 7) & 0x7F) | 0x80));
2803 UnsafeUtil.putByte(
pos--, (
byte) ((
value & 0x7F) | 0x80));
2807 void writeVarint64(
long value) {
2808 switch (computeUInt64SizeNoTag(
value)) {
2843 UnsafeUtil.putByte(
pos--, (
byte)
value);
2847 UnsafeUtil.putByte(
pos--, (
byte) (
value >>> 7));
2848 UnsafeUtil.putByte(
pos--, (
byte) (((
int)
value & 0x7F) | 0x80));
2852 UnsafeUtil.putByte(
pos--, (
byte) (((
int)
value) >>> 14));
2853 UnsafeUtil.putByte(
pos--, (
byte) (((
value >>> 7) & 0x7F) | 0x80));
2854 UnsafeUtil.putByte(
pos--, (
byte) ((
value & 0x7F) | 0x80));
2858 UnsafeUtil.putByte(
pos--, (
byte) (
value >>> 21));
2859 UnsafeUtil.putByte(
pos--, (
byte) (((
value >>> 14) & 0x7F) | 0x80));
2860 UnsafeUtil.putByte(
pos--, (
byte) (((
value >>> 7) & 0x7F) | 0x80));
2861 UnsafeUtil.putByte(
pos--, (
byte) ((
value & 0x7F) | 0x80));
2865 UnsafeUtil.putByte(
pos--, (
byte) (
value >>> 28));
2866 UnsafeUtil.putByte(
pos--, (
byte) (((
value >>> 21) & 0x7F) | 0x80));
2867 UnsafeUtil.putByte(
pos--, (
byte) (((
value >>> 14) & 0x7F) | 0x80));
2868 UnsafeUtil.putByte(
pos--, (
byte) (((
value >>> 7) & 0x7F) | 0x80));
2869 UnsafeUtil.putByte(
pos--, (
byte) ((
value & 0x7F) | 0x80));
2873 UnsafeUtil.putByte(
pos--, (
byte) (
value >>> 35));
2874 UnsafeUtil.putByte(
pos--, (
byte) (((
value >>> 28) & 0x7F) | 0x80));
2875 UnsafeUtil.putByte(
pos--, (
byte) (((
value >>> 21) & 0x7F) | 0x80));
2876 UnsafeUtil.putByte(
pos--, (
byte) (((
value >>> 14) & 0x7F) | 0x80));
2877 UnsafeUtil.putByte(
pos--, (
byte) (((
value >>> 7) & 0x7F) | 0x80));
2878 UnsafeUtil.putByte(
pos--, (
byte) ((
value & 0x7F) | 0x80));
2882 UnsafeUtil.putByte(
pos--, (
byte) (
value >>> 42));
2883 UnsafeUtil.putByte(
pos--, (
byte) (((
value >>> 35) & 0x7F) | 0x80));
2884 UnsafeUtil.putByte(
pos--, (
byte) (((
value >>> 28) & 0x7F) | 0x80));
2885 UnsafeUtil.putByte(
pos--, (
byte) (((
value >>> 21) & 0x7F) | 0x80));
2886 UnsafeUtil.putByte(
pos--, (
byte) (((
value >>> 14) & 0x7F) | 0x80));
2887 UnsafeUtil.putByte(
pos--, (
byte) (((
value >>> 7) & 0x7F) | 0x80));
2888 UnsafeUtil.putByte(
pos--, (
byte) ((
value & 0x7F) | 0x80));
2892 UnsafeUtil.putByte(
pos--, (
byte) (
value >>> 49));
2893 UnsafeUtil.putByte(
pos--, (
byte) (((
value >>> 42) & 0x7F) | 0x80));
2894 UnsafeUtil.putByte(
pos--, (
byte) (((
value >>> 35) & 0x7F) | 0x80));
2895 UnsafeUtil.putByte(
pos--, (
byte) (((
value >>> 28) & 0x7F) | 0x80));
2896 UnsafeUtil.putByte(
pos--, (
byte) (((
value >>> 21) & 0x7F) | 0x80));
2897 UnsafeUtil.putByte(
pos--, (
byte) (((
value >>> 14) & 0x7F) | 0x80));
2898 UnsafeUtil.putByte(
pos--, (
byte) (((
value >>> 7) & 0x7F) | 0x80));
2899 UnsafeUtil.putByte(
pos--, (
byte) ((
value & 0x7F) | 0x80));
2903 UnsafeUtil.putByte(
pos--, (
byte) (
value >>> 56));
2904 UnsafeUtil.putByte(
pos--, (
byte) (((
value >>> 49) & 0x7F) | 0x80));
2905 UnsafeUtil.putByte(
pos--, (
byte) (((
value >>> 42) & 0x7F) | 0x80));
2906 UnsafeUtil.putByte(
pos--, (
byte) (((
value >>> 35) & 0x7F) | 0x80));
2907 UnsafeUtil.putByte(
pos--, (
byte) (((
value >>> 28) & 0x7F) | 0x80));
2908 UnsafeUtil.putByte(
pos--, (
byte) (((
value >>> 21) & 0x7F) | 0x80));
2909 UnsafeUtil.putByte(
pos--, (
byte) (((
value >>> 14) & 0x7F) | 0x80));
2910 UnsafeUtil.putByte(
pos--, (
byte) (((
value >>> 7) & 0x7F) | 0x80));
2911 UnsafeUtil.putByte(
pos--, (
byte) ((
value & 0x7F) | 0x80));
2915 UnsafeUtil.putByte(
pos--, (
byte) (
value >>> 63));
2916 UnsafeUtil.putByte(
pos--, (
byte) (((
value >>> 56) & 0x7F) | 0x80));
2917 UnsafeUtil.putByte(
pos--, (
byte) (((
value >>> 49) & 0x7F) | 0x80));
2918 UnsafeUtil.putByte(
pos--, (
byte) (((
value >>> 42) & 0x7F) | 0x80));
2919 UnsafeUtil.putByte(
pos--, (
byte) (((
value >>> 35) & 0x7F) | 0x80));
2920 UnsafeUtil.putByte(
pos--, (
byte) (((
value >>> 28) & 0x7F) | 0x80));
2921 UnsafeUtil.putByte(
pos--, (
byte) (((
value >>> 21) & 0x7F) | 0x80));
2922 UnsafeUtil.putByte(
pos--, (
byte) (((
value >>> 14) & 0x7F) | 0x80));
2923 UnsafeUtil.putByte(
pos--, (
byte) (((
value >>> 7) & 0x7F) | 0x80));
2924 UnsafeUtil.putByte(
pos--, (
byte) ((
value & 0x7F) | 0x80));
2929 UnsafeUtil.putByte(
pos--, (
byte) ((
value >> 24) & 0xFF));
2930 UnsafeUtil.putByte(
pos--, (
byte) ((
value >> 16) & 0xFF));
2931 UnsafeUtil.putByte(
pos--, (
byte) ((
value >> 8) & 0xFF));
2932 UnsafeUtil.putByte(
pos--, (
byte) (
value & 0xFF));
2937 UnsafeUtil.putByte(
pos--, (
byte) ((
int) (
value >> 56) & 0xFF));
2938 UnsafeUtil.putByte(
pos--, (
byte) ((
int) (
value >> 48) & 0xFF));
2939 UnsafeUtil.putByte(
pos--, (
byte) ((
int) (
value >> 40) & 0xFF));
2940 UnsafeUtil.putByte(
pos--, (
byte) ((
int) (
value >> 32) & 0xFF));
2941 UnsafeUtil.putByte(
pos--, (
byte) ((
int) (
value >> 24) & 0xFF));
2942 UnsafeUtil.putByte(
pos--, (
byte) ((
int) (
value >> 16) & 0xFF));
2943 UnsafeUtil.putByte(
pos--, (
byte) ((
int) (
value >> 8) & 0xFF));
2944 UnsafeUtil.putByte(
pos--, (
byte) ((
int) (
value) & 0xFF));
2950 requireSpace(in.length());
2953 int i = in.length() - 1;
2956 for (
char c;
i >= 0 && (c = in.charAt(
i)) < 0x80;
i--) {
2957 UnsafeUtil.putByte(
pos--, (
byte) c);
2963 for (
char c;
i >= 0;
i--) {
2966 UnsafeUtil.putByte(
pos--, (
byte) c);
2968 UnsafeUtil.putByte(
pos--, (
byte) (0x80 | (0x3F & c)));
2969 UnsafeUtil.putByte(
pos--, (
byte) ((0xF << 6) | (c >>> 6)));
2970 }
else if ((c < Character.MIN_SURROGATE || Character.MAX_SURROGATE < c)
2973 UnsafeUtil.putByte(
pos--, (
byte) (0x80 | (0x3F & c)));
2974 UnsafeUtil.putByte(
pos--, (
byte) (0x80 | (0x3F & (c >>> 6))));
2975 UnsafeUtil.putByte(
pos--, (
byte) ((0xF << 5) | (c >>> 12)));
2980 if (
i == 0 || !Character.isSurrogatePair(high = in.charAt(
i - 1), c)) {
2981 throw new Utf8.UnpairedSurrogateException(
i - 1,
i);
2984 int codePoint = Character.toCodePoint(high, c);
2985 UnsafeUtil.putByte(
pos--, (
byte) (0x80 | (0x3F & codePoint)));
2986 UnsafeUtil.putByte(
pos--, (
byte) (0x80 | (0x3F & (codePoint >>> 6))));
2987 UnsafeUtil.putByte(
pos--, (
byte) (0x80 | (0x3F & (codePoint >>> 12))));
2988 UnsafeUtil.putByte(
pos--, (
byte) ((0xF << 4) | (codePoint >>> 18)));
3018 totalDoneBytes +=
length;
3050 totalDoneBytes +=
length;
3065 void requireSpace(
int size) {