diff options
Diffstat (limited to 'csharp/ProtocolBuffers/WireFormat.cs')
-rw-r--r-- | csharp/ProtocolBuffers/WireFormat.cs | 49 |
1 files changed, 38 insertions, 11 deletions
diff --git a/csharp/ProtocolBuffers/WireFormat.cs b/csharp/ProtocolBuffers/WireFormat.cs index 6def39e4..0ea93322 100644 --- a/csharp/ProtocolBuffers/WireFormat.cs +++ b/csharp/ProtocolBuffers/WireFormat.cs @@ -13,6 +13,7 @@ // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. +using System; using System.Reflection; using Google.ProtocolBuffers.Descriptors; using System.Collections.Generic; @@ -77,19 +78,45 @@ namespace Google.ProtocolBuffers { } /// <summary> - /// Immutable mapping from field type to wire type. Built using the attributes on - /// FieldType values. + /// Converts a field type to its wire type. Done with a switch for the sake + /// of speed - this is significantly faster than a dictionary lookup. /// </summary> - public static readonly IDictionary<FieldType, WireType> FieldTypeToWireFormatMap = MapFieldTypes(); - - private static IDictionary<FieldType, WireType> MapFieldTypes() { - var map = new Dictionary<FieldType, WireType>(); - foreach (FieldInfo field in typeof(FieldType).GetFields(BindingFlags.Static | BindingFlags.Public)) { - FieldType fieldType = (FieldType) field.GetValue(null); - FieldMappingAttribute mapping = (FieldMappingAttribute)field.GetCustomAttributes(typeof(FieldMappingAttribute), false)[0]; - map[fieldType] = mapping.WireType; + public static WireType GetWireType(FieldType fieldType) { + switch (fieldType) { + case FieldType.Double: + return WireType.Fixed64; + case FieldType.Float: + return WireType.Fixed32; + case FieldType.Int64: + case FieldType.UInt64: + case FieldType.Int32: + return WireType.Varint; + case FieldType.Fixed64: + return WireType.Fixed64; + case FieldType.Fixed32: + return WireType.Fixed32; + case FieldType.Bool: + return WireType.Varint; + case FieldType.String: + return WireType.LengthDelimited; + case FieldType.Group: + return WireType.StartGroup; + case FieldType.Message: + case FieldType.Bytes: + return WireType.LengthDelimited; + case FieldType.UInt32: + return WireType.Varint; + case FieldType.SFixed32: + return WireType.Fixed32; + case FieldType.SFixed64: + return WireType.Fixed64; + case FieldType.SInt32: + case FieldType.SInt64: + case FieldType.Enum: + return WireType.Varint; + default: + throw new ArgumentOutOfRangeException("No such field type"); } - return Dictionaries.AsReadOnly(map); } } } |