using System;
using System.Collections.Generic;
using System.Text;
using Google.ProtocolBuffers.Descriptors;
using Google.ProtocolBuffers.FieldAccess;
namespace Google.ProtocolBuffers {
///
/// 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.
///
public abstract class GeneratedMessage : AbstractMessage, IMessage
where TMessage : GeneratedMessage where TBuilder : IBuilder {
private readonly UnknownFieldSet unknownFields = UnknownFieldSet.DefaultInstance;
protected abstract FieldAccessorTable InternalFieldAccessors { get; }
public override MessageDescriptor DescriptorForType {
get { return InternalFieldAccessors.Descriptor; }
}
public IMessage DefaultInstanceForType {
get { throw new System.NotImplementedException(); }
}
public IBuilder CreateBuilderForType() {
throw new System.NotImplementedException();
}
private IDictionary GetMutableFieldMap() {
var ret = new Dictionary();
MessageDescriptor descriptor = DescriptorForType;
foreach (FieldDescriptor field in descriptor.Fields) {
IFieldAccessor accessor = InternalFieldAccessors[field];
if ((field.IsRepeated && accessor.GetRepeatedCount(this) != 0)
|| accessor.Has(this)) {
ret[field] = accessor[this];
}
}
return ret;
}
public override IDictionary 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; }
}
}
}