aboutsummaryrefslogtreecommitdiff
path: root/csharp/ProtocolBuffers/ExtendableBuilder.cs
diff options
context:
space:
mode:
authorJon Skeet <skeet@pobox.com>2008-08-14 20:35:23 +0100
committerJon Skeet <skeet@pobox.com>2008-08-14 20:35:23 +0100
commitbef2caf5e49dbcf6b926d01cfb0948dedee49c93 (patch)
treeb4861e64633b81094c1ae96630136000de0b7505 /csharp/ProtocolBuffers/ExtendableBuilder.cs
parent5d7adf66ceb531be50cec1963ecdf271f5fc591e (diff)
downloadprotobuf-bef2caf5e49dbcf6b926d01cfb0948dedee49c93.tar.gz
protobuf-bef2caf5e49dbcf6b926d01cfb0948dedee49c93.tar.bz2
protobuf-bef2caf5e49dbcf6b926d01cfb0948dedee49c93.zip
Added DynamicMessage and ExtendableBuilder, along with the first supporting tests.
Diffstat (limited to 'csharp/ProtocolBuffers/ExtendableBuilder.cs')
-rw-r--r--csharp/ProtocolBuffers/ExtendableBuilder.cs147
1 files changed, 147 insertions, 0 deletions
diff --git a/csharp/ProtocolBuffers/ExtendableBuilder.cs b/csharp/ProtocolBuffers/ExtendableBuilder.cs
new file mode 100644
index 00000000..3f5a8162
--- /dev/null
+++ b/csharp/ProtocolBuffers/ExtendableBuilder.cs
@@ -0,0 +1,147 @@
+using System;
+using System.Collections.Generic;
+using System.Text;
+using Google.ProtocolBuffers.Descriptors;
+
+namespace Google.ProtocolBuffers {
+ public abstract class ExtendableBuilder<TMessage, TBuilder> : GeneratedBuilder<TMessage, TBuilder>
+ where TMessage : ExtendableMessage<TMessage, TBuilder>
+ where TBuilder : GeneratedBuilder<TMessage, TBuilder> {
+
+ protected ExtendableBuilder() {}
+
+ /// <summary>
+ /// Checks if a singular extension is present
+ /// </summary>
+ public bool HasExtension<TExtension>(GeneratedExtensionBase<TMessage, TExtension> extension) {
+ return MessageBeingBuilt.HasExtension(extension);
+ }
+
+ /// <summary>
+ /// Returns the number of elements in a repeated extension.
+ /// </summary>
+ public int GetExtensionCount<TExtension>(GeneratedExtensionBase<TMessage, IList<TExtension>> extension) {
+ return MessageBeingBuilt.GetExtensionCount(extension);
+ }
+
+ /// <summary>
+ /// Returns the value of an extension.
+ /// </summary>
+ public TExtension GetExtension<TExtension>(GeneratedExtensionBase<TMessage, TExtension> extension) {
+ return MessageBeingBuilt.GetExtension(extension);
+ }
+
+ /// <summary>
+ /// Returns one element of a repeated extension.
+ /// </summary>
+ public TExtension GetExtension<TExtension>(GeneratedExtensionBase<TMessage, IList<TExtension>> extension, int index) {
+ return MessageBeingBuilt.GetExtension(extension, index);
+ }
+
+ /// <summary>
+ /// Sets the value of an extension.
+ /// </summary>
+ public ExtendableBuilder<TMessage, TBuilder> SetExtension<TExtension>(GeneratedExtensionBase<TMessage, TExtension> extension, TExtension value) {
+ ExtendableMessage<TMessage, TBuilder> message = MessageBeingBuilt;
+ message.VerifyExtensionContainingType(extension);
+ message.Extensions[extension.Descriptor] = extension.ToReflectionType(value);
+ return this;
+ }
+
+ /// <summary>
+ /// Sets the value of one element of a repeated extension.
+ /// </summary>
+ public ExtendableBuilder<TMessage, TBuilder> SetExtension<TExtension>(
+ GeneratedExtensionBase<TMessage, IList<TExtension>> extension, int index, Type value) {
+ ExtendableMessage<TMessage, TBuilder> message = MessageBeingBuilt;
+ message.VerifyExtensionContainingType(extension);
+ message.Extensions[extension.Descriptor, index] = extension.SingularToReflectionType(value);
+ return this;
+ }
+
+ /// <summary>
+ /// Appends a value to a repeated extension.
+ /// </summary>
+ public ExtendableBuilder<TMessage, TBuilder> AddExtension<TExtension>(
+ GeneratedExtensionBase<TMessage, IList<TExtension>> extension, TExtension value) {
+ ExtendableMessage<TMessage, TBuilder> message = MessageBeingBuilt;
+ message.VerifyExtensionContainingType(extension);
+ message.Extensions.AddRepeatedField(extension.Descriptor, extension.SingularToReflectionType(value));
+ return this;
+ }
+
+ /// <summary>
+ /// Clears an extension.
+ /// </summary>
+ public ExtendableBuilder<TMessage, TBuilder> ClearExtension<TExtension>(
+ GeneratedExtensionBase<TMessage, TExtension> extension) {
+ ExtendableMessage<TMessage, TBuilder> message = MessageBeingBuilt;
+ message.VerifyExtensionContainingType(extension);
+ message.Extensions.ClearField(extension.Descriptor);
+ return this;
+ }
+
+ /// <summary>
+ /// Called by subclasses to parse an unknown field or an extension.
+ /// </summary>
+ /// <returns>true unless the tag is an end-group tag</returns>
+ protected override bool ParseUnknownField(CodedInputStream input, UnknownFieldSet.Builder unknownFields,
+ ExtensionRegistry extensionRegistry, uint tag) {
+ return FieldSet.MergeFieldFrom(input, unknownFields, extensionRegistry, this, tag);
+ }
+
+ // ---------------------------------------------------------------
+ // Reflection
+
+
+ public override object this[FieldDescriptor field, int index] {
+ set {
+ if (field.IsExtension) {
+ ExtendableMessage<TMessage, TBuilder> message = MessageBeingBuilt;
+ // TODO(jonskeet): Figure out how to call this!
+ // message.VerifyExtensionContainingType(field);
+ message.Extensions[field, index] = value;
+ } else {
+ base[field, index] = value;
+ }
+ }
+ }
+
+
+ public override object this[FieldDescriptor field] {
+ set {
+ if (field.IsExtension) {
+ ExtendableMessage<TMessage, TBuilder> message = MessageBeingBuilt;
+ // TODO(jonskeet): Figure out how to call this!
+ // message.VerifyExtensionContainingType(field);
+ message.Extensions[field] = value;
+ } else {
+ base[field] = value;
+ }
+ InternalFieldAccessors[field].SetValue(this, value);
+ }
+ }
+
+ public override IBuilder<TMessage> ClearField(FieldDescriptor field) {
+ if (field.IsExtension) {
+ ExtendableMessage<TMessage, TBuilder> message = MessageBeingBuilt;
+ message.VerifyContainingType(field);
+ message.Extensions.ClearField(field);
+ return this;
+ } else {
+ return base.ClearField(field);
+ }
+ }
+
+ public override IBuilder<TMessage> AddRepeatedField(FieldDescriptor field, object value) {
+ if (field.IsExtension) {
+ ExtendableMessage<TMessage, TBuilder> message = MessageBeingBuilt;
+ message.VerifyContainingType(field);
+ message.Extensions.AddRepeatedField(field, value);
+ return this;
+ } else {
+ return base.AddRepeatedField(field, value);
+ }
+ }
+ }
+}