diff options
author | Jon Skeet <skeet@pobox.com> | 2008-08-14 20:35:20 +0100 |
---|---|---|
committer | Jon Skeet <skeet@pobox.com> | 2008-08-14 20:35:20 +0100 |
commit | b84310e1101af3c442e102f4c9ed03f3eff105fb (patch) | |
tree | 5f83c80efb0b5065610b643995fad5572731cc9b /csharp/ProtocolBuffers/FieldAccess/RepeatedEnumAccessor.cs | |
parent | 023d7398d6227e9613afcfe12d3d47454b0a9de5 (diff) | |
download | protobuf-b84310e1101af3c442e102f4c9ed03f3eff105fb.tar.gz protobuf-b84310e1101af3c442e102f4c9ed03f3eff105fb.tar.bz2 protobuf-b84310e1101af3c442e102f4c9ed03f3eff105fb.zip |
Field accessor implementations complete (hopefully)
Diffstat (limited to 'csharp/ProtocolBuffers/FieldAccess/RepeatedEnumAccessor.cs')
-rw-r--r-- | csharp/ProtocolBuffers/FieldAccess/RepeatedEnumAccessor.cs | 45 |
1 files changed, 45 insertions, 0 deletions
diff --git a/csharp/ProtocolBuffers/FieldAccess/RepeatedEnumAccessor.cs b/csharp/ProtocolBuffers/FieldAccess/RepeatedEnumAccessor.cs new file mode 100644 index 00000000..48724192 --- /dev/null +++ b/csharp/ProtocolBuffers/FieldAccess/RepeatedEnumAccessor.cs @@ -0,0 +1,45 @@ +using System; +using System.Collections; +using System.Collections.Generic; +using Google.ProtocolBuffers.Collections; +using Google.ProtocolBuffers.Descriptors; + +namespace Google.ProtocolBuffers.FieldAccess { + + /// <summary> + /// Accessor for a repeated enum field. + /// </summary> + internal sealed class RepeatedEnumAccessor : RepeatedPrimitiveAccessor { + + private readonly EnumDescriptor enumDescriptor; + + internal RepeatedEnumAccessor(FieldDescriptor field, string name, Type messageType, Type builderType) + : base(name, messageType, builderType) { + + enumDescriptor = field.EnumType; + } + + public override object GetValue(IMessage message) { + List<EnumValueDescriptor> ret = new List<EnumValueDescriptor>(); + foreach (int rawValue in (IEnumerable) base.GetValue(message)) { + ret.Add(enumDescriptor.FindValueByNumber(rawValue)); + } + return Lists.AsReadOnly(ret); + } + + public override object GetRepeatedValue(IMessage message, int index) { + // Note: This relies on the fact that the CLR allows unboxing from an enum to + // its underlying value + int rawValue = (int) base.GetRepeatedValue(message, index); + return enumDescriptor.FindValueByNumber(rawValue); + } + + public override void AddRepeated(IBuilder builder, object value) { + base.AddRepeated(builder, ((EnumValueDescriptor) value).Number); + } + + public override void SetRepeated(IBuilder builder, int index, object value) { + base.SetRepeated(builder, index, ((EnumValueDescriptor) value).Number); + } + } +} |