Avoid creating UnknownFieldSets unless we really have to.
diff --git a/src/ProtocolBuffers/DescriptorProtos/DescriptorProtoFile.cs b/src/ProtocolBuffers/DescriptorProtos/DescriptorProtoFile.cs
index 927d4ae..b02c5ce 100644
--- a/src/ProtocolBuffers/DescriptorProtos/DescriptorProtoFile.cs
+++ b/src/ProtocolBuffers/DescriptorProtos/DescriptorProtoFile.cs
@@ -344,19 +344,27 @@
}
public override Builder MergeFrom(pb::CodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
- pb::UnknownFieldSet.Builder unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+ pb::UnknownFieldSet.Builder unknownFields = null;
while (true) {
uint tag = input.ReadTag();
switch (tag) {
case 0: {
- this.UnknownFields = unknownFields.Build();
+ if (unknownFields != null) {
+ this.UnknownFields = unknownFields.Build();
+ }
return this;
}
default: {
- if (!ParseUnknownField(input, unknownFields, extensionRegistry, tag)) {
- this.UnknownFields = unknownFields.Build();
+ if (pb::WireFormat.IsEndGroupTag(tag)) {
+ if (unknownFields != null) {
+ this.UnknownFields = unknownFields.Build();
+ }
return this;
}
+ if (unknownFields == null) {
+ unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+ }
+ ParseUnknownField(input, unknownFields, extensionRegistry, tag);
break;
}
case 10: {
@@ -722,19 +730,27 @@
}
public override Builder MergeFrom(pb::CodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
- pb::UnknownFieldSet.Builder unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+ pb::UnknownFieldSet.Builder unknownFields = null;
while (true) {
uint tag = input.ReadTag();
switch (tag) {
case 0: {
- this.UnknownFields = unknownFields.Build();
+ if (unknownFields != null) {
+ this.UnknownFields = unknownFields.Build();
+ }
return this;
}
default: {
- if (!ParseUnknownField(input, unknownFields, extensionRegistry, tag)) {
- this.UnknownFields = unknownFields.Build();
+ if (pb::WireFormat.IsEndGroupTag(tag)) {
+ if (unknownFields != null) {
+ this.UnknownFields = unknownFields.Build();
+ }
return this;
}
+ if (unknownFields == null) {
+ unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+ }
+ ParseUnknownField(input, unknownFields, extensionRegistry, tag);
break;
}
case 10: {
@@ -1234,19 +1250,27 @@
}
public override Builder MergeFrom(pb::CodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
- pb::UnknownFieldSet.Builder unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+ pb::UnknownFieldSet.Builder unknownFields = null;
while (true) {
uint tag = input.ReadTag();
switch (tag) {
case 0: {
- this.UnknownFields = unknownFields.Build();
+ if (unknownFields != null) {
+ this.UnknownFields = unknownFields.Build();
+ }
return this;
}
default: {
- if (!ParseUnknownField(input, unknownFields, extensionRegistry, tag)) {
- this.UnknownFields = unknownFields.Build();
+ if (pb::WireFormat.IsEndGroupTag(tag)) {
+ if (unknownFields != null) {
+ this.UnknownFields = unknownFields.Build();
+ }
return this;
}
+ if (unknownFields == null) {
+ unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+ }
+ ParseUnknownField(input, unknownFields, extensionRegistry, tag);
break;
}
case 8: {
@@ -1568,19 +1592,27 @@
}
public override Builder MergeFrom(pb::CodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
- pb::UnknownFieldSet.Builder unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+ pb::UnknownFieldSet.Builder unknownFields = null;
while (true) {
uint tag = input.ReadTag();
switch (tag) {
case 0: {
- this.UnknownFields = unknownFields.Build();
+ if (unknownFields != null) {
+ this.UnknownFields = unknownFields.Build();
+ }
return this;
}
default: {
- if (!ParseUnknownField(input, unknownFields, extensionRegistry, tag)) {
- this.UnknownFields = unknownFields.Build();
+ if (pb::WireFormat.IsEndGroupTag(tag)) {
+ if (unknownFields != null) {
+ this.UnknownFields = unknownFields.Build();
+ }
return this;
}
+ if (unknownFields == null) {
+ unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+ }
+ ParseUnknownField(input, unknownFields, extensionRegistry, tag);
break;
}
case 10: {
@@ -2188,19 +2220,27 @@
}
public override Builder MergeFrom(pb::CodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
- pb::UnknownFieldSet.Builder unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+ pb::UnknownFieldSet.Builder unknownFields = null;
while (true) {
uint tag = input.ReadTag();
switch (tag) {
case 0: {
- this.UnknownFields = unknownFields.Build();
+ if (unknownFields != null) {
+ this.UnknownFields = unknownFields.Build();
+ }
return this;
}
default: {
- if (!ParseUnknownField(input, unknownFields, extensionRegistry, tag)) {
- this.UnknownFields = unknownFields.Build();
+ if (pb::WireFormat.IsEndGroupTag(tag)) {
+ if (unknownFields != null) {
+ this.UnknownFields = unknownFields.Build();
+ }
return this;
}
+ if (unknownFields == null) {
+ unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+ }
+ ParseUnknownField(input, unknownFields, extensionRegistry, tag);
break;
}
case 10: {
@@ -2218,6 +2258,9 @@
case 32: {
int rawValue = input.ReadEnum();
if (!global::System.Enum.IsDefined(typeof(global::Google.ProtocolBuffers.DescriptorProtos.FieldDescriptorProto.Types.Label), rawValue)) {
+ if (unknownFields == null) {
+ unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+ }
unknownFields.MergeVarintField(4, (ulong) rawValue);
} else {
Label = (global::Google.ProtocolBuffers.DescriptorProtos.FieldDescriptorProto.Types.Label) rawValue;
@@ -2227,6 +2270,9 @@
case 40: {
int rawValue = input.ReadEnum();
if (!global::System.Enum.IsDefined(typeof(global::Google.ProtocolBuffers.DescriptorProtos.FieldDescriptorProto.Types.Type), rawValue)) {
+ if (unknownFields == null) {
+ unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+ }
unknownFields.MergeVarintField(5, (ulong) rawValue);
} else {
Type = (global::Google.ProtocolBuffers.DescriptorProtos.FieldDescriptorProto.Types.Type) rawValue;
@@ -2617,19 +2663,27 @@
}
public override Builder MergeFrom(pb::CodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
- pb::UnknownFieldSet.Builder unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+ pb::UnknownFieldSet.Builder unknownFields = null;
while (true) {
uint tag = input.ReadTag();
switch (tag) {
case 0: {
- this.UnknownFields = unknownFields.Build();
+ if (unknownFields != null) {
+ this.UnknownFields = unknownFields.Build();
+ }
return this;
}
default: {
- if (!ParseUnknownField(input, unknownFields, extensionRegistry, tag)) {
- this.UnknownFields = unknownFields.Build();
+ if (pb::WireFormat.IsEndGroupTag(tag)) {
+ if (unknownFields != null) {
+ this.UnknownFields = unknownFields.Build();
+ }
return this;
}
+ if (unknownFields == null) {
+ unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+ }
+ ParseUnknownField(input, unknownFields, extensionRegistry, tag);
break;
}
case 10: {
@@ -2939,19 +2993,27 @@
}
public override Builder MergeFrom(pb::CodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
- pb::UnknownFieldSet.Builder unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+ pb::UnknownFieldSet.Builder unknownFields = null;
while (true) {
uint tag = input.ReadTag();
switch (tag) {
case 0: {
- this.UnknownFields = unknownFields.Build();
+ if (unknownFields != null) {
+ this.UnknownFields = unknownFields.Build();
+ }
return this;
}
default: {
- if (!ParseUnknownField(input, unknownFields, extensionRegistry, tag)) {
- this.UnknownFields = unknownFields.Build();
+ if (pb::WireFormat.IsEndGroupTag(tag)) {
+ if (unknownFields != null) {
+ this.UnknownFields = unknownFields.Build();
+ }
return this;
}
+ if (unknownFields == null) {
+ unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+ }
+ ParseUnknownField(input, unknownFields, extensionRegistry, tag);
break;
}
case 10: {
@@ -3245,19 +3307,27 @@
}
public override Builder MergeFrom(pb::CodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
- pb::UnknownFieldSet.Builder unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+ pb::UnknownFieldSet.Builder unknownFields = null;
while (true) {
uint tag = input.ReadTag();
switch (tag) {
case 0: {
- this.UnknownFields = unknownFields.Build();
+ if (unknownFields != null) {
+ this.UnknownFields = unknownFields.Build();
+ }
return this;
}
default: {
- if (!ParseUnknownField(input, unknownFields, extensionRegistry, tag)) {
- this.UnknownFields = unknownFields.Build();
+ if (pb::WireFormat.IsEndGroupTag(tag)) {
+ if (unknownFields != null) {
+ this.UnknownFields = unknownFields.Build();
+ }
return this;
}
+ if (unknownFields == null) {
+ unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+ }
+ ParseUnknownField(input, unknownFields, extensionRegistry, tag);
break;
}
case 10: {
@@ -3585,19 +3655,27 @@
}
public override Builder MergeFrom(pb::CodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
- pb::UnknownFieldSet.Builder unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+ pb::UnknownFieldSet.Builder unknownFields = null;
while (true) {
uint tag = input.ReadTag();
switch (tag) {
case 0: {
- this.UnknownFields = unknownFields.Build();
+ if (unknownFields != null) {
+ this.UnknownFields = unknownFields.Build();
+ }
return this;
}
default: {
- if (!ParseUnknownField(input, unknownFields, extensionRegistry, tag)) {
- this.UnknownFields = unknownFields.Build();
+ if (pb::WireFormat.IsEndGroupTag(tag)) {
+ if (unknownFields != null) {
+ this.UnknownFields = unknownFields.Build();
+ }
return this;
}
+ if (unknownFields == null) {
+ unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+ }
+ ParseUnknownField(input, unknownFields, extensionRegistry, tag);
break;
}
case 10: {
@@ -3963,19 +4041,27 @@
}
public override Builder MergeFrom(pb::CodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
- pb::UnknownFieldSet.Builder unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+ pb::UnknownFieldSet.Builder unknownFields = null;
while (true) {
uint tag = input.ReadTag();
switch (tag) {
case 0: {
- this.UnknownFields = unknownFields.Build();
+ if (unknownFields != null) {
+ this.UnknownFields = unknownFields.Build();
+ }
return this;
}
default: {
- if (!ParseUnknownField(input, unknownFields, extensionRegistry, tag)) {
- this.UnknownFields = unknownFields.Build();
+ if (pb::WireFormat.IsEndGroupTag(tag)) {
+ if (unknownFields != null) {
+ this.UnknownFields = unknownFields.Build();
+ }
return this;
}
+ if (unknownFields == null) {
+ unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+ }
+ ParseUnknownField(input, unknownFields, extensionRegistry, tag);
break;
}
case 10: {
@@ -3989,6 +4075,9 @@
case 72: {
int rawValue = input.ReadEnum();
if (!global::System.Enum.IsDefined(typeof(global::Google.ProtocolBuffers.DescriptorProtos.FileOptions.Types.OptimizeMode), rawValue)) {
+ if (unknownFields == null) {
+ unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+ }
unknownFields.MergeVarintField(9, (ulong) rawValue);
} else {
OptimizeFor = (global::Google.ProtocolBuffers.DescriptorProtos.FileOptions.Types.OptimizeMode) rawValue;
@@ -4302,19 +4391,27 @@
}
public override Builder MergeFrom(pb::CodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
- pb::UnknownFieldSet.Builder unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+ pb::UnknownFieldSet.Builder unknownFields = null;
while (true) {
uint tag = input.ReadTag();
switch (tag) {
case 0: {
- this.UnknownFields = unknownFields.Build();
+ if (unknownFields != null) {
+ this.UnknownFields = unknownFields.Build();
+ }
return this;
}
default: {
- if (!ParseUnknownField(input, unknownFields, extensionRegistry, tag)) {
- this.UnknownFields = unknownFields.Build();
+ if (pb::WireFormat.IsEndGroupTag(tag)) {
+ if (unknownFields != null) {
+ this.UnknownFields = unknownFields.Build();
+ }
return this;
}
+ if (unknownFields == null) {
+ unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+ }
+ ParseUnknownField(input, unknownFields, extensionRegistry, tag);
break;
}
case 8: {
@@ -4614,24 +4711,35 @@
}
public override Builder MergeFrom(pb::CodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
- pb::UnknownFieldSet.Builder unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+ pb::UnknownFieldSet.Builder unknownFields = null;
while (true) {
uint tag = input.ReadTag();
switch (tag) {
case 0: {
- this.UnknownFields = unknownFields.Build();
+ if (unknownFields != null) {
+ this.UnknownFields = unknownFields.Build();
+ }
return this;
}
default: {
- if (!ParseUnknownField(input, unknownFields, extensionRegistry, tag)) {
- this.UnknownFields = unknownFields.Build();
+ if (pb::WireFormat.IsEndGroupTag(tag)) {
+ if (unknownFields != null) {
+ this.UnknownFields = unknownFields.Build();
+ }
return this;
}
+ if (unknownFields == null) {
+ unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+ }
+ ParseUnknownField(input, unknownFields, extensionRegistry, tag);
break;
}
case 8: {
int rawValue = input.ReadEnum();
if (!global::System.Enum.IsDefined(typeof(global::Google.ProtocolBuffers.DescriptorProtos.FieldOptions.Types.CType), rawValue)) {
+ if (unknownFields == null) {
+ unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+ }
unknownFields.MergeVarintField(1, (ulong) rawValue);
} else {
Ctype = (global::Google.ProtocolBuffers.DescriptorProtos.FieldOptions.Types.CType) rawValue;
@@ -4912,19 +5020,27 @@
}
public override Builder MergeFrom(pb::CodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
- pb::UnknownFieldSet.Builder unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+ pb::UnknownFieldSet.Builder unknownFields = null;
while (true) {
uint tag = input.ReadTag();
switch (tag) {
case 0: {
- this.UnknownFields = unknownFields.Build();
+ if (unknownFields != null) {
+ this.UnknownFields = unknownFields.Build();
+ }
return this;
}
default: {
- if (!ParseUnknownField(input, unknownFields, extensionRegistry, tag)) {
- this.UnknownFields = unknownFields.Build();
+ if (pb::WireFormat.IsEndGroupTag(tag)) {
+ if (unknownFields != null) {
+ this.UnknownFields = unknownFields.Build();
+ }
return this;
}
+ if (unknownFields == null) {
+ unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+ }
+ ParseUnknownField(input, unknownFields, extensionRegistry, tag);
break;
}
case 7994: {
@@ -5138,19 +5254,27 @@
}
public override Builder MergeFrom(pb::CodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
- pb::UnknownFieldSet.Builder unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+ pb::UnknownFieldSet.Builder unknownFields = null;
while (true) {
uint tag = input.ReadTag();
switch (tag) {
case 0: {
- this.UnknownFields = unknownFields.Build();
+ if (unknownFields != null) {
+ this.UnknownFields = unknownFields.Build();
+ }
return this;
}
default: {
- if (!ParseUnknownField(input, unknownFields, extensionRegistry, tag)) {
- this.UnknownFields = unknownFields.Build();
+ if (pb::WireFormat.IsEndGroupTag(tag)) {
+ if (unknownFields != null) {
+ this.UnknownFields = unknownFields.Build();
+ }
return this;
}
+ if (unknownFields == null) {
+ unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+ }
+ ParseUnknownField(input, unknownFields, extensionRegistry, tag);
break;
}
case 7994: {
@@ -5364,19 +5488,27 @@
}
public override Builder MergeFrom(pb::CodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
- pb::UnknownFieldSet.Builder unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+ pb::UnknownFieldSet.Builder unknownFields = null;
while (true) {
uint tag = input.ReadTag();
switch (tag) {
case 0: {
- this.UnknownFields = unknownFields.Build();
+ if (unknownFields != null) {
+ this.UnknownFields = unknownFields.Build();
+ }
return this;
}
default: {
- if (!ParseUnknownField(input, unknownFields, extensionRegistry, tag)) {
- this.UnknownFields = unknownFields.Build();
+ if (pb::WireFormat.IsEndGroupTag(tag)) {
+ if (unknownFields != null) {
+ this.UnknownFields = unknownFields.Build();
+ }
return this;
}
+ if (unknownFields == null) {
+ unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+ }
+ ParseUnknownField(input, unknownFields, extensionRegistry, tag);
break;
}
case 7994: {
@@ -5590,19 +5722,27 @@
}
public override Builder MergeFrom(pb::CodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
- pb::UnknownFieldSet.Builder unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+ pb::UnknownFieldSet.Builder unknownFields = null;
while (true) {
uint tag = input.ReadTag();
switch (tag) {
case 0: {
- this.UnknownFields = unknownFields.Build();
+ if (unknownFields != null) {
+ this.UnknownFields = unknownFields.Build();
+ }
return this;
}
default: {
- if (!ParseUnknownField(input, unknownFields, extensionRegistry, tag)) {
- this.UnknownFields = unknownFields.Build();
+ if (pb::WireFormat.IsEndGroupTag(tag)) {
+ if (unknownFields != null) {
+ this.UnknownFields = unknownFields.Build();
+ }
return this;
}
+ if (unknownFields == null) {
+ unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+ }
+ ParseUnknownField(input, unknownFields, extensionRegistry, tag);
break;
}
case 7994: {
@@ -5849,19 +5989,27 @@
}
public override Builder MergeFrom(pb::CodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
- pb::UnknownFieldSet.Builder unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+ pb::UnknownFieldSet.Builder unknownFields = null;
while (true) {
uint tag = input.ReadTag();
switch (tag) {
case 0: {
- this.UnknownFields = unknownFields.Build();
+ if (unknownFields != null) {
+ this.UnknownFields = unknownFields.Build();
+ }
return this;
}
default: {
- if (!ParseUnknownField(input, unknownFields, extensionRegistry, tag)) {
- this.UnknownFields = unknownFields.Build();
+ if (pb::WireFormat.IsEndGroupTag(tag)) {
+ if (unknownFields != null) {
+ this.UnknownFields = unknownFields.Build();
+ }
return this;
}
+ if (unknownFields == null) {
+ unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+ }
+ ParseUnknownField(input, unknownFields, extensionRegistry, tag);
break;
}
case 10: {
@@ -6142,19 +6290,27 @@
}
public override Builder MergeFrom(pb::CodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
- pb::UnknownFieldSet.Builder unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+ pb::UnknownFieldSet.Builder unknownFields = null;
while (true) {
uint tag = input.ReadTag();
switch (tag) {
case 0: {
- this.UnknownFields = unknownFields.Build();
+ if (unknownFields != null) {
+ this.UnknownFields = unknownFields.Build();
+ }
return this;
}
default: {
- if (!ParseUnknownField(input, unknownFields, extensionRegistry, tag)) {
- this.UnknownFields = unknownFields.Build();
+ if (pb::WireFormat.IsEndGroupTag(tag)) {
+ if (unknownFields != null) {
+ this.UnknownFields = unknownFields.Build();
+ }
return this;
}
+ if (unknownFields == null) {
+ unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
+ }
+ ParseUnknownField(input, unknownFields, extensionRegistry, tag);
break;
}
case 18: {
diff --git a/src/ProtocolBuffers/GeneratedBuilder.cs b/src/ProtocolBuffers/GeneratedBuilder.cs
index c678d66..c3543be 100644
--- a/src/ProtocolBuffers/GeneratedBuilder.cs
+++ b/src/ProtocolBuffers/GeneratedBuilder.cs
@@ -158,10 +158,12 @@
}
public override TBuilder MergeUnknownFields(UnknownFieldSet unknownFields) {
- TMessage result = MessageBeingBuilt;
- result.SetUnknownFields(UnknownFieldSet.CreateBuilder(result.UnknownFields)
- .MergeFrom(unknownFields)
- .Build());
+ if (unknownFields != UnknownFieldSet.DefaultInstance) {
+ TMessage result = MessageBeingBuilt;
+ result.SetUnknownFields(UnknownFieldSet.CreateBuilder(result.UnknownFields)
+ .MergeFrom(unknownFields)
+ .Build());
+ }
return ThisBuilder;
}
diff --git a/src/ProtocolBuffers/WireFormat.cs b/src/ProtocolBuffers/WireFormat.cs
index 2bd0a5a..8f723d5 100644
--- a/src/ProtocolBuffers/WireFormat.cs
+++ b/src/ProtocolBuffers/WireFormat.cs
@@ -91,6 +91,10 @@
return (WireType) (tag & TagTypeMask);
}
+ public static bool IsEndGroupTag(uint tag) {
+ return (WireType)(tag & TagTypeMask) == WireType.EndGroup;
+ }
+
/// <summary>
/// Given a tag value, determines the field number (the upper 29 bits).
/// </summary>