31 package com.google.protobuf;
36 import java.io.IOException;
37 import java.util.Arrays;
38 import java.util.List;
43 final class CodedOutputStreamWriter
implements Writer {
44 private final CodedOutputStream
output;
46 public static CodedOutputStreamWriter forCodedOutput(CodedOutputStream
output) {
47 if (
output.wrapper !=
null) {
50 return new CodedOutputStreamWriter(
output);
53 private CodedOutputStreamWriter(CodedOutputStream
output) {
54 this.output = checkNotNull(
output,
"output");
55 this.output.wrapper =
this;
59 public FieldOrder fieldOrder() {
60 return FieldOrder.ASCENDING;
63 public int getTotalBytesWritten() {
64 return output.getTotalBytesWritten();
68 public void writeSFixed32(
int fieldNumber,
int value)
throws IOException {
73 public void writeInt64(
int fieldNumber,
long value)
throws IOException {
78 public void writeSFixed64(
int fieldNumber,
long value)
throws IOException {
83 public void writeFloat(
int fieldNumber,
float value)
throws IOException {
88 public void writeDouble(
int fieldNumber,
double value)
throws IOException {
93 public void writeEnum(
int fieldNumber,
int value)
throws IOException {
98 public void writeUInt64(
int fieldNumber,
long value)
throws IOException {
103 public void writeInt32(
int fieldNumber,
int value)
throws IOException {
108 public void writeFixed64(
int fieldNumber,
long value)
throws IOException {
113 public void writeFixed32(
int fieldNumber,
int value)
throws IOException {
118 public void writeBool(
int fieldNumber,
boolean value)
throws IOException {
128 public void writeBytes(
int fieldNumber, ByteString
value)
throws IOException {
133 public void writeUInt32(
int fieldNumber,
int value)
throws IOException {
138 public void writeSInt32(
int fieldNumber,
int value)
throws IOException {
143 public void writeSInt64(
int fieldNumber,
long value)
throws IOException {
148 public void writeMessage(
int fieldNumber, Object
value)
throws IOException {
149 output.writeMessage(fieldNumber, (MessageLite)
value);
153 public void writeMessage(
int fieldNumber, Object
value, Schema schema)
throws IOException {
154 output.writeMessage(fieldNumber, (MessageLite)
value, schema);
158 public void writeGroup(
int fieldNumber, Object
value)
throws IOException {
159 output.writeGroup(fieldNumber, (MessageLite)
value);
163 public void writeGroup(
int fieldNumber, Object
value, Schema schema)
throws IOException {
164 output.writeGroup(fieldNumber, (MessageLite)
value, schema);
168 public void writeStartGroup(
int fieldNumber)
throws IOException {
169 output.writeTag(fieldNumber, WireFormat.WIRETYPE_START_GROUP);
173 public void writeEndGroup(
int fieldNumber)
throws IOException {
174 output.writeTag(fieldNumber, WireFormat.WIRETYPE_END_GROUP);
178 public final void writeMessageSetItem(
int fieldNumber, Object
value)
throws IOException {
179 if (
value instanceof ByteString) {
180 output.writeRawMessageSetExtension(fieldNumber, (ByteString)
value);
182 output.writeMessageSetExtension(fieldNumber, (MessageLite)
value);
187 public void writeInt32List(
int fieldNumber, List<Integer>
value,
boolean packed)
194 for (
int i = 0;
i <
value.size(); ++
i) {
195 dataSize += CodedOutputStream.computeInt32SizeNoTag(
value.get(
i));
197 output.writeUInt32NoTag(dataSize);
200 for (
int i = 0;
i <
value.size(); ++
i) {
204 for (
int i = 0;
i <
value.size(); ++
i) {
211 public void writeFixed32List(
int fieldNumber, List<Integer>
value,
boolean packed)
218 for (
int i = 0;
i <
value.size(); ++
i) {
219 dataSize += CodedOutputStream.computeFixed32SizeNoTag(
value.get(
i));
221 output.writeUInt32NoTag(dataSize);
224 for (
int i = 0;
i <
value.size(); ++
i) {
228 for (
int i = 0;
i <
value.size(); ++
i) {
235 public void writeInt64List(
int fieldNumber, List<Long>
value,
boolean packed)
throws IOException {
241 for (
int i = 0;
i <
value.size(); ++
i) {
242 dataSize += CodedOutputStream.computeInt64SizeNoTag(
value.get(
i));
244 output.writeUInt32NoTag(dataSize);
247 for (
int i = 0;
i <
value.size(); ++
i) {
251 for (
int i = 0;
i <
value.size(); ++
i) {
258 public void writeUInt64List(
int fieldNumber, List<Long>
value,
boolean packed)
265 for (
int i = 0;
i <
value.size(); ++
i) {
266 dataSize += CodedOutputStream.computeUInt64SizeNoTag(
value.get(
i));
268 output.writeUInt32NoTag(dataSize);
271 for (
int i = 0;
i <
value.size(); ++
i) {
275 for (
int i = 0;
i <
value.size(); ++
i) {
282 public void writeFixed64List(
int fieldNumber, List<Long>
value,
boolean packed)
289 for (
int i = 0;
i <
value.size(); ++
i) {
290 dataSize += CodedOutputStream.computeFixed64SizeNoTag(
value.get(
i));
292 output.writeUInt32NoTag(dataSize);
295 for (
int i = 0;
i <
value.size(); ++
i) {
299 for (
int i = 0;
i <
value.size(); ++
i) {
306 public void writeFloatList(
int fieldNumber, List<Float>
value,
boolean packed)
313 for (
int i = 0;
i <
value.size(); ++
i) {
314 dataSize += CodedOutputStream.computeFloatSizeNoTag(
value.get(
i));
316 output.writeUInt32NoTag(dataSize);
319 for (
int i = 0;
i <
value.size(); ++
i) {
323 for (
int i = 0;
i <
value.size(); ++
i) {
330 public void writeDoubleList(
int fieldNumber, List<Double>
value,
boolean packed)
337 for (
int i = 0;
i <
value.size(); ++
i) {
338 dataSize += CodedOutputStream.computeDoubleSizeNoTag(
value.get(
i));
340 output.writeUInt32NoTag(dataSize);
343 for (
int i = 0;
i <
value.size(); ++
i) {
347 for (
int i = 0;
i <
value.size(); ++
i) {
354 public void writeEnumList(
int fieldNumber, List<Integer>
value,
boolean packed)
361 for (
int i = 0;
i <
value.size(); ++
i) {
362 dataSize += CodedOutputStream.computeEnumSizeNoTag(
value.get(
i));
364 output.writeUInt32NoTag(dataSize);
367 for (
int i = 0;
i <
value.size(); ++
i) {
371 for (
int i = 0;
i <
value.size(); ++
i) {
378 public void writeBoolList(
int fieldNumber, List<Boolean>
value,
boolean packed)
385 for (
int i = 0;
i <
value.size(); ++
i) {
386 dataSize += CodedOutputStream.computeBoolSizeNoTag(
value.get(
i));
388 output.writeUInt32NoTag(dataSize);
391 for (
int i = 0;
i <
value.size(); ++
i) {
395 for (
int i = 0;
i <
value.size(); ++
i) {
402 public void writeStringList(
int fieldNumber, List<String>
value)
throws IOException {
403 if (
value instanceof LazyStringList) {
404 final LazyStringList lazyList = (LazyStringList)
value;
405 for (
int i = 0;
i <
value.size(); ++
i) {
406 writeLazyString(fieldNumber, lazyList.getRaw(
i));
409 for (
int i = 0;
i <
value.size(); ++
i) {
415 private void writeLazyString(
int fieldNumber, Object
value)
throws IOException {
416 if (
value instanceof String) {
419 output.writeBytes(fieldNumber, (ByteString)
value);
424 public void writeBytesList(
int fieldNumber, List<ByteString>
value)
throws IOException {
425 for (
int i = 0;
i <
value.size(); ++
i) {
431 public void writeUInt32List(
int fieldNumber, List<Integer>
value,
boolean packed)
438 for (
int i = 0;
i <
value.size(); ++
i) {
439 dataSize += CodedOutputStream.computeUInt32SizeNoTag(
value.get(
i));
441 output.writeUInt32NoTag(dataSize);
444 for (
int i = 0;
i <
value.size(); ++
i) {
448 for (
int i = 0;
i <
value.size(); ++
i) {
455 public void writeSFixed32List(
int fieldNumber, List<Integer>
value,
boolean packed)
462 for (
int i = 0;
i <
value.size(); ++
i) {
463 dataSize += CodedOutputStream.computeSFixed32SizeNoTag(
value.get(
i));
465 output.writeUInt32NoTag(dataSize);
468 for (
int i = 0;
i <
value.size(); ++
i) {
472 for (
int i = 0;
i <
value.size(); ++
i) {
479 public void writeSFixed64List(
int fieldNumber, List<Long>
value,
boolean packed)
486 for (
int i = 0;
i <
value.size(); ++
i) {
487 dataSize += CodedOutputStream.computeSFixed64SizeNoTag(
value.get(
i));
489 output.writeUInt32NoTag(dataSize);
492 for (
int i = 0;
i <
value.size(); ++
i) {
496 for (
int i = 0;
i <
value.size(); ++
i) {
503 public void writeSInt32List(
int fieldNumber, List<Integer>
value,
boolean packed)
510 for (
int i = 0;
i <
value.size(); ++
i) {
511 dataSize += CodedOutputStream.computeSInt32SizeNoTag(
value.get(
i));
513 output.writeUInt32NoTag(dataSize);
516 for (
int i = 0;
i <
value.size(); ++
i) {
520 for (
int i = 0;
i <
value.size(); ++
i) {
527 public void writeSInt64List(
int fieldNumber, List<Long>
value,
boolean packed)
534 for (
int i = 0;
i <
value.size(); ++
i) {
535 dataSize += CodedOutputStream.computeSInt64SizeNoTag(
value.get(
i));
537 output.writeUInt32NoTag(dataSize);
540 for (
int i = 0;
i <
value.size(); ++
i) {
544 for (
int i = 0;
i <
value.size(); ++
i) {
551 public void writeMessageList(
int fieldNumber, List<?>
value)
throws IOException {
552 for (
int i = 0;
i <
value.size(); ++
i) {
553 writeMessage(fieldNumber,
value.get(
i));
558 public void writeMessageList(
int fieldNumber, List<?>
value, Schema schema)
throws IOException {
559 for (
int i = 0;
i <
value.size(); ++
i) {
560 writeMessage(fieldNumber,
value.get(
i), schema);
565 public void writeGroupList(
int fieldNumber, List<?>
value)
throws IOException {
566 for (
int i = 0;
i <
value.size(); ++
i) {
567 writeGroup(fieldNumber,
value.get(
i));
572 public void writeGroupList(
int fieldNumber, List<?>
value, Schema schema)
throws IOException {
573 for (
int i = 0;
i <
value.size(); ++
i) {
574 writeGroup(fieldNumber,
value.get(
i), schema);
581 if (
output.isSerializationDeterministic()) {
585 for (
Map.Entry<
K, V> entry :
map.entrySet()) {
588 MapEntryLite.computeSerializedSize(
metadata, entry.getKey(), entry.getValue()));
589 MapEntryLite.writeTo(
output,
metadata, entry.getKey(), entry.getValue());
593 @SuppressWarnings(
"unchecked")
594 private <
K, V>
void writeDeterministicMap(
595 int fieldNumber, MapEntryLite.Metadata<
K, V>
metadata,
Map<
K, V>
map) throws IOException {
599 if ((
value =
map.get(Boolean.FALSE)) !=
null) {
600 writeDeterministicBooleanMapEntry(
601 fieldNumber,
false,
value, (MapEntryLite.Metadata<Boolean, V>)
metadata);
603 if ((
value =
map.get(Boolean.TRUE)) !=
null) {
604 writeDeterministicBooleanMapEntry(
605 fieldNumber,
true,
value, (MapEntryLite.Metadata<Boolean, V>)
metadata);
613 writeDeterministicIntegerMap(
621 writeDeterministicLongMap(
625 writeDeterministicStringMap(
629 throw new IllegalArgumentException(
"does not support key type: " +
metadata.keyType);
633 private <V>
void writeDeterministicBooleanMapEntry(
634 int fieldNumber,
boolean key, V
value, MapEntryLite.Metadata<Boolean, V>
metadata)
641 private <V>
void writeDeterministicIntegerMap(
644 int[] keys =
new int[
map.size()];
646 for (
int k :
map.keySet()) {
650 for (
int key : keys) {
658 private <V>
void writeDeterministicLongMap(
661 long[] keys =
new long[
map.size()];
663 for (
long k :
map.keySet()) {
667 for (
long key : keys) {
675 private <V>
void writeDeterministicStringMap(
678 String[] keys =
new String[
map.size()];
680 for (String k :
map.keySet()) {
684 for (String
key : keys) {