aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/google/protobuf/compiler/csharp/csharp_repeated_primitive_field.cc
diff options
context:
space:
mode:
authorGravatar Jon Skeet <skeet@pobox.com>2015-06-17 14:59:10 +0100
committerGravatar Jon Skeet <skeet@pobox.com>2015-06-17 14:59:10 +0100
commit828b7e61d0443832d99002fbda12a359e5f9f221 (patch)
tree1f271cdb345b968dba08947b9319ba7d738f3476 /src/google/protobuf/compiler/csharp/csharp_repeated_primitive_field.cc
parentfb1547b3884ace3be6acf9e947686d627ff90179 (diff)
Use the fact that we know the tag size and bytes at codegen time to optimize.
Diffstat (limited to 'src/google/protobuf/compiler/csharp/csharp_repeated_primitive_field.cc')
-rw-r--r--src/google/protobuf/compiler/csharp/csharp_repeated_primitive_field.cc21
1 files changed, 16 insertions, 5 deletions
diff --git a/src/google/protobuf/compiler/csharp/csharp_repeated_primitive_field.cc b/src/google/protobuf/compiler/csharp/csharp_repeated_primitive_field.cc
index a5457785..fe8a4364 100644
--- a/src/google/protobuf/compiler/csharp/csharp_repeated_primitive_field.cc
+++ b/src/google/protobuf/compiler/csharp/csharp_repeated_primitive_field.cc
@@ -82,9 +82,20 @@ void RepeatedPrimitiveFieldGenerator::GenerateSerializationCode(
io::Printer* printer) {
printer->Print(
variables_,
- "if ($name$_.Count > 0) {\n"
- " output.Write$packed$$capitalized_type_name$Array($number$, $name$_);\n"
- "}\n");
+ "if ($name$_.Count > 0) {\n");
+ printer->Indent();
+ if (descriptor_->is_packed()) {
+ printer->Print(
+ variables_,
+ "output.WriteRawTag($tag_bytes$);\n"
+ "output.WritePacked$capitalized_type_name$Array($name$_);\n");
+ } else {
+ printer->Print(
+ variables_,
+ "output.Write$capitalized_type_name$Array($number$, $name$_);\n");
+ }
+ printer->Outdent();
+ printer->Print("}\n");
}
void RepeatedPrimitiveFieldGenerator::GenerateSerializedSizeCode(
@@ -100,7 +111,7 @@ void RepeatedPrimitiveFieldGenerator::GenerateSerializedSizeCode(
printer->Print(
variables_,
"foreach ($type_name$ element in $name$_) {\n"
- " dataSize += pb::CodedOutputStream.Compute$capitalized_type_name$SizeNoTag(element);\n"
+ " dataSize += pb::CodedOutputStream.Compute$capitalized_type_name$Size(element);\n"
"}\n");
} else {
printer->Print(
@@ -111,7 +122,7 @@ void RepeatedPrimitiveFieldGenerator::GenerateSerializedSizeCode(
int tagSize = internal::WireFormat::TagSize(descriptor_->number(), descriptor_->type());
if (descriptor_->is_packed()) {
printer->Print(
- "size += $tag_size$ + pb::CodedOutputStream.ComputeInt32SizeNoTag(dataSize);\n",
+ "size += $tag_size$ + pb::CodedOutputStream.ComputeInt32Size(dataSize);\n",
"tag_size", SimpleItoa(tagSize));
} else {
printer->Print(