blob: 62508e02848f8531d7e03d91f1c4055f5ded0027 [file] [log] [blame]
csharptest71f662c2011-05-20 15:15:34 -05001#region Copyright notice and license
2
3// Protocol Buffers - Google's data interchange format
4// Copyright 2008 Google Inc. All rights reserved.
5// http://github.com/jskeet/dotnet-protobufs/
6// Original C++/Java/Python code:
7// http://code.google.com/p/protobuf/
8//
9// Redistribution and use in source and binary forms, with or without
10// modification, are permitted provided that the following conditions are
11// met:
12//
13// * Redistributions of source code must retain the above copyright
14// notice, this list of conditions and the following disclaimer.
15// * Redistributions in binary form must reproduce the above
16// copyright notice, this list of conditions and the following disclaimer
17// in the documentation and/or other materials provided with the
18// distribution.
19// * Neither the name of Google Inc. nor the names of its
20// contributors may be used to endorse or promote products derived from
21// this software without specific prior written permission.
22//
23// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
24// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
25// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
26// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
27// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
28// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
29// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
30// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
31// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
32// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
33// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
34
35#endregion
36
37using System;
38using System.Collections.Generic;
39using Google.ProtocolBuffers.Descriptors;
40
41namespace Google.ProtocolBuffers
42{
csharptest3c6e9322011-09-09 18:14:40 -050043 public abstract partial class ExtendableBuilder<TMessage, TBuilder> : GeneratedBuilder<TMessage, TBuilder>
csharptest71f662c2011-05-20 15:15:34 -050044 where TMessage : ExtendableMessage<TMessage, TBuilder>
csharptestf2925232011-06-11 10:41:57 -050045 where TBuilder : GeneratedBuilder<TMessage, TBuilder>, new()
csharptest71f662c2011-05-20 15:15:34 -050046 {
47 protected ExtendableBuilder()
48 {
49 }
50
51 /// <summary>
52 /// Checks if a singular extension is present
53 /// </summary>
54 public bool HasExtension<TExtension>(GeneratedExtensionBase<TExtension> extension)
55 {
56 return MessageBeingBuilt.HasExtension(extension);
57 }
58
59 /// <summary>
60 /// Returns the number of elements in a repeated extension.
61 /// </summary>
62 public int GetExtensionCount<TExtension>(GeneratedExtensionBase<IList<TExtension>> extension)
63 {
64 return MessageBeingBuilt.GetExtensionCount(extension);
65 }
66
67 /// <summary>
68 /// Returns the value of an extension.
69 /// </summary>
70 public TExtension GetExtension<TExtension>(GeneratedExtensionBase<TExtension> extension)
71 {
72 return MessageBeingBuilt.GetExtension(extension);
73 }
74
75 /// <summary>
76 /// Returns one element of a repeated extension.
77 /// </summary>
78 public TExtension GetExtension<TExtension>(GeneratedExtensionBase<IList<TExtension>> extension, int index)
79 {
80 return MessageBeingBuilt.GetExtension(extension, index);
81 }
82
83 /// <summary>
84 /// Sets the value of an extension.
85 /// </summary>
86 public TBuilder SetExtension<TExtension>(GeneratedExtensionBase<TExtension> extension, TExtension value)
87 {
88 ExtendableMessage<TMessage, TBuilder> message = MessageBeingBuilt;
89 message.VerifyExtensionContainingType(extension);
90 message.Extensions[extension.Descriptor] = extension.ToReflectionType(value);
91 return ThisBuilder;
92 }
93
94 /// <summary>
95 /// Sets the value of one element of a repeated extension.
96 /// </summary>
97 public TBuilder SetExtension<TExtension>(GeneratedExtensionBase<IList<TExtension>> extension, int index,
98 TExtension value)
99 {
100 ExtendableMessage<TMessage, TBuilder> message = MessageBeingBuilt;
101 message.VerifyExtensionContainingType(extension);
102 message.Extensions[extension.Descriptor, index] = extension.SingularToReflectionType(value);
103 return ThisBuilder;
104 }
105
106 /// <summary>
107 /// Appends a value to a repeated extension.
108 /// </summary>
109 public TBuilder AddExtension<TExtension>(GeneratedExtensionBase<IList<TExtension>> extension, TExtension value)
110 {
111 ExtendableMessage<TMessage, TBuilder> message = MessageBeingBuilt;
112 message.VerifyExtensionContainingType(extension);
113 message.Extensions.AddRepeatedField(extension.Descriptor, extension.SingularToReflectionType(value));
114 return ThisBuilder;
115 }
116
117 /// <summary>
118 /// Clears an extension.
119 /// </summary>
120 public TBuilder ClearExtension<TExtension>(GeneratedExtensionBase<TExtension> extension)
121 {
122 ExtendableMessage<TMessage, TBuilder> message = MessageBeingBuilt;
123 message.VerifyExtensionContainingType(extension);
124 message.Extensions.ClearField(extension.Descriptor);
125 return ThisBuilder;
126 }
127
128 /// <summary>
129 /// Called by subclasses to parse an unknown field or an extension.
130 /// </summary>
131 /// <returns>true unless the tag is an end-group tag</returns>
csharptest17699c22011-06-03 21:57:15 -0500132 protected override bool ParseUnknownField(ICodedInputStream input, UnknownFieldSet.Builder unknownFields,
csharptestd2af9e92011-06-03 21:35:02 -0500133 ExtensionRegistry extensionRegistry, uint tag, string fieldName)
csharptest71f662c2011-05-20 15:15:34 -0500134 {
csharptestd2af9e92011-06-03 21:35:02 -0500135 return unknownFields.MergeFieldFrom(input, extensionRegistry, this, tag, fieldName);
csharptest71f662c2011-05-20 15:15:34 -0500136 }
137
138 // ---------------------------------------------------------------
139 // Reflection
140
141
142 public override object this[FieldDescriptor field, int index]
143 {
144 set
145 {
146 if (field.IsExtension)
147 {
148 ExtendableMessage<TMessage, TBuilder> message = MessageBeingBuilt;
149 message.VerifyContainingType(field);
150 message.Extensions[field, index] = value;
151 }
152 else
153 {
154 base[field, index] = value;
155 }
156 }
157 }
158
159
160 public override object this[FieldDescriptor field]
161 {
162 set
163 {
164 if (field.IsExtension)
165 {
166 ExtendableMessage<TMessage, TBuilder> message = MessageBeingBuilt;
167 message.VerifyContainingType(field);
168 message.Extensions[field] = value;
169 }
170 else
171 {
172 base[field] = value;
173 }
174 }
175 }
176
177 public override TBuilder ClearField(FieldDescriptor field)
178 {
179 if (field.IsExtension)
180 {
181 ExtendableMessage<TMessage, TBuilder> message = MessageBeingBuilt;
182 message.VerifyContainingType(field);
183 message.Extensions.ClearField(field);
184 return ThisBuilder;
185 }
186 else
187 {
188 return base.ClearField(field);
189 }
190 }
191
192 public override TBuilder AddRepeatedField(FieldDescriptor field, object value)
193 {
194 if (field.IsExtension)
195 {
196 ExtendableMessage<TMessage, TBuilder> message = MessageBeingBuilt;
197 message.VerifyContainingType(field);
198 message.Extensions.AddRepeatedField(field, value);
199 return ThisBuilder;
200 }
201 else
202 {
203 return base.AddRepeatedField(field, value);
204 }
205 }
206
207 protected void MergeExtensionFields(ExtendableMessage<TMessage, TBuilder> other)
208 {
209 MessageBeingBuilt.Extensions.MergeFrom(other.Extensions);
210 }
211 }
212}