From de6aba9f639ced3dce03310121aa69c914eb7b0e Mon Sep 17 00:00:00 2001 From: Protobuf Team Bot Date: Sun, 28 Apr 2024 17:27:38 -0700 Subject: [PATCH] Java Proto Lite: Serialize repeated enums without allocating Serialize repeated enums without allocating PiperOrigin-RevId: 628915124 --- .../protobuf/CodedOutputStreamWriter.java | 32 +++++++++++++++++++ 1 file changed, 32 insertions(+) diff --git a/java/core/src/main/java/com/google/protobuf/CodedOutputStreamWriter.java b/java/core/src/main/java/com/google/protobuf/CodedOutputStreamWriter.java index 5368f5dede..a20a579e3e 100644 --- a/java/core/src/main/java/com/google/protobuf/CodedOutputStreamWriter.java +++ b/java/core/src/main/java/com/google/protobuf/CodedOutputStreamWriter.java @@ -557,6 +557,38 @@ final class CodedOutputStreamWriter implements Writer { @Override public void writeEnumList(int fieldNumber, List value, boolean packed) throws IOException { + if (value instanceof IntArrayList) { + writeEnumListInternal(fieldNumber, (IntArrayList) value, packed); + } else { + writeEnumListInternal(fieldNumber, value, packed); + } + } + + private void writeEnumListInternal(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.computeEnumSizeNoTag(value.getInt(i)); + } + output.writeUInt32NoTag(dataSize); + + // Write the data itself, without any tags. + for (int i = 0; i < value.size(); ++i) { + output.writeEnumNoTag(value.getInt(i)); + } + } else { + for (int i = 0; i < value.size(); ++i) { + output.writeEnum(fieldNumber, value.getInt(i)); + } + } + } + + private void writeEnumListInternal(int fieldNumber, List value, boolean packed) + throws IOException { if (packed) { output.writeTag(fieldNumber, WIRETYPE_LENGTH_DELIMITED);