diff options
author | csharptest <roger@csharptest.net> | 2011-06-03 21:35:02 -0500 |
---|---|---|
committer | rogerk <devnull@localhost> | 2011-06-03 21:35:02 -0500 |
commit | d2af9e923f4f2d7f7c56a2e74d5a26536aae0369 (patch) | |
tree | 786a89b7f356bf8e4d897453d6fe45dab80d2dea /src/ProtoGen/RepeatedEnumFieldGenerator.cs | |
parent | 9928441649bde7a5e3bb84808821f1a5bef0bba6 (diff) | |
download | protobuf-d2af9e923f4f2d7f7c56a2e74d5a26536aae0369.tar.gz protobuf-d2af9e923f4f2d7f7c56a2e74d5a26536aae0369.tar.bz2 protobuf-d2af9e923f4f2d7f7c56a2e74d5a26536aae0369.zip |
Refactoring of CodedInputStream.Read??? to use boolean return with out param.
Diffstat (limited to 'src/ProtoGen/RepeatedEnumFieldGenerator.cs')
-rw-r--r-- | src/ProtoGen/RepeatedEnumFieldGenerator.cs | 62 |
1 files changed, 38 insertions, 24 deletions
diff --git a/src/ProtoGen/RepeatedEnumFieldGenerator.cs b/src/ProtoGen/RepeatedEnumFieldGenerator.cs index e3fdd657..27aabf58 100644 --- a/src/ProtoGen/RepeatedEnumFieldGenerator.cs +++ b/src/ProtoGen/RepeatedEnumFieldGenerator.cs @@ -112,36 +112,50 @@ namespace Google.ProtocolBuffers.ProtoGen public void GenerateParsingCode(TextGenerator writer)
{
- // If packed, set up the while loop
- if (Descriptor.IsPacked)
- {
- writer.WriteLine("int length = input.ReadInt32();");
- writer.WriteLine("int oldLimit = input.PushLimit(length);");
- writer.WriteLine("while (!input.ReachedLimit) {");
- writer.Indent();
- }
-
- // Read and store the enum
- // TODO(jonskeet): Make a more efficient way of doing this
- writer.WriteLine("int rawValue = input.ReadEnum();");
- writer.WriteLine("if (!global::System.Enum.IsDefined(typeof({0}), rawValue)) {{", TypeName);
+ writer.WriteLine("scg::ICollection<object> unknownItems;");
+ writer.WriteLine("input.ReadEnumArray<{0}>(tag, field_name, result.{1}_, out unknownItems);", TypeName, Name);
if (!UseLiteRuntime)
{
- writer.WriteLine(" if (unknownFields == null) {"); // First unknown field - create builder now
+ writer.WriteLine("if (unknownItems != null) {");
+ writer.WriteLine(" if (unknownFields == null) {");
writer.WriteLine(" unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);");
writer.WriteLine(" }");
- writer.WriteLine(" unknownFields.MergeVarintField({0}, (ulong) rawValue);", Number);
- }
- writer.WriteLine("} else {");
- writer.WriteLine(" Add{0}(({1}) rawValue);", PropertyName, TypeName);
- writer.WriteLine("}");
-
- if (Descriptor.IsPacked)
- {
- writer.Outdent();
+ writer.WriteLine(" foreach (object rawValue in unknownItems)");
+ writer.WriteLine(" if (rawValue is int)");
+ writer.WriteLine(" unknownFields.MergeVarintField({0}, (ulong)(int)rawValue);", Number);
writer.WriteLine("}");
- writer.WriteLine("input.PopLimit(oldLimit);");
}
+
+ //// If packed, set up the while loop
+ //if (Descriptor.IsPacked)
+ //{
+ // writer.WriteLine("int length = input.ReadInt32();");
+ // writer.WriteLine("int oldLimit = input.PushLimit(length);");
+ // writer.WriteLine("while (!input.ReachedLimit) {");
+ // writer.Indent();
+ //}
+
+ //// Read and store the enum
+ //// TO DO(jonskeet): Make a more efficient way of doing this
+ //writer.WriteLine("int rawValue = input.ReadEnum();");
+ //writer.WriteLine("if (!global::System.Enum.IsDefined(typeof({0}), rawValue)) {{", TypeName);
+ //if (!UseLiteRuntime)
+ //{
+ // writer.WriteLine(" if (unknownFields == null) {"); // First unknown field - create builder now
+ // writer.WriteLine(" unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);");
+ // writer.WriteLine(" }");
+ // writer.WriteLine(" unknownFields.MergeVarintField({0}, (ulong) rawValue);", Number);
+ //}
+ //writer.WriteLine("} else {");
+ //writer.WriteLine(" Add{0}(({1}) rawValue);", PropertyName, TypeName);
+ //writer.WriteLine("}");
+
+ //if (Descriptor.IsPacked)
+ //{
+ // writer.Outdent();
+ // writer.WriteLine("}");
+ // writer.WriteLine("input.PopLimit(oldLimit);");
+ //}
}
public void GenerateSerializationCode(TextGenerator writer)
|