aboutsummaryrefslogblamecommitdiff
path: root/csharp/ProtocolBuffers/GeneratedMessage.cs
blob: 515eadc01acb9c5e61bac03519cc3ceb9c45e04a (plain) (tree)






































































                                                                                                  
using System;
using System.Collections.Generic;
using System.Text;
using Google.ProtocolBuffers.Descriptors;
using Google.ProtocolBuffers.FieldAccess;

namespace Google.ProtocolBuffers {
  
  /// <summary>
  /// All generated protocol message classes extend this class. It implements
  /// most of the IMessage and IBuilder interfaces using reflection. Users
  /// can ignore this class as an implementation detail.
  /// </summary>
  public abstract class GeneratedMessage<TMessage, TBuilder> : AbstractMessage, IMessage<TMessage>
      where TMessage : GeneratedMessage<TMessage, TBuilder> where TBuilder : IBuilder<TMessage> {

    private readonly UnknownFieldSet unknownFields = UnknownFieldSet.DefaultInstance;

    protected abstract FieldAccessorTable<TMessage, TBuilder> InternalFieldAccessors { get; }

    public override MessageDescriptor DescriptorForType {
      get { return InternalFieldAccessors.Descriptor; }
    }

    public IMessage<TMessage> DefaultInstanceForType {
      get { throw new System.NotImplementedException(); }
    }

    public IBuilder<TMessage> CreateBuilderForType() {
      throw new System.NotImplementedException();
    }

    private IDictionary<FieldDescriptor, Object> GetMutableFieldMap() {
      var ret = new Dictionary<FieldDescriptor, object>();
      MessageDescriptor descriptor = DescriptorForType;
      foreach (FieldDescriptor field in descriptor.Fields) {
        IFieldAccessor<TMessage, TBuilder> accessor = InternalFieldAccessors[field];
        if ((field.IsRepeated && accessor.GetRepeatedCount(this) != 0)
            || accessor.Has(this)) {
          ret[field] = accessor[this];
        }
      }
      return ret;
    }

    public override IDictionary<FieldDescriptor, object> AllFields {
      // FIXME: Make it immutable
      get { return GetMutableFieldMap(); }
    }

    public override bool HasField(FieldDescriptor field) {
      return InternalFieldAccessors[field].Has(this);
    }

    public override int GetRepeatedFieldCount(FieldDescriptor field) {
      return InternalFieldAccessors[field].GetRepeatedCount(this);
    }

    public override object this[FieldDescriptor field, int index] {
      get { return InternalFieldAccessors[field][this, index]; }
    }

    public override object this[FieldDescriptor field] {
      get { return InternalFieldAccessors[field][this]; }
    }

    public override UnknownFieldSet UnknownFields {
      get { return unknownFields; }
    }
  }
}