Avoid boxing when serializing primitive lists in CodedOutputStreamWriter
[google-protobuf.git] / java / core / src / main / java / com / google / protobuf / CodedOutputStreamWriter.java
blob5368f5dede3ab6068b8cfe771e2369d34e9c934d
1 // Protocol Buffers - Google's data interchange format
2 // Copyright 2008 Google Inc. All rights reserved.
3 //
4 // Use of this source code is governed by a BSD-style
5 // license that can be found in the LICENSE file or at
6 // https://developers.google.com/open-source/licenses/bsd
8 package com.google.protobuf;
10 import static com.google.protobuf.Internal.checkNotNull;
11 import static com.google.protobuf.WireFormat.WIRETYPE_LENGTH_DELIMITED;
13 import java.io.IOException;
14 import java.util.Arrays;
15 import java.util.List;
16 import java.util.Map;
18 /** An adapter between the {@link Writer} interface and {@link CodedOutputStream}. */
19 @CheckReturnValue
20 @ExperimentalApi
21 final class CodedOutputStreamWriter implements Writer {
22 private final CodedOutputStream output;
24 public static CodedOutputStreamWriter forCodedOutput(CodedOutputStream output) {
25 if (output.wrapper != null) {
26 return output.wrapper;
28 return new CodedOutputStreamWriter(output);
31 private CodedOutputStreamWriter(CodedOutputStream output) {
32 this.output = checkNotNull(output, "output");
33 this.output.wrapper = this;
36 @Override
37 public FieldOrder fieldOrder() {
38 return FieldOrder.ASCENDING;
41 public int getTotalBytesWritten() {
42 return output.getTotalBytesWritten();
45 @Override
46 public void writeSFixed32(int fieldNumber, int value) throws IOException {
47 output.writeSFixed32(fieldNumber, value);
50 @Override
51 public void writeInt64(int fieldNumber, long value) throws IOException {
52 output.writeInt64(fieldNumber, value);
55 @Override
56 public void writeSFixed64(int fieldNumber, long value) throws IOException {
57 output.writeSFixed64(fieldNumber, value);
60 @Override
61 public void writeFloat(int fieldNumber, float value) throws IOException {
62 output.writeFloat(fieldNumber, value);
65 @Override
66 public void writeDouble(int fieldNumber, double value) throws IOException {
67 output.writeDouble(fieldNumber, value);
70 @Override
71 public void writeEnum(int fieldNumber, int value) throws IOException {
72 output.writeEnum(fieldNumber, value);
75 @Override
76 public void writeUInt64(int fieldNumber, long value) throws IOException {
77 output.writeUInt64(fieldNumber, value);
80 @Override
81 public void writeInt32(int fieldNumber, int value) throws IOException {
82 output.writeInt32(fieldNumber, value);
85 @Override
86 public void writeFixed64(int fieldNumber, long value) throws IOException {
87 output.writeFixed64(fieldNumber, value);
90 @Override
91 public void writeFixed32(int fieldNumber, int value) throws IOException {
92 output.writeFixed32(fieldNumber, value);
95 @Override
96 public void writeBool(int fieldNumber, boolean value) throws IOException {
97 output.writeBool(fieldNumber, value);
100 @Override
101 public void writeString(int fieldNumber, String value) throws IOException {
102 output.writeString(fieldNumber, value);
105 @Override
106 public void writeBytes(int fieldNumber, ByteString value) throws IOException {
107 output.writeBytes(fieldNumber, value);
110 @Override
111 public void writeUInt32(int fieldNumber, int value) throws IOException {
112 output.writeUInt32(fieldNumber, value);
115 @Override
116 public void writeSInt32(int fieldNumber, int value) throws IOException {
117 output.writeSInt32(fieldNumber, value);
120 @Override
121 public void writeSInt64(int fieldNumber, long value) throws IOException {
122 output.writeSInt64(fieldNumber, value);
125 @Override
126 public void writeMessage(int fieldNumber, Object value) throws IOException {
127 output.writeMessage(fieldNumber, (MessageLite) value);
130 @Override
131 public void writeMessage(int fieldNumber, Object value, Schema schema) throws IOException {
132 output.writeMessage(fieldNumber, (MessageLite) value, schema);
135 @Deprecated
136 @Override
137 public void writeGroup(int fieldNumber, Object value) throws IOException {
138 output.writeGroup(fieldNumber, (MessageLite) value);
141 @Override
142 public void writeGroup(int fieldNumber, Object value, Schema schema) throws IOException {
143 output.writeGroup(fieldNumber, (MessageLite) value, schema);
146 @Deprecated
147 @Override
148 public void writeStartGroup(int fieldNumber) throws IOException {
149 output.writeTag(fieldNumber, WireFormat.WIRETYPE_START_GROUP);
152 @Deprecated
153 @Override
154 public void writeEndGroup(int fieldNumber) throws IOException {
155 output.writeTag(fieldNumber, WireFormat.WIRETYPE_END_GROUP);
158 @Override
159 public final void writeMessageSetItem(int fieldNumber, Object value) throws IOException {
160 if (value instanceof ByteString) {
161 output.writeRawMessageSetExtension(fieldNumber, (ByteString) value);
162 } else {
163 output.writeMessageSetExtension(fieldNumber, (MessageLite) value);
167 @Override
168 public void writeInt32List(int fieldNumber, List<Integer> value, boolean packed)
169 throws IOException {
170 if (value instanceof IntArrayList) {
171 writeInt32ListInternal(fieldNumber, (IntArrayList) value, packed);
172 } else {
173 writeInt32ListInternal(fieldNumber, value, packed);
177 private void writeInt32ListInternal(int fieldNumber, IntArrayList value, boolean packed)
178 throws IOException {
179 if (packed) {
180 output.writeTag(fieldNumber, WIRETYPE_LENGTH_DELIMITED);
182 // Compute and write the length of the data.
183 int dataSize = 0;
184 for (int i = 0; i < value.size(); ++i) {
185 dataSize += CodedOutputStream.computeInt32SizeNoTag(value.getInt(i));
187 output.writeUInt32NoTag(dataSize);
189 // Write the data itself, without any tags.
190 for (int i = 0; i < value.size(); ++i) {
191 output.writeInt32NoTag(value.getInt(i));
193 } else {
194 for (int i = 0; i < value.size(); ++i) {
195 output.writeInt32(fieldNumber, value.getInt(i));
200 private void writeInt32ListInternal(int fieldNumber, List<Integer> value, boolean packed)
201 throws IOException {
202 if (packed) {
203 output.writeTag(fieldNumber, WIRETYPE_LENGTH_DELIMITED);
205 // Compute and write the length of the data.
206 int dataSize = 0;
207 for (int i = 0; i < value.size(); ++i) {
208 dataSize += CodedOutputStream.computeInt32SizeNoTag(value.get(i));
210 output.writeUInt32NoTag(dataSize);
212 // Write the data itself, without any tags.
213 for (int i = 0; i < value.size(); ++i) {
214 output.writeInt32NoTag(value.get(i));
216 } else {
217 for (int i = 0; i < value.size(); ++i) {
218 output.writeInt32(fieldNumber, value.get(i));
223 @Override
224 public void writeFixed32List(int fieldNumber, List<Integer> value, boolean packed)
225 throws IOException {
226 if (value instanceof IntArrayList) {
227 writeFixed32ListInternal(fieldNumber, (IntArrayList) value, packed);
228 } else {
229 writeFixed32ListInternal(fieldNumber, value, packed);
233 private void writeFixed32ListInternal(int fieldNumber, IntArrayList value, boolean packed)
234 throws IOException {
235 if (packed) {
236 output.writeTag(fieldNumber, WIRETYPE_LENGTH_DELIMITED);
238 // Compute and write the length of the data.
239 int dataSize = 0;
240 for (int i = 0; i < value.size(); ++i) {
241 dataSize += CodedOutputStream.computeFixed32SizeNoTag(value.getInt(i));
243 output.writeUInt32NoTag(dataSize);
245 // Write the data itself, without any tags.
246 for (int i = 0; i < value.size(); ++i) {
247 output.writeFixed32NoTag(value.getInt(i));
249 } else {
250 for (int i = 0; i < value.size(); ++i) {
251 output.writeFixed32(fieldNumber, value.getInt(i));
256 private void writeFixed32ListInternal(int fieldNumber, List<Integer> value, boolean packed)
257 throws IOException {
258 if (packed) {
259 output.writeTag(fieldNumber, WIRETYPE_LENGTH_DELIMITED);
261 // Compute and write the length of the data.
262 int dataSize = 0;
263 for (int i = 0; i < value.size(); ++i) {
264 dataSize += CodedOutputStream.computeFixed32SizeNoTag(value.get(i));
266 output.writeUInt32NoTag(dataSize);
268 // Write the data itself, without any tags.
269 for (int i = 0; i < value.size(); ++i) {
270 output.writeFixed32NoTag(value.get(i));
272 } else {
273 for (int i = 0; i < value.size(); ++i) {
274 output.writeFixed32(fieldNumber, value.get(i));
279 @Override
280 public void writeInt64List(int fieldNumber, List<Long> value, boolean packed) throws IOException {
281 if (value instanceof LongArrayList) {
282 writeInt64ListInternal(fieldNumber, (LongArrayList) value, packed);
283 } else {
284 writeInt64ListInternal(fieldNumber, value, packed);
288 private void writeInt64ListInternal(int fieldNumber, LongArrayList value, boolean packed)
289 throws IOException {
290 if (packed) {
291 output.writeTag(fieldNumber, WIRETYPE_LENGTH_DELIMITED);
293 // Compute and write the length of the data.
294 int dataSize = 0;
295 for (int i = 0; i < value.size(); ++i) {
296 dataSize += CodedOutputStream.computeInt64SizeNoTag(value.getLong(i));
298 output.writeUInt32NoTag(dataSize);
300 // Write the data itself, without any tags.
301 for (int i = 0; i < value.size(); ++i) {
302 output.writeInt64NoTag(value.getLong(i));
304 } else {
305 for (int i = 0; i < value.size(); ++i) {
306 output.writeInt64(fieldNumber, value.getLong(i));
311 private void writeInt64ListInternal(int fieldNumber, List<Long> value, boolean packed)
312 throws IOException {
313 if (packed) {
314 output.writeTag(fieldNumber, WIRETYPE_LENGTH_DELIMITED);
316 // Compute and write the length of the data.
317 int dataSize = 0;
318 for (int i = 0; i < value.size(); ++i) {
319 dataSize += CodedOutputStream.computeInt64SizeNoTag(value.get(i));
321 output.writeUInt32NoTag(dataSize);
323 // Write the data itself, without any tags.
324 for (int i = 0; i < value.size(); ++i) {
325 output.writeInt64NoTag(value.get(i));
327 } else {
328 for (int i = 0; i < value.size(); ++i) {
329 output.writeInt64(fieldNumber, value.get(i));
333 @Override
334 public void writeUInt64List(int fieldNumber, List<Long> value, boolean packed)
335 throws IOException {
336 if (value instanceof LongArrayList) {
337 writeUInt64ListInternal(fieldNumber, (LongArrayList) value, packed);
338 } else {
339 writeUInt64ListInternal(fieldNumber, value, packed);
343 private void writeUInt64ListInternal(int fieldNumber, LongArrayList value, boolean packed)
344 throws IOException {
345 if (packed) {
346 output.writeTag(fieldNumber, WIRETYPE_LENGTH_DELIMITED);
348 // Compute and write the length of the data.
349 int dataSize = 0;
350 for (int i = 0; i < value.size(); ++i) {
351 dataSize += CodedOutputStream.computeUInt64SizeNoTag(value.getLong(i));
353 output.writeUInt32NoTag(dataSize);
355 // Write the data itself, without any tags.
356 for (int i = 0; i < value.size(); ++i) {
357 output.writeUInt64NoTag(value.getLong(i));
359 } else {
360 for (int i = 0; i < value.size(); ++i) {
361 output.writeUInt64(fieldNumber, value.getLong(i));
366 private void writeUInt64ListInternal(int fieldNumber, List<Long> value, boolean packed)
367 throws IOException {
368 if (packed) {
369 output.writeTag(fieldNumber, WIRETYPE_LENGTH_DELIMITED);
371 // Compute and write the length of the data.
372 int dataSize = 0;
373 for (int i = 0; i < value.size(); ++i) {
374 dataSize += CodedOutputStream.computeUInt64SizeNoTag(value.get(i));
376 output.writeUInt32NoTag(dataSize);
378 // Write the data itself, without any tags.
379 for (int i = 0; i < value.size(); ++i) {
380 output.writeUInt64NoTag(value.get(i));
382 } else {
383 for (int i = 0; i < value.size(); ++i) {
384 output.writeUInt64(fieldNumber, value.get(i));
389 @Override
390 public void writeFixed64List(int fieldNumber, List<Long> value, boolean packed)
391 throws IOException {
392 if (value instanceof LongArrayList) {
393 writeFixed64ListInternal(fieldNumber, (LongArrayList) value, packed);
394 } else {
395 writeFixed64ListInternal(fieldNumber, value, packed);
399 private void writeFixed64ListInternal(int fieldNumber, LongArrayList value, boolean packed)
400 throws IOException {
401 if (packed) {
402 output.writeTag(fieldNumber, WIRETYPE_LENGTH_DELIMITED);
404 // Compute and write the length of the data.
405 int dataSize = 0;
406 for (int i = 0; i < value.size(); ++i) {
407 dataSize += CodedOutputStream.computeFixed64SizeNoTag(value.getLong(i));
409 output.writeUInt32NoTag(dataSize);
411 // Write the data itself, without any tags.
412 for (int i = 0; i < value.size(); ++i) {
413 output.writeFixed64NoTag(value.getLong(i));
415 } else {
416 for (int i = 0; i < value.size(); ++i) {
417 output.writeFixed64(fieldNumber, value.getLong(i));
422 private void writeFixed64ListInternal(int fieldNumber, List<Long> value, boolean packed)
423 throws IOException {
424 if (packed) {
425 output.writeTag(fieldNumber, WIRETYPE_LENGTH_DELIMITED);
427 // Compute and write the length of the data.
428 int dataSize = 0;
429 for (int i = 0; i < value.size(); ++i) {
430 dataSize += CodedOutputStream.computeFixed64SizeNoTag(value.get(i));
432 output.writeUInt32NoTag(dataSize);
434 // Write the data itself, without any tags.
435 for (int i = 0; i < value.size(); ++i) {
436 output.writeFixed64NoTag(value.get(i));
438 } else {
439 for (int i = 0; i < value.size(); ++i) {
440 output.writeFixed64(fieldNumber, value.get(i));
445 @Override
446 public void writeFloatList(int fieldNumber, List<Float> value, boolean packed)
447 throws IOException {
448 if (value instanceof FloatArrayList) {
449 writeFloatListInternal(fieldNumber, (FloatArrayList) value, packed);
450 } else {
451 writeFloatListInternal(fieldNumber, value, packed);
455 private void writeFloatListInternal(int fieldNumber, FloatArrayList value, boolean packed)
456 throws IOException {
457 if (packed) {
458 output.writeTag(fieldNumber, WIRETYPE_LENGTH_DELIMITED);
460 // Compute and write the length of the data.
461 int dataSize = 0;
462 for (int i = 0; i < value.size(); ++i) {
463 dataSize += CodedOutputStream.computeFloatSizeNoTag(value.getFloat(i));
465 output.writeUInt32NoTag(dataSize);
467 // Write the data itself, without any tags.
468 for (int i = 0; i < value.size(); ++i) {
469 output.writeFloatNoTag(value.getFloat(i));
471 } else {
472 for (int i = 0; i < value.size(); ++i) {
473 output.writeFloat(fieldNumber, value.getFloat(i));
478 private void writeFloatListInternal(int fieldNumber, List<Float> value, boolean packed)
479 throws IOException {
480 if (packed) {
481 output.writeTag(fieldNumber, WIRETYPE_LENGTH_DELIMITED);
483 // Compute and write the length of the data.
484 int dataSize = 0;
485 for (int i = 0; i < value.size(); ++i) {
486 dataSize += CodedOutputStream.computeFloatSizeNoTag(value.get(i));
488 output.writeUInt32NoTag(dataSize);
490 // Write the data itself, without any tags.
491 for (int i = 0; i < value.size(); ++i) {
492 output.writeFloatNoTag(value.get(i));
494 } else {
495 for (int i = 0; i < value.size(); ++i) {
496 output.writeFloat(fieldNumber, value.get(i));
501 @Override
502 public void writeDoubleList(int fieldNumber, List<Double> value, boolean packed)
503 throws IOException {
504 if (value instanceof DoubleArrayList) {
505 writeDoubleListInternal(fieldNumber, (DoubleArrayList) value, packed);
506 } else {
507 writeDoubleListInternal(fieldNumber, value, packed);
511 private void writeDoubleListInternal(int fieldNumber, DoubleArrayList value, boolean packed)
512 throws IOException {
513 if (packed) {
514 output.writeTag(fieldNumber, WIRETYPE_LENGTH_DELIMITED);
516 // Compute and write the length of the data.
517 int dataSize = 0;
518 for (int i = 0; i < value.size(); ++i) {
519 dataSize += CodedOutputStream.computeDoubleSizeNoTag(value.getDouble(i));
521 output.writeUInt32NoTag(dataSize);
523 // Write the data itself, without any tags.
524 for (int i = 0; i < value.size(); ++i) {
525 output.writeDoubleNoTag(value.getDouble(i));
527 } else {
528 for (int i = 0; i < value.size(); ++i) {
529 output.writeDouble(fieldNumber, value.getDouble(i));
534 private void writeDoubleListInternal(int fieldNumber, List<Double> value, boolean packed)
535 throws IOException {
536 if (packed) {
537 output.writeTag(fieldNumber, WIRETYPE_LENGTH_DELIMITED);
539 // Compute and write the length of the data.
540 int dataSize = 0;
541 for (int i = 0; i < value.size(); ++i) {
542 dataSize += CodedOutputStream.computeDoubleSizeNoTag(value.get(i));
544 output.writeUInt32NoTag(dataSize);
546 // Write the data itself, without any tags.
547 for (int i = 0; i < value.size(); ++i) {
548 output.writeDoubleNoTag(value.get(i));
550 } else {
551 for (int i = 0; i < value.size(); ++i) {
552 output.writeDouble(fieldNumber, value.get(i));
557 @Override
558 public void writeEnumList(int fieldNumber, List<Integer> value, boolean packed)
559 throws IOException {
560 if (packed) {
561 output.writeTag(fieldNumber, WIRETYPE_LENGTH_DELIMITED);
563 // Compute and write the length of the data.
564 int dataSize = 0;
565 for (int i = 0; i < value.size(); ++i) {
566 dataSize += CodedOutputStream.computeEnumSizeNoTag(value.get(i));
568 output.writeUInt32NoTag(dataSize);
570 // Write the data itself, without any tags.
571 for (int i = 0; i < value.size(); ++i) {
572 output.writeEnumNoTag(value.get(i));
574 } else {
575 for (int i = 0; i < value.size(); ++i) {
576 output.writeEnum(fieldNumber, value.get(i));
581 @Override
582 public void writeBoolList(int fieldNumber, List<Boolean> value, boolean packed)
583 throws IOException {
584 if (value instanceof BooleanArrayList) {
585 writeBoolListInternal(fieldNumber, (BooleanArrayList) value, packed);
586 } else {
587 writeBoolListInternal(fieldNumber, value, packed);
591 private void writeBoolListInternal(int fieldNumber, BooleanArrayList value, boolean packed)
592 throws IOException {
593 if (packed) {
594 output.writeTag(fieldNumber, WIRETYPE_LENGTH_DELIMITED);
596 // Compute and write the length of the data.
597 int dataSize = 0;
598 for (int i = 0; i < value.size(); ++i) {
599 dataSize += CodedOutputStream.computeBoolSizeNoTag(value.getBoolean(i));
601 output.writeUInt32NoTag(dataSize);
603 // Write the data itself, without any tags.
604 for (int i = 0; i < value.size(); ++i) {
605 output.writeBoolNoTag(value.getBoolean(i));
607 } else {
608 for (int i = 0; i < value.size(); ++i) {
609 output.writeBool(fieldNumber, value.getBoolean(i));
614 private void writeBoolListInternal(int fieldNumber, List<Boolean> value, boolean packed)
615 throws IOException {
616 if (packed) {
617 output.writeTag(fieldNumber, WIRETYPE_LENGTH_DELIMITED);
619 // Compute and write the length of the data.
620 int dataSize = 0;
621 for (int i = 0; i < value.size(); ++i) {
622 dataSize += CodedOutputStream.computeBoolSizeNoTag(value.get(i));
624 output.writeUInt32NoTag(dataSize);
626 // Write the data itself, without any tags.
627 for (int i = 0; i < value.size(); ++i) {
628 output.writeBoolNoTag(value.get(i));
630 } else {
631 for (int i = 0; i < value.size(); ++i) {
632 output.writeBool(fieldNumber, value.get(i));
637 @Override
638 public void writeStringList(int fieldNumber, List<String> value) throws IOException {
639 if (value instanceof LazyStringList) {
640 final LazyStringList lazyList = (LazyStringList) value;
641 for (int i = 0; i < value.size(); ++i) {
642 writeLazyString(fieldNumber, lazyList.getRaw(i));
644 } else {
645 for (int i = 0; i < value.size(); ++i) {
646 output.writeString(fieldNumber, value.get(i));
651 private void writeLazyString(int fieldNumber, Object value) throws IOException {
652 if (value instanceof String) {
653 output.writeString(fieldNumber, (String) value);
654 } else {
655 output.writeBytes(fieldNumber, (ByteString) value);
659 @Override
660 public void writeBytesList(int fieldNumber, List<ByteString> value) throws IOException {
661 for (int i = 0; i < value.size(); ++i) {
662 output.writeBytes(fieldNumber, value.get(i));
666 @Override
667 public void writeUInt32List(int fieldNumber, List<Integer> value, boolean packed)
668 throws IOException {
669 if (value instanceof IntArrayList) {
670 writeUInt32ListInternal(fieldNumber, (IntArrayList) value, packed);
671 } else {
672 writeUInt32ListInternal(fieldNumber, value, packed);
676 private void writeUInt32ListInternal(int fieldNumber, IntArrayList value, boolean packed)
677 throws IOException {
678 if (packed) {
679 output.writeTag(fieldNumber, WIRETYPE_LENGTH_DELIMITED);
681 // Compute and write the length of the data.
682 int dataSize = 0;
683 for (int i = 0; i < value.size(); ++i) {
684 dataSize += CodedOutputStream.computeUInt32SizeNoTag(value.getInt(i));
686 output.writeUInt32NoTag(dataSize);
688 // Write the data itself, without any tags.
689 for (int i = 0; i < value.size(); ++i) {
690 output.writeUInt32NoTag(value.getInt(i));
692 } else {
693 for (int i = 0; i < value.size(); ++i) {
694 output.writeUInt32(fieldNumber, value.getInt(i));
699 public void writeUInt32ListInternal(int fieldNumber, List<Integer> value, boolean packed)
700 throws IOException {
701 if (packed) {
702 output.writeTag(fieldNumber, WIRETYPE_LENGTH_DELIMITED);
704 // Compute and write the length of the data.
705 int dataSize = 0;
706 for (int i = 0; i < value.size(); ++i) {
707 dataSize += CodedOutputStream.computeUInt32SizeNoTag(value.get(i));
709 output.writeUInt32NoTag(dataSize);
711 // Write the data itself, without any tags.
712 for (int i = 0; i < value.size(); ++i) {
713 output.writeUInt32NoTag(value.get(i));
715 } else {
716 for (int i = 0; i < value.size(); ++i) {
717 output.writeUInt32(fieldNumber, value.get(i));
722 @Override
723 public void writeSFixed32List(int fieldNumber, List<Integer> value, boolean packed)
724 throws IOException {
725 if (value instanceof IntArrayList) {
726 writeSFixed32ListInternal(fieldNumber, (IntArrayList) value, packed);
727 } else {
728 writeSFixed32ListInternal(fieldNumber, value, packed);
732 private void writeSFixed32ListInternal(int fieldNumber, IntArrayList value, boolean packed)
733 throws IOException {
734 if (packed) {
735 output.writeTag(fieldNumber, WIRETYPE_LENGTH_DELIMITED);
737 // Compute and write the length of the data.
738 int dataSize = 0;
739 for (int i = 0; i < value.size(); ++i) {
740 dataSize += CodedOutputStream.computeSFixed32SizeNoTag(value.getInt(i));
742 output.writeUInt32NoTag(dataSize);
744 // Write the data itself, without any tags.
745 for (int i = 0; i < value.size(); ++i) {
746 output.writeSFixed32NoTag(value.getInt(i));
748 } else {
749 for (int i = 0; i < value.size(); ++i) {
750 output.writeSFixed32(fieldNumber, value.getInt(i));
755 private void writeSFixed32ListInternal(int fieldNumber, List<Integer> value, boolean packed)
756 throws IOException {
757 if (packed) {
758 output.writeTag(fieldNumber, WIRETYPE_LENGTH_DELIMITED);
760 // Compute and write the length of the data.
761 int dataSize = 0;
762 for (int i = 0; i < value.size(); ++i) {
763 dataSize += CodedOutputStream.computeSFixed32SizeNoTag(value.get(i));
765 output.writeUInt32NoTag(dataSize);
767 // Write the data itself, without any tags.
768 for (int i = 0; i < value.size(); ++i) {
769 output.writeSFixed32NoTag(value.get(i));
771 } else {
772 for (int i = 0; i < value.size(); ++i) {
773 output.writeSFixed32(fieldNumber, value.get(i));
778 @Override
779 public void writeSFixed64List(int fieldNumber, List<Long> value, boolean packed)
780 throws IOException {
781 if (value instanceof LongArrayList) {
782 writeSFixed64ListInternal(fieldNumber, (LongArrayList) value, packed);
783 } else {
784 writeSFixed64ListInternal(fieldNumber, value, packed);
788 private void writeSFixed64ListInternal(int fieldNumber, LongArrayList value, boolean packed)
789 throws IOException {
790 if (packed) {
791 output.writeTag(fieldNumber, WIRETYPE_LENGTH_DELIMITED);
793 // Compute and write the length of the data.
794 int dataSize = 0;
795 for (int i = 0; i < value.size(); ++i) {
796 dataSize += CodedOutputStream.computeSFixed64SizeNoTag(value.getLong(i));
798 output.writeUInt32NoTag(dataSize);
800 // Write the data itself, without any tags.
801 for (int i = 0; i < value.size(); ++i) {
802 output.writeSFixed64NoTag(value.getLong(i));
804 } else {
805 for (int i = 0; i < value.size(); ++i) {
806 output.writeSFixed64(fieldNumber, value.getLong(i));
811 private void writeSFixed64ListInternal(int fieldNumber, List<Long> value, boolean packed)
812 throws IOException {
813 if (packed) {
814 output.writeTag(fieldNumber, WIRETYPE_LENGTH_DELIMITED);
816 // Compute and write the length of the data.
817 int dataSize = 0;
818 for (int i = 0; i < value.size(); ++i) {
819 dataSize += CodedOutputStream.computeSFixed64SizeNoTag(value.get(i));
821 output.writeUInt32NoTag(dataSize);
823 // Write the data itself, without any tags.
824 for (int i = 0; i < value.size(); ++i) {
825 output.writeSFixed64NoTag(value.get(i));
827 } else {
828 for (int i = 0; i < value.size(); ++i) {
829 output.writeSFixed64(fieldNumber, value.get(i));
834 @Override
835 public void writeSInt32List(int fieldNumber, List<Integer> value, boolean packed)
836 throws IOException {
837 if (value instanceof IntArrayList) {
838 writeSInt32ListInternal(fieldNumber, (IntArrayList) value, packed);
839 } else {
840 writeSInt32ListInternal(fieldNumber, value, packed);
844 private void writeSInt32ListInternal(int fieldNumber, IntArrayList value, boolean packed)
845 throws IOException {
846 if (packed) {
847 output.writeTag(fieldNumber, WIRETYPE_LENGTH_DELIMITED);
849 // Compute and write the length of the data.
850 int dataSize = 0;
851 for (int i = 0; i < value.size(); ++i) {
852 dataSize += CodedOutputStream.computeSInt32SizeNoTag(value.getInt(i));
854 output.writeUInt32NoTag(dataSize);
856 // Write the data itself, without any tags.
857 for (int i = 0; i < value.size(); ++i) {
858 output.writeSInt32NoTag(value.getInt(i));
860 } else {
861 for (int i = 0; i < value.size(); ++i) {
862 output.writeSInt32(fieldNumber, value.getInt(i));
867 public void writeSInt32ListInternal(int fieldNumber, List<Integer> value, boolean packed)
868 throws IOException {
869 if (packed) {
870 output.writeTag(fieldNumber, WIRETYPE_LENGTH_DELIMITED);
872 // Compute and write the length of the data.
873 int dataSize = 0;
874 for (int i = 0; i < value.size(); ++i) {
875 dataSize += CodedOutputStream.computeSInt32SizeNoTag(value.get(i));
877 output.writeUInt32NoTag(dataSize);
879 // Write the data itself, without any tags.
880 for (int i = 0; i < value.size(); ++i) {
881 output.writeSInt32NoTag(value.get(i));
883 } else {
884 for (int i = 0; i < value.size(); ++i) {
885 output.writeSInt32(fieldNumber, value.get(i));
890 @Override
891 public void writeSInt64List(int fieldNumber, List<Long> value, boolean packed)
892 throws IOException {
893 if (value instanceof LongArrayList) {
894 writeSInt64ListInternal(fieldNumber, (LongArrayList) value, packed);
895 } else {
896 writeSInt64ListInternal(fieldNumber, value, packed);
900 private void writeSInt64ListInternal(int fieldNumber, LongArrayList value, boolean packed)
901 throws IOException {
902 if (packed) {
903 output.writeTag(fieldNumber, WIRETYPE_LENGTH_DELIMITED);
905 // Compute and write the length of the data.
906 int dataSize = 0;
907 for (int i = 0; i < value.size(); ++i) {
908 dataSize += CodedOutputStream.computeSInt64SizeNoTag(value.getLong(i));
910 output.writeUInt32NoTag(dataSize);
912 // Write the data itself, without any tags.
913 for (int i = 0; i < value.size(); ++i) {
914 output.writeSInt64NoTag(value.getLong(i));
916 } else {
917 for (int i = 0; i < value.size(); ++i) {
918 output.writeSInt64(fieldNumber, value.getLong(i));
923 private void writeSInt64ListInternal(int fieldNumber, List<Long> value, boolean packed)
924 throws IOException {
925 if (packed) {
926 output.writeTag(fieldNumber, WIRETYPE_LENGTH_DELIMITED);
928 // Compute and write the length of the data.
929 int dataSize = 0;
930 for (int i = 0; i < value.size(); ++i) {
931 dataSize += CodedOutputStream.computeSInt64SizeNoTag(value.get(i));
933 output.writeUInt32NoTag(dataSize);
935 // Write the data itself, without any tags.
936 for (int i = 0; i < value.size(); ++i) {
937 output.writeSInt64NoTag(value.get(i));
939 } else {
940 for (int i = 0; i < value.size(); ++i) {
941 output.writeSInt64(fieldNumber, value.get(i));
946 @Override
947 public void writeMessageList(int fieldNumber, List<?> value) throws IOException {
948 for (int i = 0; i < value.size(); ++i) {
949 writeMessage(fieldNumber, value.get(i));
953 @Override
954 public void writeMessageList(int fieldNumber, List<?> value, Schema schema) throws IOException {
955 for (int i = 0; i < value.size(); ++i) {
956 writeMessage(fieldNumber, value.get(i), schema);
960 @Deprecated
961 @Override
962 public void writeGroupList(int fieldNumber, List<?> value) throws IOException {
963 for (int i = 0; i < value.size(); ++i) {
964 writeGroup(fieldNumber, value.get(i));
968 @Override
969 public void writeGroupList(int fieldNumber, List<?> value, Schema schema) throws IOException {
970 for (int i = 0; i < value.size(); ++i) {
971 writeGroup(fieldNumber, value.get(i), schema);
975 @Override
976 public <K, V> void writeMap(int fieldNumber, MapEntryLite.Metadata<K, V> metadata, Map<K, V> map)
977 throws IOException {
978 if (output.isSerializationDeterministic()) {
979 writeDeterministicMap(fieldNumber, metadata, map);
980 return;
982 for (Map.Entry<K, V> entry : map.entrySet()) {
983 output.writeTag(fieldNumber, WIRETYPE_LENGTH_DELIMITED);
984 output.writeUInt32NoTag(
985 MapEntryLite.computeSerializedSize(metadata, entry.getKey(), entry.getValue()));
986 MapEntryLite.writeTo(output, metadata, entry.getKey(), entry.getValue());
990 @SuppressWarnings("unchecked")
991 private <K, V> void writeDeterministicMap(
992 int fieldNumber, MapEntryLite.Metadata<K, V> metadata, Map<K, V> map) throws IOException {
993 switch (metadata.keyType) {
994 case BOOL:
995 V value;
996 if ((value = map.get(Boolean.FALSE)) != null) {
997 writeDeterministicBooleanMapEntry(
998 fieldNumber, /* key= */ false, value, (MapEntryLite.Metadata<Boolean, V>) metadata);
1000 if ((value = map.get(Boolean.TRUE)) != null) {
1001 writeDeterministicBooleanMapEntry(
1002 fieldNumber, /* key= */ true, value, (MapEntryLite.Metadata<Boolean, V>) metadata);
1004 break;
1005 case FIXED32:
1006 case INT32:
1007 case SFIXED32:
1008 case SINT32:
1009 case UINT32:
1010 writeDeterministicIntegerMap(
1011 fieldNumber, (MapEntryLite.Metadata<Integer, V>) metadata, (Map<Integer, V>) map);
1012 break;
1013 case FIXED64:
1014 case INT64:
1015 case SFIXED64:
1016 case SINT64:
1017 case UINT64:
1018 writeDeterministicLongMap(
1019 fieldNumber, (MapEntryLite.Metadata<Long, V>) metadata, (Map<Long, V>) map);
1020 break;
1021 case STRING:
1022 writeDeterministicStringMap(
1023 fieldNumber, (MapEntryLite.Metadata<String, V>) metadata, (Map<String, V>) map);
1024 break;
1025 default:
1026 throw new IllegalArgumentException("does not support key type: " + metadata.keyType);
1030 private <V> void writeDeterministicBooleanMapEntry(
1031 int fieldNumber, boolean key, V value, MapEntryLite.Metadata<Boolean, V> metadata)
1032 throws IOException {
1033 output.writeTag(fieldNumber, WIRETYPE_LENGTH_DELIMITED);
1034 output.writeUInt32NoTag(MapEntryLite.computeSerializedSize(metadata, key, value));
1035 MapEntryLite.writeTo(output, metadata, key, value);
1038 private <V> void writeDeterministicIntegerMap(
1039 int fieldNumber, MapEntryLite.Metadata<Integer, V> metadata, Map<Integer, V> map)
1040 throws IOException {
1041 int[] keys = new int[map.size()];
1042 int index = 0;
1043 for (int k : map.keySet()) {
1044 keys[index++] = k;
1046 Arrays.sort(keys);
1047 for (int key : keys) {
1048 V value = map.get(key);
1049 output.writeTag(fieldNumber, WIRETYPE_LENGTH_DELIMITED);
1050 output.writeUInt32NoTag(MapEntryLite.computeSerializedSize(metadata, key, value));
1051 MapEntryLite.writeTo(output, metadata, key, value);
1055 private <V> void writeDeterministicLongMap(
1056 int fieldNumber, MapEntryLite.Metadata<Long, V> metadata, Map<Long, V> map)
1057 throws IOException {
1058 long[] keys = new long[map.size()];
1059 int index = 0;
1060 for (long k : map.keySet()) {
1061 keys[index++] = k;
1063 Arrays.sort(keys);
1064 for (long key : keys) {
1065 V value = map.get(key);
1066 output.writeTag(fieldNumber, WIRETYPE_LENGTH_DELIMITED);
1067 output.writeUInt32NoTag(MapEntryLite.computeSerializedSize(metadata, key, value));
1068 MapEntryLite.writeTo(output, metadata, key, value);
1072 private <V> void writeDeterministicStringMap(
1073 int fieldNumber, MapEntryLite.Metadata<String, V> metadata, Map<String, V> map)
1074 throws IOException {
1075 String[] keys = new String[map.size()];
1076 int index = 0;
1077 for (String k : map.keySet()) {
1078 keys[index++] = k;
1080 Arrays.sort(keys);
1081 for (String key : keys) {
1082 V value = map.get(key);
1083 output.writeTag(fieldNumber, WIRETYPE_LENGTH_DELIMITED);
1084 output.writeUInt32NoTag(MapEntryLite.computeSerializedSize(metadata, key, value));
1085 MapEntryLite.writeTo(output, metadata, key, value);