ExtendableBuilder.cs 5.77 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
// Protocol Buffers - Google's data interchange format
// Copyright 2008 Google Inc.
// http://code.google.com/p/protobuf/
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//      http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// 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.
16 17 18 19 20 21 22 23 24 25 26 27 28
using System.Collections.Generic;
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>
29
    public bool HasExtension<TExtension>(GeneratedExtensionBase<TExtension> extension) {
30 31 32 33 34 35
      return MessageBeingBuilt.HasExtension(extension);
    }

    /// <summary>
    /// Returns the number of elements in a repeated extension.
    /// </summary>
36
    public int GetExtensionCount<TExtension>(GeneratedExtensionBase<IList<TExtension>> extension) {
37 38 39 40 41 42
      return MessageBeingBuilt.GetExtensionCount(extension);
    }

    /// <summary>
    /// Returns the value of an extension.
    /// </summary>
43
    public TExtension GetExtension<TExtension>(GeneratedExtensionBase<TExtension> extension) {
44 45 46 47 48 49
      return MessageBeingBuilt.GetExtension(extension);
    }

    /// <summary>
    /// Returns one element of a repeated extension.
    /// </summary>
50
    public TExtension GetExtension<TExtension>(GeneratedExtensionBase<IList<TExtension>> extension, int index) {
51 52 53 54 55 56
      return MessageBeingBuilt.GetExtension(extension, index);
    }

    /// <summary>
    /// Sets the value of an extension.
    /// </summary>
57
    public TBuilder SetExtension<TExtension>(GeneratedExtensionBase<TExtension> extension, TExtension value) {
58 59 60
      ExtendableMessage<TMessage, TBuilder> message = MessageBeingBuilt;
      message.VerifyExtensionContainingType(extension);
      message.Extensions[extension.Descriptor] = extension.ToReflectionType(value);
61
      return ThisBuilder;
62 63 64 65 66
    }

    /// <summary>
    /// Sets the value of one element of a repeated extension.
    /// </summary>
67
    public TBuilder SetExtension<TExtension>(GeneratedExtensionBase<IList<TExtension>> extension, int index, TExtension value) {
68 69 70
      ExtendableMessage<TMessage, TBuilder> message = MessageBeingBuilt;
      message.VerifyExtensionContainingType(extension);
      message.Extensions[extension.Descriptor, index] = extension.SingularToReflectionType(value);
71
      return ThisBuilder;
72 73 74 75 76
    }

    /// <summary>
    /// Appends a value to a repeated extension.
    /// </summary>
77
    public ExtendableBuilder<TMessage, TBuilder> AddExtension<TExtension>(GeneratedExtensionBase<IList<TExtension>> extension, TExtension value) {
78 79 80 81 82 83 84 85 86
      ExtendableMessage<TMessage, TBuilder> message = MessageBeingBuilt;
      message.VerifyExtensionContainingType(extension);
      message.Extensions.AddRepeatedField(extension.Descriptor, extension.SingularToReflectionType(value));
      return this;
    }

    /// <summary>
    /// Clears an extension.
    /// </summary>
87
    public ExtendableBuilder<TMessage, TBuilder> ClearExtension<TExtension>(GeneratedExtensionBase<TExtension> extension) {
88 89 90 91 92 93 94 95 96 97 98 99
      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) {
Jon Skeet's avatar
Jon Skeet committed
100
      return unknownFields.MergeFieldFrom(input, extensionRegistry, this, tag);
101 102 103 104 105 106 107 108 109 110
    }

    // ---------------------------------------------------------------
    // Reflection


    public override object this[FieldDescriptor field, int index] {
      set {
        if (field.IsExtension) {
          ExtendableMessage<TMessage, TBuilder> message = MessageBeingBuilt;
111
          message.VerifyContainingType(field);
112 113 114 115 116 117 118 119 120 121 122 123
          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;
124
          message.VerifyContainingType(field);
125 126 127 128 129 130 131
          message.Extensions[field] = value;
        } else {
          base[field] = value;
        }
      }
    }

132
    public override TBuilder ClearField(FieldDescriptor field) {
133 134 135 136
      if (field.IsExtension) {
        ExtendableMessage<TMessage, TBuilder> message = MessageBeingBuilt;
        message.VerifyContainingType(field);
        message.Extensions.ClearField(field);
137
        return ThisBuilder;
138 139 140 141 142
      } else {
        return base.ClearField(field);
      }
    }

143
    public override TBuilder AddRepeatedField(FieldDescriptor field, object value) {
144 145 146 147
      if (field.IsExtension) {
        ExtendableMessage<TMessage, TBuilder> message = MessageBeingBuilt;
        message.VerifyContainingType(field); 
        message.Extensions.AddRepeatedField(field, value);
148
        return ThisBuilder;
149 150 151 152 153 154
      } else {
        return base.AddRepeatedField(field, value);
      }
    }
  }
}