aboutsummaryrefslogtreecommitdiff
path: root/src/google/protobuf/compiler/csharp/csharp_repeated_primitive_field.cc
diff options
context:
space:
mode:
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.cc137
1 files changed, 26 insertions, 111 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 e27458bb..cc787d50 100644
--- a/src/google/protobuf/compiler/csharp/csharp_repeated_primitive_field.cc
+++ b/src/google/protobuf/compiler/csharp/csharp_repeated_primitive_field.cc
@@ -49,6 +49,7 @@ namespace csharp {
RepeatedPrimitiveFieldGenerator::RepeatedPrimitiveFieldGenerator(
const FieldDescriptor* descriptor, int fieldOrdinal)
: FieldGeneratorBase(descriptor, fieldOrdinal) {
+ variables_["packed"] = descriptor->is_packed() ? "Packed" : "";
}
RepeatedPrimitiveFieldGenerator::~RepeatedPrimitiveFieldGenerator() {
@@ -56,122 +57,42 @@ RepeatedPrimitiveFieldGenerator::~RepeatedPrimitiveFieldGenerator() {
}
void RepeatedPrimitiveFieldGenerator::GenerateMembers(io::Printer* printer) {
- if (descriptor_->is_packed() && optimize_speed()) {
- printer->Print(variables_, "private int $name$MemoizedSerializedSize;\n");
- }
printer->Print(variables_,
- "private pbc::PopsicleList<$type_name$> $name$_ = new pbc::PopsicleList<$type_name$>();\n");
- AddPublicMemberAttributes(printer);
- printer->Print(
- variables_,
- "public scg::IList<$type_name$> $property_name$List {\n"
- " get { return pbc::Lists.AsReadOnly($name$_); }\n"
- "}\n");
-
- // TODO(jonskeet): Redundant API calls? Possibly - include for portability though. Maybe create an option.
- AddDeprecatedFlag(printer);
- printer->Print(
- variables_,
- "public int $property_name$Count {\n"
- " get { return $name$_.Count; }\n"
- "}\n");
-
- AddPublicMemberAttributes(printer);
- printer->Print(
- variables_,
- "public $type_name$ Get$property_name$(int index) {\n"
- " return $name$_[index];\n"
- "}\n");
-}
-
-void RepeatedPrimitiveFieldGenerator::GenerateBuilderMembers(io::Printer* printer) {
- // Note: We can return the original list here, because we make it unmodifiable when we build
- // We return it via IPopsicleList so that collection initializers work more pleasantly.
- AddPublicMemberAttributes(printer);
- printer->Print(
- variables_,
- "public pbc::IPopsicleList<$type_name$> $property_name$List {\n"
- " get { return PrepareBuilder().$name$_; }\n"
- "}\n");
- AddDeprecatedFlag(printer);
- printer->Print(
- variables_,
- "public int $property_name$Count {\n"
- " get { return result.$property_name$Count; }\n"
- "}\n");
- AddPublicMemberAttributes(printer);
- printer->Print(
- variables_,
- "public $type_name$ Get$property_name$(int index) {\n"
- " return result.Get$property_name$(index);\n"
- "}\n");
- AddPublicMemberAttributes(printer);
- printer->Print(
- variables_,
- "public Builder Set$property_name$(int index, $type_name$ value) {\n");
- AddNullCheck(printer);
- printer->Print(
- variables_,
- " PrepareBuilder();\n"
- " result.$name$_[index] = value;\n"
- " return this;\n"
- "}\n");
- AddPublicMemberAttributes(printer);
- printer->Print(
- variables_,
- "public Builder Add$property_name$($type_name$ value) {\n");
- AddNullCheck(printer);
- printer->Print(
- variables_,
- " PrepareBuilder();\n"
- " result.$name$_.Add(value);\n"
- " return this;\n"
- "}\n");
- AddPublicMemberAttributes(printer);
- printer->Print(
- variables_,
- "public Builder AddRange$property_name$(scg::IEnumerable<$type_name$> values) {\n"
- " PrepareBuilder();\n"
- " result.$name$_.Add(values);\n"
- " return this;\n"
- "}\n");
+ "private readonly pbc::RepeatedField<$type_name$> $name$_ = new pbc::RepeatedField<$type_name$>();\n");
AddDeprecatedFlag(printer);
printer->Print(
variables_,
- "public Builder Clear$property_name$() {\n"
- " PrepareBuilder();\n"
- " result.$name$_.Clear();\n"
- " return this;\n"
+ "public pbc::RepeatedField<$type_name$> $property_name$ {\n"
+ " get { return $name$_; }\n"
"}\n");
}
void RepeatedPrimitiveFieldGenerator::GenerateMergingCode(io::Printer* printer) {
printer->Print(
variables_,
- "if (other.$name$_.Count != 0) {\n"
- " result.$name$_.Add(other.$name$_);\n"
- "}\n");
-}
-
-void RepeatedPrimitiveFieldGenerator::GenerateBuildingCode(io::Printer* printer) {
- printer->Print(variables_, "$name$_.MakeReadOnly();\n");
+ "$name$_.Add(other.$name$_);\n");
}
void RepeatedPrimitiveFieldGenerator::GenerateParsingCode(io::Printer* printer) {
printer->Print(variables_,
- "input.Read$capitalized_type_name$Array(tag, field_name, result.$name$_);\n");
+ "input.Read$capitalized_type_name$Array($name$_);\n");
}
void RepeatedPrimitiveFieldGenerator::GenerateSerializationCode(
io::Printer* printer) {
- printer->Print(variables_, "if ($name$_.Count > 0) {\n");
+ printer->Print(
+ variables_,
+ "if ($name$_.Count > 0) {\n");
printer->Indent();
if (descriptor_->is_packed()) {
- printer->Print(variables_,
- "output.WritePacked$capitalized_type_name$Array($number$, field_names[$field_ordinal$], $name$MemoizedSerializedSize, $name$_);\n");
+ 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$, field_names[$field_ordinal$], $name$_);\n");
+ printer->Print(
+ variables_,
+ "output.Write$capitalized_type_name$Array($number$, $name$_);\n");
}
printer->Outdent();
printer->Print("}\n");
@@ -179,15 +100,18 @@ void RepeatedPrimitiveFieldGenerator::GenerateSerializationCode(
void RepeatedPrimitiveFieldGenerator::GenerateSerializedSizeCode(
io::Printer* printer) {
- printer->Print("{\n");
+ // TODO(jonskeet): Do this in the runtime if possible. It's a pain, but it must be feasible...
+ printer->Print(
+ "if ($name$_.Count > 0) {\n",
+ "name", name());
printer->Indent();
printer->Print("int dataSize = 0;\n");
int fixedSize = GetFixedSize(descriptor_->type());
if (fixedSize == -1) {
printer->Print(
variables_,
- "foreach ($type_name$ element in $property_name$List) {\n"
- " dataSize += pb::CodedOutputStream.Compute$capitalized_type_name$SizeNoTag(element);\n"
+ "foreach ($type_name$ element in $name$_) {\n"
+ " dataSize += pb::CodedOutputStream.Compute$capitalized_type_name$Size(element);\n"
"}\n");
} else {
printer->Print(
@@ -198,19 +122,13 @@ void RepeatedPrimitiveFieldGenerator::GenerateSerializedSizeCode(
int tagSize = internal::WireFormat::TagSize(descriptor_->number(), descriptor_->type());
if (descriptor_->is_packed()) {
printer->Print(
- "if ($name$_.Count != 0) {\n"
- " size += $tag_size$ + pb::CodedOutputStream.ComputeInt32SizeNoTag(dataSize);\n"
- "}\n",
- "name", name(), "tag_size", SimpleItoa(tagSize));
+ "size += $tag_size$ + pb::CodedOutputStream.ComputeInt32Size(dataSize);\n",
+ "tag_size", SimpleItoa(tagSize));
} else {
printer->Print(
"size += $tag_size$ * $name$_.Count;\n",
"tag_size", SimpleItoa(tagSize), "name", name());
}
- // cache the data size for packed fields.
- if (descriptor_->is_packed()) {
- printer->Print(variables_, "$name$MemoizedSerializedSize = dataSize;\n");
- }
printer->Outdent();
printer->Print("}\n");
}
@@ -218,15 +136,12 @@ void RepeatedPrimitiveFieldGenerator::GenerateSerializedSizeCode(
void RepeatedPrimitiveFieldGenerator::WriteHash(io::Printer* printer) {
printer->Print(
variables_,
- "foreach($type_name$ i in $name$_)\n"
- " hash ^= i.GetHashCode();\n");
+ "hash ^= $name$_.GetHashCode();\n");
}
void RepeatedPrimitiveFieldGenerator::WriteEquals(io::Printer* printer) {
printer->Print(
variables_,
- "if($name$_.Count != other.$name$_.Count) return false;\n"
- "for(int ix=0; ix < $name$_.Count; ix++)\n"
- " if(!$name$_[ix].Equals(other.$name$_[ix])) return false;\n");
+ "if(!$name$_.Equals(other.$name$_)) return false;\n");
}
void RepeatedPrimitiveFieldGenerator::WriteToString(io::Printer* printer) {
printer->Print(variables_,