1089 lines
34 KiB
Java
1089 lines
34 KiB
Java
// Protocol Buffers - Google's data interchange format
|
|
// Copyright 2008 Google Inc. All rights reserved.
|
|
//
|
|
// Use of this source code is governed by a BSD-style
|
|
// license that can be found in the LICENSE file or at
|
|
// https://developers.google.com/open-source/licenses/bsd
|
|
|
|
package com.google.protobuf;
|
|
|
|
import static com.google.protobuf.Internal.checkNotNull;
|
|
import static com.google.protobuf.WireFormat.WIRETYPE_LENGTH_DELIMITED;
|
|
|
|
import java.io.IOException;
|
|
import java.util.Arrays;
|
|
import java.util.List;
|
|
import java.util.Map;
|
|
|
|
/** An adapter between the {@link Writer} interface and {@link CodedOutputStream}. */
|
|
@CheckReturnValue
|
|
@ExperimentalApi
|
|
final class CodedOutputStreamWriter implements Writer {
|
|
private final CodedOutputStream output;
|
|
|
|
public static CodedOutputStreamWriter forCodedOutput(CodedOutputStream output) {
|
|
if (output.wrapper != null) {
|
|
return output.wrapper;
|
|
}
|
|
return new CodedOutputStreamWriter(output);
|
|
}
|
|
|
|
private CodedOutputStreamWriter(CodedOutputStream output) {
|
|
this.output = checkNotNull(output, "output");
|
|
this.output.wrapper = this;
|
|
}
|
|
|
|
@Override
|
|
public FieldOrder fieldOrder() {
|
|
return FieldOrder.ASCENDING;
|
|
}
|
|
|
|
public int getTotalBytesWritten() {
|
|
return output.getTotalBytesWritten();
|
|
}
|
|
|
|
@Override
|
|
public void writeSFixed32(int fieldNumber, int value) throws IOException {
|
|
output.writeSFixed32(fieldNumber, value);
|
|
}
|
|
|
|
@Override
|
|
public void writeInt64(int fieldNumber, long value) throws IOException {
|
|
output.writeInt64(fieldNumber, value);
|
|
}
|
|
|
|
@Override
|
|
public void writeSFixed64(int fieldNumber, long value) throws IOException {
|
|
output.writeSFixed64(fieldNumber, value);
|
|
}
|
|
|
|
@Override
|
|
public void writeFloat(int fieldNumber, float value) throws IOException {
|
|
output.writeFloat(fieldNumber, value);
|
|
}
|
|
|
|
@Override
|
|
public void writeDouble(int fieldNumber, double value) throws IOException {
|
|
output.writeDouble(fieldNumber, value);
|
|
}
|
|
|
|
@Override
|
|
public void writeEnum(int fieldNumber, int value) throws IOException {
|
|
output.writeEnum(fieldNumber, value);
|
|
}
|
|
|
|
@Override
|
|
public void writeUInt64(int fieldNumber, long value) throws IOException {
|
|
output.writeUInt64(fieldNumber, value);
|
|
}
|
|
|
|
@Override
|
|
public void writeInt32(int fieldNumber, int value) throws IOException {
|
|
output.writeInt32(fieldNumber, value);
|
|
}
|
|
|
|
@Override
|
|
public void writeFixed64(int fieldNumber, long value) throws IOException {
|
|
output.writeFixed64(fieldNumber, value);
|
|
}
|
|
|
|
@Override
|
|
public void writeFixed32(int fieldNumber, int value) throws IOException {
|
|
output.writeFixed32(fieldNumber, value);
|
|
}
|
|
|
|
@Override
|
|
public void writeBool(int fieldNumber, boolean value) throws IOException {
|
|
output.writeBool(fieldNumber, value);
|
|
}
|
|
|
|
@Override
|
|
public void writeString(int fieldNumber, String value) throws IOException {
|
|
output.writeString(fieldNumber, value);
|
|
}
|
|
|
|
@Override
|
|
public void writeBytes(int fieldNumber, ByteString value) throws IOException {
|
|
output.writeBytes(fieldNumber, value);
|
|
}
|
|
|
|
@Override
|
|
public void writeUInt32(int fieldNumber, int value) throws IOException {
|
|
output.writeUInt32(fieldNumber, value);
|
|
}
|
|
|
|
@Override
|
|
public void writeSInt32(int fieldNumber, int value) throws IOException {
|
|
output.writeSInt32(fieldNumber, value);
|
|
}
|
|
|
|
@Override
|
|
public void writeSInt64(int fieldNumber, long value) throws IOException {
|
|
output.writeSInt64(fieldNumber, value);
|
|
}
|
|
|
|
@Override
|
|
public void writeMessage(int fieldNumber, Object value) throws IOException {
|
|
output.writeMessage(fieldNumber, (MessageLite) value);
|
|
}
|
|
|
|
@Override
|
|
public void writeMessage(int fieldNumber, Object value, Schema schema) throws IOException {
|
|
output.writeMessage(fieldNumber, (MessageLite) value, schema);
|
|
}
|
|
|
|
@Deprecated
|
|
@Override
|
|
public void writeGroup(int fieldNumber, Object value) throws IOException {
|
|
output.writeGroup(fieldNumber, (MessageLite) value);
|
|
}
|
|
|
|
@Override
|
|
public void writeGroup(int fieldNumber, Object value, Schema schema) throws IOException {
|
|
output.writeGroup(fieldNumber, (MessageLite) value, schema);
|
|
}
|
|
|
|
@Deprecated
|
|
@Override
|
|
public void writeStartGroup(int fieldNumber) throws IOException {
|
|
output.writeTag(fieldNumber, WireFormat.WIRETYPE_START_GROUP);
|
|
}
|
|
|
|
@Deprecated
|
|
@Override
|
|
public void writeEndGroup(int fieldNumber) throws IOException {
|
|
output.writeTag(fieldNumber, WireFormat.WIRETYPE_END_GROUP);
|
|
}
|
|
|
|
@Override
|
|
public final void writeMessageSetItem(int fieldNumber, Object value) throws IOException {
|
|
if (value instanceof ByteString) {
|
|
output.writeRawMessageSetExtension(fieldNumber, (ByteString) value);
|
|
} else {
|
|
output.writeMessageSetExtension(fieldNumber, (MessageLite) value);
|
|
}
|
|
}
|
|
|
|
@Override
|
|
public void writeInt32List(int fieldNumber, List<Integer> value, boolean packed)
|
|
throws IOException {
|
|
if (value instanceof IntArrayList) {
|
|
writeInt32ListInternal(fieldNumber, (IntArrayList) value, packed);
|
|
} else {
|
|
writeInt32ListInternal(fieldNumber, value, packed);
|
|
}
|
|
}
|
|
|
|
private void writeInt32ListInternal(int fieldNumber, IntArrayList value, boolean packed)
|
|
throws IOException {
|
|
if (packed) {
|
|
output.writeTag(fieldNumber, WIRETYPE_LENGTH_DELIMITED);
|
|
|
|
// Compute and write the length of the data.
|
|
int dataSize = 0;
|
|
for (int i = 0; i < value.size(); ++i) {
|
|
dataSize += CodedOutputStream.computeInt32SizeNoTag(value.getInt(i));
|
|
}
|
|
output.writeUInt32NoTag(dataSize);
|
|
|
|
// Write the data itself, without any tags.
|
|
for (int i = 0; i < value.size(); ++i) {
|
|
output.writeInt32NoTag(value.getInt(i));
|
|
}
|
|
} else {
|
|
for (int i = 0; i < value.size(); ++i) {
|
|
output.writeInt32(fieldNumber, value.getInt(i));
|
|
}
|
|
}
|
|
}
|
|
|
|
private void writeInt32ListInternal(int fieldNumber, List<Integer> value, boolean packed)
|
|
throws IOException {
|
|
if (packed) {
|
|
output.writeTag(fieldNumber, WIRETYPE_LENGTH_DELIMITED);
|
|
|
|
// Compute and write the length of the data.
|
|
int dataSize = 0;
|
|
for (int i = 0; i < value.size(); ++i) {
|
|
dataSize += CodedOutputStream.computeInt32SizeNoTag(value.get(i));
|
|
}
|
|
output.writeUInt32NoTag(dataSize);
|
|
|
|
// Write the data itself, without any tags.
|
|
for (int i = 0; i < value.size(); ++i) {
|
|
output.writeInt32NoTag(value.get(i));
|
|
}
|
|
} else {
|
|
for (int i = 0; i < value.size(); ++i) {
|
|
output.writeInt32(fieldNumber, value.get(i));
|
|
}
|
|
}
|
|
}
|
|
|
|
@Override
|
|
public void writeFixed32List(int fieldNumber, List<Integer> value, boolean packed)
|
|
throws IOException {
|
|
if (value instanceof IntArrayList) {
|
|
writeFixed32ListInternal(fieldNumber, (IntArrayList) value, packed);
|
|
} else {
|
|
writeFixed32ListInternal(fieldNumber, value, packed);
|
|
}
|
|
}
|
|
|
|
private void writeFixed32ListInternal(int fieldNumber, IntArrayList value, boolean packed)
|
|
throws IOException {
|
|
if (packed) {
|
|
output.writeTag(fieldNumber, WIRETYPE_LENGTH_DELIMITED);
|
|
|
|
// Compute and write the length of the data.
|
|
int dataSize = 0;
|
|
for (int i = 0; i < value.size(); ++i) {
|
|
dataSize += CodedOutputStream.computeFixed32SizeNoTag(value.getInt(i));
|
|
}
|
|
output.writeUInt32NoTag(dataSize);
|
|
|
|
// Write the data itself, without any tags.
|
|
for (int i = 0; i < value.size(); ++i) {
|
|
output.writeFixed32NoTag(value.getInt(i));
|
|
}
|
|
} else {
|
|
for (int i = 0; i < value.size(); ++i) {
|
|
output.writeFixed32(fieldNumber, value.getInt(i));
|
|
}
|
|
}
|
|
}
|
|
|
|
private void writeFixed32ListInternal(int fieldNumber, List<Integer> value, boolean packed)
|
|
throws IOException {
|
|
if (packed) {
|
|
output.writeTag(fieldNumber, WIRETYPE_LENGTH_DELIMITED);
|
|
|
|
// Compute and write the length of the data.
|
|
int dataSize = 0;
|
|
for (int i = 0; i < value.size(); ++i) {
|
|
dataSize += CodedOutputStream.computeFixed32SizeNoTag(value.get(i));
|
|
}
|
|
output.writeUInt32NoTag(dataSize);
|
|
|
|
// Write the data itself, without any tags.
|
|
for (int i = 0; i < value.size(); ++i) {
|
|
output.writeFixed32NoTag(value.get(i));
|
|
}
|
|
} else {
|
|
for (int i = 0; i < value.size(); ++i) {
|
|
output.writeFixed32(fieldNumber, value.get(i));
|
|
}
|
|
}
|
|
}
|
|
|
|
@Override
|
|
public void writeInt64List(int fieldNumber, List<Long> value, boolean packed) throws IOException {
|
|
if (value instanceof LongArrayList) {
|
|
writeInt64ListInternal(fieldNumber, (LongArrayList) value, packed);
|
|
} else {
|
|
writeInt64ListInternal(fieldNumber, value, packed);
|
|
}
|
|
}
|
|
|
|
private void writeInt64ListInternal(int fieldNumber, LongArrayList value, boolean packed)
|
|
throws IOException {
|
|
if (packed) {
|
|
output.writeTag(fieldNumber, WIRETYPE_LENGTH_DELIMITED);
|
|
|
|
// Compute and write the length of the data.
|
|
int dataSize = 0;
|
|
for (int i = 0; i < value.size(); ++i) {
|
|
dataSize += CodedOutputStream.computeInt64SizeNoTag(value.getLong(i));
|
|
}
|
|
output.writeUInt32NoTag(dataSize);
|
|
|
|
// Write the data itself, without any tags.
|
|
for (int i = 0; i < value.size(); ++i) {
|
|
output.writeInt64NoTag(value.getLong(i));
|
|
}
|
|
} else {
|
|
for (int i = 0; i < value.size(); ++i) {
|
|
output.writeInt64(fieldNumber, value.getLong(i));
|
|
}
|
|
}
|
|
}
|
|
|
|
private void writeInt64ListInternal(int fieldNumber, List<Long> value, boolean packed)
|
|
throws IOException {
|
|
if (packed) {
|
|
output.writeTag(fieldNumber, WIRETYPE_LENGTH_DELIMITED);
|
|
|
|
// Compute and write the length of the data.
|
|
int dataSize = 0;
|
|
for (int i = 0; i < value.size(); ++i) {
|
|
dataSize += CodedOutputStream.computeInt64SizeNoTag(value.get(i));
|
|
}
|
|
output.writeUInt32NoTag(dataSize);
|
|
|
|
// Write the data itself, without any tags.
|
|
for (int i = 0; i < value.size(); ++i) {
|
|
output.writeInt64NoTag(value.get(i));
|
|
}
|
|
} else {
|
|
for (int i = 0; i < value.size(); ++i) {
|
|
output.writeInt64(fieldNumber, value.get(i));
|
|
}
|
|
}
|
|
}
|
|
@Override
|
|
public void writeUInt64List(int fieldNumber, List<Long> value, boolean packed)
|
|
throws IOException {
|
|
if (value instanceof LongArrayList) {
|
|
writeUInt64ListInternal(fieldNumber, (LongArrayList) value, packed);
|
|
} else {
|
|
writeUInt64ListInternal(fieldNumber, value, packed);
|
|
}
|
|
}
|
|
|
|
private void writeUInt64ListInternal(int fieldNumber, LongArrayList value, boolean packed)
|
|
throws IOException {
|
|
if (packed) {
|
|
output.writeTag(fieldNumber, WIRETYPE_LENGTH_DELIMITED);
|
|
|
|
// Compute and write the length of the data.
|
|
int dataSize = 0;
|
|
for (int i = 0; i < value.size(); ++i) {
|
|
dataSize += CodedOutputStream.computeUInt64SizeNoTag(value.getLong(i));
|
|
}
|
|
output.writeUInt32NoTag(dataSize);
|
|
|
|
// Write the data itself, without any tags.
|
|
for (int i = 0; i < value.size(); ++i) {
|
|
output.writeUInt64NoTag(value.getLong(i));
|
|
}
|
|
} else {
|
|
for (int i = 0; i < value.size(); ++i) {
|
|
output.writeUInt64(fieldNumber, value.getLong(i));
|
|
}
|
|
}
|
|
}
|
|
|
|
private void writeUInt64ListInternal(int fieldNumber, List<Long> value, boolean packed)
|
|
throws IOException {
|
|
if (packed) {
|
|
output.writeTag(fieldNumber, WIRETYPE_LENGTH_DELIMITED);
|
|
|
|
// Compute and write the length of the data.
|
|
int dataSize = 0;
|
|
for (int i = 0; i < value.size(); ++i) {
|
|
dataSize += CodedOutputStream.computeUInt64SizeNoTag(value.get(i));
|
|
}
|
|
output.writeUInt32NoTag(dataSize);
|
|
|
|
// Write the data itself, without any tags.
|
|
for (int i = 0; i < value.size(); ++i) {
|
|
output.writeUInt64NoTag(value.get(i));
|
|
}
|
|
} else {
|
|
for (int i = 0; i < value.size(); ++i) {
|
|
output.writeUInt64(fieldNumber, value.get(i));
|
|
}
|
|
}
|
|
}
|
|
|
|
@Override
|
|
public void writeFixed64List(int fieldNumber, List<Long> value, boolean packed)
|
|
throws IOException {
|
|
if (value instanceof LongArrayList) {
|
|
writeFixed64ListInternal(fieldNumber, (LongArrayList) value, packed);
|
|
} else {
|
|
writeFixed64ListInternal(fieldNumber, value, packed);
|
|
}
|
|
}
|
|
|
|
private void writeFixed64ListInternal(int fieldNumber, LongArrayList value, boolean packed)
|
|
throws IOException {
|
|
if (packed) {
|
|
output.writeTag(fieldNumber, WIRETYPE_LENGTH_DELIMITED);
|
|
|
|
// Compute and write the length of the data.
|
|
int dataSize = 0;
|
|
for (int i = 0; i < value.size(); ++i) {
|
|
dataSize += CodedOutputStream.computeFixed64SizeNoTag(value.getLong(i));
|
|
}
|
|
output.writeUInt32NoTag(dataSize);
|
|
|
|
// Write the data itself, without any tags.
|
|
for (int i = 0; i < value.size(); ++i) {
|
|
output.writeFixed64NoTag(value.getLong(i));
|
|
}
|
|
} else {
|
|
for (int i = 0; i < value.size(); ++i) {
|
|
output.writeFixed64(fieldNumber, value.getLong(i));
|
|
}
|
|
}
|
|
}
|
|
|
|
private void writeFixed64ListInternal(int fieldNumber, List<Long> value, boolean packed)
|
|
throws IOException {
|
|
if (packed) {
|
|
output.writeTag(fieldNumber, WIRETYPE_LENGTH_DELIMITED);
|
|
|
|
// Compute and write the length of the data.
|
|
int dataSize = 0;
|
|
for (int i = 0; i < value.size(); ++i) {
|
|
dataSize += CodedOutputStream.computeFixed64SizeNoTag(value.get(i));
|
|
}
|
|
output.writeUInt32NoTag(dataSize);
|
|
|
|
// Write the data itself, without any tags.
|
|
for (int i = 0; i < value.size(); ++i) {
|
|
output.writeFixed64NoTag(value.get(i));
|
|
}
|
|
} else {
|
|
for (int i = 0; i < value.size(); ++i) {
|
|
output.writeFixed64(fieldNumber, value.get(i));
|
|
}
|
|
}
|
|
}
|
|
|
|
@Override
|
|
public void writeFloatList(int fieldNumber, List<Float> value, boolean packed)
|
|
throws IOException {
|
|
if (value instanceof FloatArrayList) {
|
|
writeFloatListInternal(fieldNumber, (FloatArrayList) value, packed);
|
|
} else {
|
|
writeFloatListInternal(fieldNumber, value, packed);
|
|
}
|
|
}
|
|
|
|
private void writeFloatListInternal(int fieldNumber, FloatArrayList value, boolean packed)
|
|
throws IOException {
|
|
if (packed) {
|
|
output.writeTag(fieldNumber, WIRETYPE_LENGTH_DELIMITED);
|
|
|
|
// Compute and write the length of the data.
|
|
int dataSize = 0;
|
|
for (int i = 0; i < value.size(); ++i) {
|
|
dataSize += CodedOutputStream.computeFloatSizeNoTag(value.getFloat(i));
|
|
}
|
|
output.writeUInt32NoTag(dataSize);
|
|
|
|
// Write the data itself, without any tags.
|
|
for (int i = 0; i < value.size(); ++i) {
|
|
output.writeFloatNoTag(value.getFloat(i));
|
|
}
|
|
} else {
|
|
for (int i = 0; i < value.size(); ++i) {
|
|
output.writeFloat(fieldNumber, value.getFloat(i));
|
|
}
|
|
}
|
|
}
|
|
|
|
private void writeFloatListInternal(int fieldNumber, List<Float> value, boolean packed)
|
|
throws IOException {
|
|
if (packed) {
|
|
output.writeTag(fieldNumber, WIRETYPE_LENGTH_DELIMITED);
|
|
|
|
// Compute and write the length of the data.
|
|
int dataSize = 0;
|
|
for (int i = 0; i < value.size(); ++i) {
|
|
dataSize += CodedOutputStream.computeFloatSizeNoTag(value.get(i));
|
|
}
|
|
output.writeUInt32NoTag(dataSize);
|
|
|
|
// Write the data itself, without any tags.
|
|
for (int i = 0; i < value.size(); ++i) {
|
|
output.writeFloatNoTag(value.get(i));
|
|
}
|
|
} else {
|
|
for (int i = 0; i < value.size(); ++i) {
|
|
output.writeFloat(fieldNumber, value.get(i));
|
|
}
|
|
}
|
|
}
|
|
|
|
@Override
|
|
public void writeDoubleList(int fieldNumber, List<Double> value, boolean packed)
|
|
throws IOException {
|
|
if (value instanceof DoubleArrayList) {
|
|
writeDoubleListInternal(fieldNumber, (DoubleArrayList) value, packed);
|
|
} else {
|
|
writeDoubleListInternal(fieldNumber, value, packed);
|
|
}
|
|
}
|
|
|
|
private void writeDoubleListInternal(int fieldNumber, DoubleArrayList value, boolean packed)
|
|
throws IOException {
|
|
if (packed) {
|
|
output.writeTag(fieldNumber, WIRETYPE_LENGTH_DELIMITED);
|
|
|
|
// Compute and write the length of the data.
|
|
int dataSize = 0;
|
|
for (int i = 0; i < value.size(); ++i) {
|
|
dataSize += CodedOutputStream.computeDoubleSizeNoTag(value.getDouble(i));
|
|
}
|
|
output.writeUInt32NoTag(dataSize);
|
|
|
|
// Write the data itself, without any tags.
|
|
for (int i = 0; i < value.size(); ++i) {
|
|
output.writeDoubleNoTag(value.getDouble(i));
|
|
}
|
|
} else {
|
|
for (int i = 0; i < value.size(); ++i) {
|
|
output.writeDouble(fieldNumber, value.getDouble(i));
|
|
}
|
|
}
|
|
}
|
|
|
|
private void writeDoubleListInternal(int fieldNumber, List<Double> value, boolean packed)
|
|
throws IOException {
|
|
if (packed) {
|
|
output.writeTag(fieldNumber, WIRETYPE_LENGTH_DELIMITED);
|
|
|
|
// Compute and write the length of the data.
|
|
int dataSize = 0;
|
|
for (int i = 0; i < value.size(); ++i) {
|
|
dataSize += CodedOutputStream.computeDoubleSizeNoTag(value.get(i));
|
|
}
|
|
output.writeUInt32NoTag(dataSize);
|
|
|
|
// Write the data itself, without any tags.
|
|
for (int i = 0; i < value.size(); ++i) {
|
|
output.writeDoubleNoTag(value.get(i));
|
|
}
|
|
} else {
|
|
for (int i = 0; i < value.size(); ++i) {
|
|
output.writeDouble(fieldNumber, value.get(i));
|
|
}
|
|
}
|
|
}
|
|
|
|
@Override
|
|
public void writeEnumList(int fieldNumber, List<Integer> value, boolean packed)
|
|
throws IOException {
|
|
if (packed) {
|
|
output.writeTag(fieldNumber, WIRETYPE_LENGTH_DELIMITED);
|
|
|
|
// Compute and write the length of the data.
|
|
int dataSize = 0;
|
|
for (int i = 0; i < value.size(); ++i) {
|
|
dataSize += CodedOutputStream.computeEnumSizeNoTag(value.get(i));
|
|
}
|
|
output.writeUInt32NoTag(dataSize);
|
|
|
|
// Write the data itself, without any tags.
|
|
for (int i = 0; i < value.size(); ++i) {
|
|
output.writeEnumNoTag(value.get(i));
|
|
}
|
|
} else {
|
|
for (int i = 0; i < value.size(); ++i) {
|
|
output.writeEnum(fieldNumber, value.get(i));
|
|
}
|
|
}
|
|
}
|
|
|
|
@Override
|
|
public void writeBoolList(int fieldNumber, List<Boolean> value, boolean packed)
|
|
throws IOException {
|
|
if (value instanceof BooleanArrayList) {
|
|
writeBoolListInternal(fieldNumber, (BooleanArrayList) value, packed);
|
|
} else {
|
|
writeBoolListInternal(fieldNumber, value, packed);
|
|
}
|
|
}
|
|
|
|
private void writeBoolListInternal(int fieldNumber, BooleanArrayList value, boolean packed)
|
|
throws IOException {
|
|
if (packed) {
|
|
output.writeTag(fieldNumber, WIRETYPE_LENGTH_DELIMITED);
|
|
|
|
// Compute and write the length of the data.
|
|
int dataSize = 0;
|
|
for (int i = 0; i < value.size(); ++i) {
|
|
dataSize += CodedOutputStream.computeBoolSizeNoTag(value.getBoolean(i));
|
|
}
|
|
output.writeUInt32NoTag(dataSize);
|
|
|
|
// Write the data itself, without any tags.
|
|
for (int i = 0; i < value.size(); ++i) {
|
|
output.writeBoolNoTag(value.getBoolean(i));
|
|
}
|
|
} else {
|
|
for (int i = 0; i < value.size(); ++i) {
|
|
output.writeBool(fieldNumber, value.getBoolean(i));
|
|
}
|
|
}
|
|
}
|
|
|
|
private void writeBoolListInternal(int fieldNumber, List<Boolean> value, boolean packed)
|
|
throws IOException {
|
|
if (packed) {
|
|
output.writeTag(fieldNumber, WIRETYPE_LENGTH_DELIMITED);
|
|
|
|
// Compute and write the length of the data.
|
|
int dataSize = 0;
|
|
for (int i = 0; i < value.size(); ++i) {
|
|
dataSize += CodedOutputStream.computeBoolSizeNoTag(value.get(i));
|
|
}
|
|
output.writeUInt32NoTag(dataSize);
|
|
|
|
// Write the data itself, without any tags.
|
|
for (int i = 0; i < value.size(); ++i) {
|
|
output.writeBoolNoTag(value.get(i));
|
|
}
|
|
} else {
|
|
for (int i = 0; i < value.size(); ++i) {
|
|
output.writeBool(fieldNumber, value.get(i));
|
|
}
|
|
}
|
|
}
|
|
|
|
@Override
|
|
public void writeStringList(int fieldNumber, List<String> value) throws IOException {
|
|
if (value instanceof LazyStringList) {
|
|
final LazyStringList lazyList = (LazyStringList) value;
|
|
for (int i = 0; i < value.size(); ++i) {
|
|
writeLazyString(fieldNumber, lazyList.getRaw(i));
|
|
}
|
|
} else {
|
|
for (int i = 0; i < value.size(); ++i) {
|
|
output.writeString(fieldNumber, value.get(i));
|
|
}
|
|
}
|
|
}
|
|
|
|
private void writeLazyString(int fieldNumber, Object value) throws IOException {
|
|
if (value instanceof String) {
|
|
output.writeString(fieldNumber, (String) value);
|
|
} else {
|
|
output.writeBytes(fieldNumber, (ByteString) value);
|
|
}
|
|
}
|
|
|
|
@Override
|
|
public void writeBytesList(int fieldNumber, List<ByteString> value) throws IOException {
|
|
for (int i = 0; i < value.size(); ++i) {
|
|
output.writeBytes(fieldNumber, value.get(i));
|
|
}
|
|
}
|
|
|
|
@Override
|
|
public void writeUInt32List(int fieldNumber, List<Integer> value, boolean packed)
|
|
throws IOException {
|
|
if (value instanceof IntArrayList) {
|
|
writeUInt32ListInternal(fieldNumber, (IntArrayList) value, packed);
|
|
} else {
|
|
writeUInt32ListInternal(fieldNumber, value, packed);
|
|
}
|
|
}
|
|
|
|
private void writeUInt32ListInternal(int fieldNumber, IntArrayList value, boolean packed)
|
|
throws IOException {
|
|
if (packed) {
|
|
output.writeTag(fieldNumber, WIRETYPE_LENGTH_DELIMITED);
|
|
|
|
// Compute and write the length of the data.
|
|
int dataSize = 0;
|
|
for (int i = 0; i < value.size(); ++i) {
|
|
dataSize += CodedOutputStream.computeUInt32SizeNoTag(value.getInt(i));
|
|
}
|
|
output.writeUInt32NoTag(dataSize);
|
|
|
|
// Write the data itself, without any tags.
|
|
for (int i = 0; i < value.size(); ++i) {
|
|
output.writeUInt32NoTag(value.getInt(i));
|
|
}
|
|
} else {
|
|
for (int i = 0; i < value.size(); ++i) {
|
|
output.writeUInt32(fieldNumber, value.getInt(i));
|
|
}
|
|
}
|
|
}
|
|
|
|
public void writeUInt32ListInternal(int fieldNumber, List<Integer> value, boolean packed)
|
|
throws IOException {
|
|
if (packed) {
|
|
output.writeTag(fieldNumber, WIRETYPE_LENGTH_DELIMITED);
|
|
|
|
// Compute and write the length of the data.
|
|
int dataSize = 0;
|
|
for (int i = 0; i < value.size(); ++i) {
|
|
dataSize += CodedOutputStream.computeUInt32SizeNoTag(value.get(i));
|
|
}
|
|
output.writeUInt32NoTag(dataSize);
|
|
|
|
// Write the data itself, without any tags.
|
|
for (int i = 0; i < value.size(); ++i) {
|
|
output.writeUInt32NoTag(value.get(i));
|
|
}
|
|
} else {
|
|
for (int i = 0; i < value.size(); ++i) {
|
|
output.writeUInt32(fieldNumber, value.get(i));
|
|
}
|
|
}
|
|
}
|
|
|
|
@Override
|
|
public void writeSFixed32List(int fieldNumber, List<Integer> value, boolean packed)
|
|
throws IOException {
|
|
if (value instanceof IntArrayList) {
|
|
writeSFixed32ListInternal(fieldNumber, (IntArrayList) value, packed);
|
|
} else {
|
|
writeSFixed32ListInternal(fieldNumber, value, packed);
|
|
}
|
|
}
|
|
|
|
private void writeSFixed32ListInternal(int fieldNumber, IntArrayList value, boolean packed)
|
|
throws IOException {
|
|
if (packed) {
|
|
output.writeTag(fieldNumber, WIRETYPE_LENGTH_DELIMITED);
|
|
|
|
// Compute and write the length of the data.
|
|
int dataSize = 0;
|
|
for (int i = 0; i < value.size(); ++i) {
|
|
dataSize += CodedOutputStream.computeSFixed32SizeNoTag(value.getInt(i));
|
|
}
|
|
output.writeUInt32NoTag(dataSize);
|
|
|
|
// Write the data itself, without any tags.
|
|
for (int i = 0; i < value.size(); ++i) {
|
|
output.writeSFixed32NoTag(value.getInt(i));
|
|
}
|
|
} else {
|
|
for (int i = 0; i < value.size(); ++i) {
|
|
output.writeSFixed32(fieldNumber, value.getInt(i));
|
|
}
|
|
}
|
|
}
|
|
|
|
private void writeSFixed32ListInternal(int fieldNumber, List<Integer> value, boolean packed)
|
|
throws IOException {
|
|
if (packed) {
|
|
output.writeTag(fieldNumber, WIRETYPE_LENGTH_DELIMITED);
|
|
|
|
// Compute and write the length of the data.
|
|
int dataSize = 0;
|
|
for (int i = 0; i < value.size(); ++i) {
|
|
dataSize += CodedOutputStream.computeSFixed32SizeNoTag(value.get(i));
|
|
}
|
|
output.writeUInt32NoTag(dataSize);
|
|
|
|
// Write the data itself, without any tags.
|
|
for (int i = 0; i < value.size(); ++i) {
|
|
output.writeSFixed32NoTag(value.get(i));
|
|
}
|
|
} else {
|
|
for (int i = 0; i < value.size(); ++i) {
|
|
output.writeSFixed32(fieldNumber, value.get(i));
|
|
}
|
|
}
|
|
}
|
|
|
|
@Override
|
|
public void writeSFixed64List(int fieldNumber, List<Long> value, boolean packed)
|
|
throws IOException {
|
|
if (value instanceof LongArrayList) {
|
|
writeSFixed64ListInternal(fieldNumber, (LongArrayList) value, packed);
|
|
} else {
|
|
writeSFixed64ListInternal(fieldNumber, value, packed);
|
|
}
|
|
}
|
|
|
|
private void writeSFixed64ListInternal(int fieldNumber, LongArrayList value, boolean packed)
|
|
throws IOException {
|
|
if (packed) {
|
|
output.writeTag(fieldNumber, WIRETYPE_LENGTH_DELIMITED);
|
|
|
|
// Compute and write the length of the data.
|
|
int dataSize = 0;
|
|
for (int i = 0; i < value.size(); ++i) {
|
|
dataSize += CodedOutputStream.computeSFixed64SizeNoTag(value.getLong(i));
|
|
}
|
|
output.writeUInt32NoTag(dataSize);
|
|
|
|
// Write the data itself, without any tags.
|
|
for (int i = 0; i < value.size(); ++i) {
|
|
output.writeSFixed64NoTag(value.getLong(i));
|
|
}
|
|
} else {
|
|
for (int i = 0; i < value.size(); ++i) {
|
|
output.writeSFixed64(fieldNumber, value.getLong(i));
|
|
}
|
|
}
|
|
}
|
|
|
|
private void writeSFixed64ListInternal(int fieldNumber, List<Long> value, boolean packed)
|
|
throws IOException {
|
|
if (packed) {
|
|
output.writeTag(fieldNumber, WIRETYPE_LENGTH_DELIMITED);
|
|
|
|
// Compute and write the length of the data.
|
|
int dataSize = 0;
|
|
for (int i = 0; i < value.size(); ++i) {
|
|
dataSize += CodedOutputStream.computeSFixed64SizeNoTag(value.get(i));
|
|
}
|
|
output.writeUInt32NoTag(dataSize);
|
|
|
|
// Write the data itself, without any tags.
|
|
for (int i = 0; i < value.size(); ++i) {
|
|
output.writeSFixed64NoTag(value.get(i));
|
|
}
|
|
} else {
|
|
for (int i = 0; i < value.size(); ++i) {
|
|
output.writeSFixed64(fieldNumber, value.get(i));
|
|
}
|
|
}
|
|
}
|
|
|
|
@Override
|
|
public void writeSInt32List(int fieldNumber, List<Integer> value, boolean packed)
|
|
throws IOException {
|
|
if (value instanceof IntArrayList) {
|
|
writeSInt32ListInternal(fieldNumber, (IntArrayList) value, packed);
|
|
} else {
|
|
writeSInt32ListInternal(fieldNumber, value, packed);
|
|
}
|
|
}
|
|
|
|
private void writeSInt32ListInternal(int fieldNumber, IntArrayList value, boolean packed)
|
|
throws IOException {
|
|
if (packed) {
|
|
output.writeTag(fieldNumber, WIRETYPE_LENGTH_DELIMITED);
|
|
|
|
// Compute and write the length of the data.
|
|
int dataSize = 0;
|
|
for (int i = 0; i < value.size(); ++i) {
|
|
dataSize += CodedOutputStream.computeSInt32SizeNoTag(value.getInt(i));
|
|
}
|
|
output.writeUInt32NoTag(dataSize);
|
|
|
|
// Write the data itself, without any tags.
|
|
for (int i = 0; i < value.size(); ++i) {
|
|
output.writeSInt32NoTag(value.getInt(i));
|
|
}
|
|
} else {
|
|
for (int i = 0; i < value.size(); ++i) {
|
|
output.writeSInt32(fieldNumber, value.getInt(i));
|
|
}
|
|
}
|
|
}
|
|
|
|
public void writeSInt32ListInternal(int fieldNumber, List<Integer> value, boolean packed)
|
|
throws IOException {
|
|
if (packed) {
|
|
output.writeTag(fieldNumber, WIRETYPE_LENGTH_DELIMITED);
|
|
|
|
// Compute and write the length of the data.
|
|
int dataSize = 0;
|
|
for (int i = 0; i < value.size(); ++i) {
|
|
dataSize += CodedOutputStream.computeSInt32SizeNoTag(value.get(i));
|
|
}
|
|
output.writeUInt32NoTag(dataSize);
|
|
|
|
// Write the data itself, without any tags.
|
|
for (int i = 0; i < value.size(); ++i) {
|
|
output.writeSInt32NoTag(value.get(i));
|
|
}
|
|
} else {
|
|
for (int i = 0; i < value.size(); ++i) {
|
|
output.writeSInt32(fieldNumber, value.get(i));
|
|
}
|
|
}
|
|
}
|
|
|
|
@Override
|
|
public void writeSInt64List(int fieldNumber, List<Long> value, boolean packed)
|
|
throws IOException {
|
|
if (value instanceof LongArrayList) {
|
|
writeSInt64ListInternal(fieldNumber, (LongArrayList) value, packed);
|
|
} else {
|
|
writeSInt64ListInternal(fieldNumber, value, packed);
|
|
}
|
|
}
|
|
|
|
private void writeSInt64ListInternal(int fieldNumber, LongArrayList value, boolean packed)
|
|
throws IOException {
|
|
if (packed) {
|
|
output.writeTag(fieldNumber, WIRETYPE_LENGTH_DELIMITED);
|
|
|
|
// Compute and write the length of the data.
|
|
int dataSize = 0;
|
|
for (int i = 0; i < value.size(); ++i) {
|
|
dataSize += CodedOutputStream.computeSInt64SizeNoTag(value.getLong(i));
|
|
}
|
|
output.writeUInt32NoTag(dataSize);
|
|
|
|
// Write the data itself, without any tags.
|
|
for (int i = 0; i < value.size(); ++i) {
|
|
output.writeSInt64NoTag(value.getLong(i));
|
|
}
|
|
} else {
|
|
for (int i = 0; i < value.size(); ++i) {
|
|
output.writeSInt64(fieldNumber, value.getLong(i));
|
|
}
|
|
}
|
|
}
|
|
|
|
private void writeSInt64ListInternal(int fieldNumber, List<Long> value, boolean packed)
|
|
throws IOException {
|
|
if (packed) {
|
|
output.writeTag(fieldNumber, WIRETYPE_LENGTH_DELIMITED);
|
|
|
|
// Compute and write the length of the data.
|
|
int dataSize = 0;
|
|
for (int i = 0; i < value.size(); ++i) {
|
|
dataSize += CodedOutputStream.computeSInt64SizeNoTag(value.get(i));
|
|
}
|
|
output.writeUInt32NoTag(dataSize);
|
|
|
|
// Write the data itself, without any tags.
|
|
for (int i = 0; i < value.size(); ++i) {
|
|
output.writeSInt64NoTag(value.get(i));
|
|
}
|
|
} else {
|
|
for (int i = 0; i < value.size(); ++i) {
|
|
output.writeSInt64(fieldNumber, value.get(i));
|
|
}
|
|
}
|
|
}
|
|
|
|
@Override
|
|
public void writeMessageList(int fieldNumber, List<?> value) throws IOException {
|
|
for (int i = 0; i < value.size(); ++i) {
|
|
writeMessage(fieldNumber, value.get(i));
|
|
}
|
|
}
|
|
|
|
@Override
|
|
public void writeMessageList(int fieldNumber, List<?> value, Schema schema) throws IOException {
|
|
for (int i = 0; i < value.size(); ++i) {
|
|
writeMessage(fieldNumber, value.get(i), schema);
|
|
}
|
|
}
|
|
|
|
@Deprecated
|
|
@Override
|
|
public void writeGroupList(int fieldNumber, List<?> value) throws IOException {
|
|
for (int i = 0; i < value.size(); ++i) {
|
|
writeGroup(fieldNumber, value.get(i));
|
|
}
|
|
}
|
|
|
|
@Override
|
|
public void writeGroupList(int fieldNumber, List<?> value, Schema schema) throws IOException {
|
|
for (int i = 0; i < value.size(); ++i) {
|
|
writeGroup(fieldNumber, value.get(i), schema);
|
|
}
|
|
}
|
|
|
|
@Override
|
|
public <K, V> void writeMap(int fieldNumber, MapEntryLite.Metadata<K, V> metadata, Map<K, V> map)
|
|
throws IOException {
|
|
if (output.isSerializationDeterministic()) {
|
|
writeDeterministicMap(fieldNumber, metadata, map);
|
|
return;
|
|
}
|
|
for (Map.Entry<K, V> entry : map.entrySet()) {
|
|
output.writeTag(fieldNumber, WIRETYPE_LENGTH_DELIMITED);
|
|
output.writeUInt32NoTag(
|
|
MapEntryLite.computeSerializedSize(metadata, entry.getKey(), entry.getValue()));
|
|
MapEntryLite.writeTo(output, metadata, entry.getKey(), entry.getValue());
|
|
}
|
|
}
|
|
|
|
@SuppressWarnings("unchecked")
|
|
private <K, V> void writeDeterministicMap(
|
|
int fieldNumber, MapEntryLite.Metadata<K, V> metadata, Map<K, V> map) throws IOException {
|
|
switch (metadata.keyType) {
|
|
case BOOL:
|
|
V value;
|
|
if ((value = map.get(Boolean.FALSE)) != null) {
|
|
writeDeterministicBooleanMapEntry(
|
|
fieldNumber, /* key= */ false, value, (MapEntryLite.Metadata<Boolean, V>) metadata);
|
|
}
|
|
if ((value = map.get(Boolean.TRUE)) != null) {
|
|
writeDeterministicBooleanMapEntry(
|
|
fieldNumber, /* key= */ true, value, (MapEntryLite.Metadata<Boolean, V>) metadata);
|
|
}
|
|
break;
|
|
case FIXED32:
|
|
case INT32:
|
|
case SFIXED32:
|
|
case SINT32:
|
|
case UINT32:
|
|
writeDeterministicIntegerMap(
|
|
fieldNumber, (MapEntryLite.Metadata<Integer, V>) metadata, (Map<Integer, V>) map);
|
|
break;
|
|
case FIXED64:
|
|
case INT64:
|
|
case SFIXED64:
|
|
case SINT64:
|
|
case UINT64:
|
|
writeDeterministicLongMap(
|
|
fieldNumber, (MapEntryLite.Metadata<Long, V>) metadata, (Map<Long, V>) map);
|
|
break;
|
|
case STRING:
|
|
writeDeterministicStringMap(
|
|
fieldNumber, (MapEntryLite.Metadata<String, V>) metadata, (Map<String, V>) map);
|
|
break;
|
|
default:
|
|
throw new IllegalArgumentException("does not support key type: " + metadata.keyType);
|
|
}
|
|
}
|
|
|
|
private <V> void writeDeterministicBooleanMapEntry(
|
|
int fieldNumber, boolean key, V value, MapEntryLite.Metadata<Boolean, V> metadata)
|
|
throws IOException {
|
|
output.writeTag(fieldNumber, WIRETYPE_LENGTH_DELIMITED);
|
|
output.writeUInt32NoTag(MapEntryLite.computeSerializedSize(metadata, key, value));
|
|
MapEntryLite.writeTo(output, metadata, key, value);
|
|
}
|
|
|
|
private <V> void writeDeterministicIntegerMap(
|
|
int fieldNumber, MapEntryLite.Metadata<Integer, V> metadata, Map<Integer, V> map)
|
|
throws IOException {
|
|
int[] keys = new int[map.size()];
|
|
int index = 0;
|
|
for (int k : map.keySet()) {
|
|
keys[index++] = k;
|
|
}
|
|
Arrays.sort(keys);
|
|
for (int key : keys) {
|
|
V value = map.get(key);
|
|
output.writeTag(fieldNumber, WIRETYPE_LENGTH_DELIMITED);
|
|
output.writeUInt32NoTag(MapEntryLite.computeSerializedSize(metadata, key, value));
|
|
MapEntryLite.writeTo(output, metadata, key, value);
|
|
}
|
|
}
|
|
|
|
private <V> void writeDeterministicLongMap(
|
|
int fieldNumber, MapEntryLite.Metadata<Long, V> metadata, Map<Long, V> map)
|
|
throws IOException {
|
|
long[] keys = new long[map.size()];
|
|
int index = 0;
|
|
for (long k : map.keySet()) {
|
|
keys[index++] = k;
|
|
}
|
|
Arrays.sort(keys);
|
|
for (long key : keys) {
|
|
V value = map.get(key);
|
|
output.writeTag(fieldNumber, WIRETYPE_LENGTH_DELIMITED);
|
|
output.writeUInt32NoTag(MapEntryLite.computeSerializedSize(metadata, key, value));
|
|
MapEntryLite.writeTo(output, metadata, key, value);
|
|
}
|
|
}
|
|
|
|
private <V> void writeDeterministicStringMap(
|
|
int fieldNumber, MapEntryLite.Metadata<String, V> metadata, Map<String, V> map)
|
|
throws IOException {
|
|
String[] keys = new String[map.size()];
|
|
int index = 0;
|
|
for (String k : map.keySet()) {
|
|
keys[index++] = k;
|
|
}
|
|
Arrays.sort(keys);
|
|
for (String key : keys) {
|
|
V value = map.get(key);
|
|
output.writeTag(fieldNumber, WIRETYPE_LENGTH_DELIMITED);
|
|
output.writeUInt32NoTag(MapEntryLite.computeSerializedSize(metadata, key, value));
|
|
MapEntryLite.writeTo(output, metadata, key, value);
|
|
}
|
|
}
|
|
}
|