Skip to content

Commit de6aba9

Browse files
Java Proto Lite: Serialize repeated enums without allocating
Serialize repeated enums without allocating PiperOrigin-RevId: 628915124
1 parent b3e7a00 commit de6aba9

File tree

1 file changed

+32
-0
lines changed

1 file changed

+32
-0
lines changed

java/core/src/main/java/com/google/protobuf/CodedOutputStreamWriter.java

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -557,6 +557,38 @@ private void writeDoubleListInternal(int fieldNumber, List<Double> value, boolea
557557
@Override
558558
public void writeEnumList(int fieldNumber, List<Integer> value, boolean packed)
559559
throws IOException {
560+
if (value instanceof IntArrayList) {
561+
writeEnumListInternal(fieldNumber, (IntArrayList) value, packed);
562+
} else {
563+
writeEnumListInternal(fieldNumber, value, packed);
564+
}
565+
}
566+
567+
private void writeEnumListInternal(int fieldNumber, IntArrayList value, boolean packed)
568+
throws IOException {
569+
if (packed) {
570+
output.writeTag(fieldNumber, WIRETYPE_LENGTH_DELIMITED);
571+
572+
// Compute and write the length of the data.
573+
int dataSize = 0;
574+
for (int i = 0; i < value.size(); ++i) {
575+
dataSize += CodedOutputStream.computeEnumSizeNoTag(value.getInt(i));
576+
}
577+
output.writeUInt32NoTag(dataSize);
578+
579+
// Write the data itself, without any tags.
580+
for (int i = 0; i < value.size(); ++i) {
581+
output.writeEnumNoTag(value.getInt(i));
582+
}
583+
} else {
584+
for (int i = 0; i < value.size(); ++i) {
585+
output.writeEnum(fieldNumber, value.getInt(i));
586+
}
587+
}
588+
}
589+
590+
private void writeEnumListInternal(int fieldNumber, List<Integer> value, boolean packed)
591+
throws IOException {
560592
if (packed) {
561593
output.writeTag(fieldNumber, WIRETYPE_LENGTH_DELIMITED);
562594

0 commit comments

Comments
 (0)