xref: /aosp_15_r20/external/protobuf/csharp/src/Google.Protobuf/UnknownField.cs (revision 1b3f573f81763fcece89efc2b6a5209149e44ab8)
1*1b3f573fSAndroid Build Coastguard Worker #region Copyright notice and license
2*1b3f573fSAndroid Build Coastguard Worker // Protocol Buffers - Google's data interchange format
3*1b3f573fSAndroid Build Coastguard Worker // Copyright 2017 Google Inc.  All rights reserved.
4*1b3f573fSAndroid Build Coastguard Worker // https://developers.google.com/protocol-buffers/
5*1b3f573fSAndroid Build Coastguard Worker //
6*1b3f573fSAndroid Build Coastguard Worker // Redistribution and use in source and binary forms, with or without
7*1b3f573fSAndroid Build Coastguard Worker // modification, are permitted provided that the following conditions are
8*1b3f573fSAndroid Build Coastguard Worker // met:
9*1b3f573fSAndroid Build Coastguard Worker //
10*1b3f573fSAndroid Build Coastguard Worker //     * Redistributions of source code must retain the above copyright
11*1b3f573fSAndroid Build Coastguard Worker // notice, this list of conditions and the following disclaimer.
12*1b3f573fSAndroid Build Coastguard Worker //     * Redistributions in binary form must reproduce the above
13*1b3f573fSAndroid Build Coastguard Worker // copyright notice, this list of conditions and the following disclaimer
14*1b3f573fSAndroid Build Coastguard Worker // in the documentation and/or other materials provided with the
15*1b3f573fSAndroid Build Coastguard Worker // distribution.
16*1b3f573fSAndroid Build Coastguard Worker //     * Neither the name of Google Inc. nor the names of its
17*1b3f573fSAndroid Build Coastguard Worker // contributors may be used to endorse or promote products derived from
18*1b3f573fSAndroid Build Coastguard Worker // this software without specific prior written permission.
19*1b3f573fSAndroid Build Coastguard Worker //
20*1b3f573fSAndroid Build Coastguard Worker // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
21*1b3f573fSAndroid Build Coastguard Worker // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
22*1b3f573fSAndroid Build Coastguard Worker // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
23*1b3f573fSAndroid Build Coastguard Worker // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
24*1b3f573fSAndroid Build Coastguard Worker // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
25*1b3f573fSAndroid Build Coastguard Worker // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
26*1b3f573fSAndroid Build Coastguard Worker // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
27*1b3f573fSAndroid Build Coastguard Worker // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
28*1b3f573fSAndroid Build Coastguard Worker // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
29*1b3f573fSAndroid Build Coastguard Worker // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
30*1b3f573fSAndroid Build Coastguard Worker // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
31*1b3f573fSAndroid Build Coastguard Worker #endregion
32*1b3f573fSAndroid Build Coastguard Worker 
33*1b3f573fSAndroid Build Coastguard Worker using System;
34*1b3f573fSAndroid Build Coastguard Worker using System.Collections.Generic;
35*1b3f573fSAndroid Build Coastguard Worker using System.Collections.ObjectModel;
36*1b3f573fSAndroid Build Coastguard Worker using Google.Protobuf.Collections;
37*1b3f573fSAndroid Build Coastguard Worker 
38*1b3f573fSAndroid Build Coastguard Worker namespace Google.Protobuf
39*1b3f573fSAndroid Build Coastguard Worker {
40*1b3f573fSAndroid Build Coastguard Worker     /// <summary>
41*1b3f573fSAndroid Build Coastguard Worker     /// Represents a single field in an UnknownFieldSet.
42*1b3f573fSAndroid Build Coastguard Worker     ///
43*1b3f573fSAndroid Build Coastguard Worker     /// An UnknownField consists of four lists of values. The lists correspond
44*1b3f573fSAndroid Build Coastguard Worker     /// to the four "wire types" used in the protocol buffer binary format.
45*1b3f573fSAndroid Build Coastguard Worker     /// Normally, only one of the four lists will contain any values, since it
46*1b3f573fSAndroid Build Coastguard Worker     /// is impossible to define a valid message type that declares two different
47*1b3f573fSAndroid Build Coastguard Worker     /// types for the same field number. However, the code is designed to allow
48*1b3f573fSAndroid Build Coastguard Worker     /// for the case where the same unknown field number is encountered using
49*1b3f573fSAndroid Build Coastguard Worker     /// multiple different wire types.
50*1b3f573fSAndroid Build Coastguard Worker     ///
51*1b3f573fSAndroid Build Coastguard Worker     /// </summary>
52*1b3f573fSAndroid Build Coastguard Worker     internal sealed class UnknownField
53*1b3f573fSAndroid Build Coastguard Worker     {
54*1b3f573fSAndroid Build Coastguard Worker         private List<ulong> varintList;
55*1b3f573fSAndroid Build Coastguard Worker         private List<uint> fixed32List;
56*1b3f573fSAndroid Build Coastguard Worker         private List<ulong> fixed64List;
57*1b3f573fSAndroid Build Coastguard Worker         private List<ByteString> lengthDelimitedList;
58*1b3f573fSAndroid Build Coastguard Worker         private List<UnknownFieldSet> groupList;
59*1b3f573fSAndroid Build Coastguard Worker 
60*1b3f573fSAndroid Build Coastguard Worker         /// <summary>
61*1b3f573fSAndroid Build Coastguard Worker         /// Creates a new UnknownField.
62*1b3f573fSAndroid Build Coastguard Worker         /// </summary>
UnknownField()63*1b3f573fSAndroid Build Coastguard Worker         public UnknownField()
64*1b3f573fSAndroid Build Coastguard Worker         {
65*1b3f573fSAndroid Build Coastguard Worker         }
66*1b3f573fSAndroid Build Coastguard Worker 
67*1b3f573fSAndroid Build Coastguard Worker         /// <summary>
68*1b3f573fSAndroid Build Coastguard Worker         /// Checks if two unknown field are equal.
69*1b3f573fSAndroid Build Coastguard Worker         /// </summary>
Equals(object other)70*1b3f573fSAndroid Build Coastguard Worker         public override bool Equals(object other)
71*1b3f573fSAndroid Build Coastguard Worker         {
72*1b3f573fSAndroid Build Coastguard Worker             if (ReferenceEquals(this, other))
73*1b3f573fSAndroid Build Coastguard Worker             {
74*1b3f573fSAndroid Build Coastguard Worker                 return true;
75*1b3f573fSAndroid Build Coastguard Worker             }
76*1b3f573fSAndroid Build Coastguard Worker             UnknownField otherField = other as UnknownField;
77*1b3f573fSAndroid Build Coastguard Worker             return otherField != null
78*1b3f573fSAndroid Build Coastguard Worker                    && Lists.Equals(varintList, otherField.varintList)
79*1b3f573fSAndroid Build Coastguard Worker                    && Lists.Equals(fixed32List, otherField.fixed32List)
80*1b3f573fSAndroid Build Coastguard Worker                    && Lists.Equals(fixed64List, otherField.fixed64List)
81*1b3f573fSAndroid Build Coastguard Worker                    && Lists.Equals(lengthDelimitedList, otherField.lengthDelimitedList)
82*1b3f573fSAndroid Build Coastguard Worker                    && Lists.Equals(groupList, otherField.groupList);
83*1b3f573fSAndroid Build Coastguard Worker         }
84*1b3f573fSAndroid Build Coastguard Worker 
85*1b3f573fSAndroid Build Coastguard Worker         /// <summary>
86*1b3f573fSAndroid Build Coastguard Worker         /// Get the hash code of the unknown field.
87*1b3f573fSAndroid Build Coastguard Worker         /// </summary>
GetHashCode()88*1b3f573fSAndroid Build Coastguard Worker         public override int GetHashCode()
89*1b3f573fSAndroid Build Coastguard Worker         {
90*1b3f573fSAndroid Build Coastguard Worker             int hash = 43;
91*1b3f573fSAndroid Build Coastguard Worker             hash = hash * 47 + Lists.GetHashCode(varintList);
92*1b3f573fSAndroid Build Coastguard Worker             hash = hash * 47 + Lists.GetHashCode(fixed32List);
93*1b3f573fSAndroid Build Coastguard Worker             hash = hash * 47 + Lists.GetHashCode(fixed64List);
94*1b3f573fSAndroid Build Coastguard Worker             hash = hash * 47 + Lists.GetHashCode(lengthDelimitedList);
95*1b3f573fSAndroid Build Coastguard Worker             hash = hash * 47 + Lists.GetHashCode(groupList);
96*1b3f573fSAndroid Build Coastguard Worker             return hash;
97*1b3f573fSAndroid Build Coastguard Worker         }
98*1b3f573fSAndroid Build Coastguard Worker 
99*1b3f573fSAndroid Build Coastguard Worker         /// <summary>
100*1b3f573fSAndroid Build Coastguard Worker         /// Serializes the field, including the field number, and writes it to
101*1b3f573fSAndroid Build Coastguard Worker         /// <paramref name="output"/>
102*1b3f573fSAndroid Build Coastguard Worker         /// </summary>
103*1b3f573fSAndroid Build Coastguard Worker         /// <param name="fieldNumber">The unknown field number.</param>
104*1b3f573fSAndroid Build Coastguard Worker         /// <param name="output">The write context to write to.</param>
WriteTo(int fieldNumber, ref WriteContext output)105*1b3f573fSAndroid Build Coastguard Worker         internal void WriteTo(int fieldNumber, ref WriteContext output)
106*1b3f573fSAndroid Build Coastguard Worker         {
107*1b3f573fSAndroid Build Coastguard Worker             if (varintList != null)
108*1b3f573fSAndroid Build Coastguard Worker             {
109*1b3f573fSAndroid Build Coastguard Worker                 foreach (ulong value in varintList)
110*1b3f573fSAndroid Build Coastguard Worker                 {
111*1b3f573fSAndroid Build Coastguard Worker                     output.WriteTag(fieldNumber, WireFormat.WireType.Varint);
112*1b3f573fSAndroid Build Coastguard Worker                     output.WriteUInt64(value);
113*1b3f573fSAndroid Build Coastguard Worker                 }
114*1b3f573fSAndroid Build Coastguard Worker             }
115*1b3f573fSAndroid Build Coastguard Worker             if (fixed32List != null)
116*1b3f573fSAndroid Build Coastguard Worker             {
117*1b3f573fSAndroid Build Coastguard Worker                 foreach (uint value in fixed32List)
118*1b3f573fSAndroid Build Coastguard Worker                 {
119*1b3f573fSAndroid Build Coastguard Worker                     output.WriteTag(fieldNumber, WireFormat.WireType.Fixed32);
120*1b3f573fSAndroid Build Coastguard Worker                     output.WriteFixed32(value);
121*1b3f573fSAndroid Build Coastguard Worker                 }
122*1b3f573fSAndroid Build Coastguard Worker             }
123*1b3f573fSAndroid Build Coastguard Worker             if (fixed64List != null)
124*1b3f573fSAndroid Build Coastguard Worker             {
125*1b3f573fSAndroid Build Coastguard Worker                 foreach (ulong value in fixed64List)
126*1b3f573fSAndroid Build Coastguard Worker                 {
127*1b3f573fSAndroid Build Coastguard Worker                     output.WriteTag(fieldNumber, WireFormat.WireType.Fixed64);
128*1b3f573fSAndroid Build Coastguard Worker                     output.WriteFixed64(value);
129*1b3f573fSAndroid Build Coastguard Worker                 }
130*1b3f573fSAndroid Build Coastguard Worker             }
131*1b3f573fSAndroid Build Coastguard Worker             if (lengthDelimitedList != null)
132*1b3f573fSAndroid Build Coastguard Worker             {
133*1b3f573fSAndroid Build Coastguard Worker                 foreach (ByteString value in lengthDelimitedList)
134*1b3f573fSAndroid Build Coastguard Worker                 {
135*1b3f573fSAndroid Build Coastguard Worker                     output.WriteTag(fieldNumber, WireFormat.WireType.LengthDelimited);
136*1b3f573fSAndroid Build Coastguard Worker                     output.WriteBytes(value);
137*1b3f573fSAndroid Build Coastguard Worker                 }
138*1b3f573fSAndroid Build Coastguard Worker             }
139*1b3f573fSAndroid Build Coastguard Worker             if (groupList != null)
140*1b3f573fSAndroid Build Coastguard Worker             {
141*1b3f573fSAndroid Build Coastguard Worker                 foreach (UnknownFieldSet value in groupList)
142*1b3f573fSAndroid Build Coastguard Worker                 {
143*1b3f573fSAndroid Build Coastguard Worker                     output.WriteTag(fieldNumber, WireFormat.WireType.StartGroup);
144*1b3f573fSAndroid Build Coastguard Worker                     value.WriteTo(ref output);
145*1b3f573fSAndroid Build Coastguard Worker                     output.WriteTag(fieldNumber, WireFormat.WireType.EndGroup);
146*1b3f573fSAndroid Build Coastguard Worker                 }
147*1b3f573fSAndroid Build Coastguard Worker             }
148*1b3f573fSAndroid Build Coastguard Worker         }
149*1b3f573fSAndroid Build Coastguard Worker 
150*1b3f573fSAndroid Build Coastguard Worker         /// <summary>
151*1b3f573fSAndroid Build Coastguard Worker         /// Computes the number of bytes required to encode this field, including field
152*1b3f573fSAndroid Build Coastguard Worker         /// number.
153*1b3f573fSAndroid Build Coastguard Worker         /// </summary>
GetSerializedSize(int fieldNumber)154*1b3f573fSAndroid Build Coastguard Worker         internal int GetSerializedSize(int fieldNumber)
155*1b3f573fSAndroid Build Coastguard Worker         {
156*1b3f573fSAndroid Build Coastguard Worker             int result = 0;
157*1b3f573fSAndroid Build Coastguard Worker             if (varintList != null)
158*1b3f573fSAndroid Build Coastguard Worker             {
159*1b3f573fSAndroid Build Coastguard Worker                 result += CodedOutputStream.ComputeTagSize(fieldNumber) * varintList.Count;
160*1b3f573fSAndroid Build Coastguard Worker                 foreach (ulong value in varintList)
161*1b3f573fSAndroid Build Coastguard Worker                 {
162*1b3f573fSAndroid Build Coastguard Worker                     result += CodedOutputStream.ComputeUInt64Size(value);
163*1b3f573fSAndroid Build Coastguard Worker                 }
164*1b3f573fSAndroid Build Coastguard Worker             }
165*1b3f573fSAndroid Build Coastguard Worker             if (fixed32List != null)
166*1b3f573fSAndroid Build Coastguard Worker             {
167*1b3f573fSAndroid Build Coastguard Worker                 result += CodedOutputStream.ComputeTagSize(fieldNumber) * fixed32List.Count;
168*1b3f573fSAndroid Build Coastguard Worker                 result += CodedOutputStream.ComputeFixed32Size(1) * fixed32List.Count;
169*1b3f573fSAndroid Build Coastguard Worker             }
170*1b3f573fSAndroid Build Coastguard Worker             if (fixed64List != null)
171*1b3f573fSAndroid Build Coastguard Worker             {
172*1b3f573fSAndroid Build Coastguard Worker                 result += CodedOutputStream.ComputeTagSize(fieldNumber) * fixed64List.Count;
173*1b3f573fSAndroid Build Coastguard Worker                 result += CodedOutputStream.ComputeFixed64Size(1) * fixed64List.Count;
174*1b3f573fSAndroid Build Coastguard Worker             }
175*1b3f573fSAndroid Build Coastguard Worker             if (lengthDelimitedList != null)
176*1b3f573fSAndroid Build Coastguard Worker             {
177*1b3f573fSAndroid Build Coastguard Worker                 result += CodedOutputStream.ComputeTagSize(fieldNumber) * lengthDelimitedList.Count;
178*1b3f573fSAndroid Build Coastguard Worker                 foreach (ByteString value in lengthDelimitedList)
179*1b3f573fSAndroid Build Coastguard Worker                 {
180*1b3f573fSAndroid Build Coastguard Worker                     result += CodedOutputStream.ComputeBytesSize(value);
181*1b3f573fSAndroid Build Coastguard Worker                 }
182*1b3f573fSAndroid Build Coastguard Worker             }
183*1b3f573fSAndroid Build Coastguard Worker             if (groupList != null)
184*1b3f573fSAndroid Build Coastguard Worker             {
185*1b3f573fSAndroid Build Coastguard Worker                 result += CodedOutputStream.ComputeTagSize(fieldNumber) * 2 * groupList.Count;
186*1b3f573fSAndroid Build Coastguard Worker                 foreach (UnknownFieldSet value in groupList)
187*1b3f573fSAndroid Build Coastguard Worker                 {
188*1b3f573fSAndroid Build Coastguard Worker                     result += value.CalculateSize();
189*1b3f573fSAndroid Build Coastguard Worker                 }
190*1b3f573fSAndroid Build Coastguard Worker             }
191*1b3f573fSAndroid Build Coastguard Worker             return result;
192*1b3f573fSAndroid Build Coastguard Worker         }
193*1b3f573fSAndroid Build Coastguard Worker 
194*1b3f573fSAndroid Build Coastguard Worker         /// <summary>
195*1b3f573fSAndroid Build Coastguard Worker         /// Merge the values in <paramref name="other" /> into this field.  For each list
196*1b3f573fSAndroid Build Coastguard Worker         /// of values, <paramref name="other"/>'s values are append to the ones in this
197*1b3f573fSAndroid Build Coastguard Worker         /// field.
198*1b3f573fSAndroid Build Coastguard Worker         /// </summary>
MergeFrom(UnknownField other)199*1b3f573fSAndroid Build Coastguard Worker         internal UnknownField MergeFrom(UnknownField other)
200*1b3f573fSAndroid Build Coastguard Worker         {
201*1b3f573fSAndroid Build Coastguard Worker             varintList = AddAll(varintList, other.varintList);
202*1b3f573fSAndroid Build Coastguard Worker             fixed32List = AddAll(fixed32List, other.fixed32List);
203*1b3f573fSAndroid Build Coastguard Worker             fixed64List = AddAll(fixed64List, other.fixed64List);
204*1b3f573fSAndroid Build Coastguard Worker             lengthDelimitedList = AddAll(lengthDelimitedList, other.lengthDelimitedList);
205*1b3f573fSAndroid Build Coastguard Worker             groupList = AddAll(groupList, other.groupList);
206*1b3f573fSAndroid Build Coastguard Worker             return this;
207*1b3f573fSAndroid Build Coastguard Worker         }
208*1b3f573fSAndroid Build Coastguard Worker 
209*1b3f573fSAndroid Build Coastguard Worker         /// <summary>
210*1b3f573fSAndroid Build Coastguard Worker         /// Returns a new list containing all of the given specified values from
211*1b3f573fSAndroid Build Coastguard Worker         /// both the <paramref name="current"/> and <paramref name="extras"/> lists.
212*1b3f573fSAndroid Build Coastguard Worker         /// If <paramref name="current" /> is null and <paramref name="extras"/> is null or empty,
213*1b3f573fSAndroid Build Coastguard Worker         /// null is returned. Otherwise, either a new list is created (if <paramref name="current" />
214*1b3f573fSAndroid Build Coastguard Worker         /// is null) or the elements of <paramref name="extras"/> are added to <paramref name="current" />.
215*1b3f573fSAndroid Build Coastguard Worker         /// </summary>
AddAll(List<T> current, IList<T> extras)216*1b3f573fSAndroid Build Coastguard Worker         private static List<T> AddAll<T>(List<T> current, IList<T> extras)
217*1b3f573fSAndroid Build Coastguard Worker         {
218*1b3f573fSAndroid Build Coastguard Worker             if (extras == null || extras.Count == 0)
219*1b3f573fSAndroid Build Coastguard Worker             {
220*1b3f573fSAndroid Build Coastguard Worker                 return current;
221*1b3f573fSAndroid Build Coastguard Worker             }
222*1b3f573fSAndroid Build Coastguard Worker             if (current == null)
223*1b3f573fSAndroid Build Coastguard Worker             {
224*1b3f573fSAndroid Build Coastguard Worker                 current = new List<T>(extras);
225*1b3f573fSAndroid Build Coastguard Worker             }
226*1b3f573fSAndroid Build Coastguard Worker             else
227*1b3f573fSAndroid Build Coastguard Worker             {
228*1b3f573fSAndroid Build Coastguard Worker                 current.AddRange(extras);
229*1b3f573fSAndroid Build Coastguard Worker             }
230*1b3f573fSAndroid Build Coastguard Worker             return current;
231*1b3f573fSAndroid Build Coastguard Worker         }
232*1b3f573fSAndroid Build Coastguard Worker 
233*1b3f573fSAndroid Build Coastguard Worker         /// <summary>
234*1b3f573fSAndroid Build Coastguard Worker         /// Adds a varint value.
235*1b3f573fSAndroid Build Coastguard Worker         /// </summary>
AddVarint(ulong value)236*1b3f573fSAndroid Build Coastguard Worker         internal UnknownField AddVarint(ulong value)
237*1b3f573fSAndroid Build Coastguard Worker         {
238*1b3f573fSAndroid Build Coastguard Worker             varintList = Add(varintList, value);
239*1b3f573fSAndroid Build Coastguard Worker             return this;
240*1b3f573fSAndroid Build Coastguard Worker         }
241*1b3f573fSAndroid Build Coastguard Worker 
242*1b3f573fSAndroid Build Coastguard Worker         /// <summary>
243*1b3f573fSAndroid Build Coastguard Worker         /// Adds a fixed32 value.
244*1b3f573fSAndroid Build Coastguard Worker         /// </summary>
AddFixed32(uint value)245*1b3f573fSAndroid Build Coastguard Worker         internal UnknownField AddFixed32(uint value)
246*1b3f573fSAndroid Build Coastguard Worker         {
247*1b3f573fSAndroid Build Coastguard Worker             fixed32List = Add(fixed32List, value);
248*1b3f573fSAndroid Build Coastguard Worker             return this;
249*1b3f573fSAndroid Build Coastguard Worker         }
250*1b3f573fSAndroid Build Coastguard Worker 
251*1b3f573fSAndroid Build Coastguard Worker         /// <summary>
252*1b3f573fSAndroid Build Coastguard Worker         /// Adds a fixed64 value.
253*1b3f573fSAndroid Build Coastguard Worker         /// </summary>
AddFixed64(ulong value)254*1b3f573fSAndroid Build Coastguard Worker         internal UnknownField AddFixed64(ulong value)
255*1b3f573fSAndroid Build Coastguard Worker         {
256*1b3f573fSAndroid Build Coastguard Worker             fixed64List = Add(fixed64List, value);
257*1b3f573fSAndroid Build Coastguard Worker             return this;
258*1b3f573fSAndroid Build Coastguard Worker         }
259*1b3f573fSAndroid Build Coastguard Worker 
260*1b3f573fSAndroid Build Coastguard Worker         /// <summary>
261*1b3f573fSAndroid Build Coastguard Worker         /// Adds a length-delimited value.
262*1b3f573fSAndroid Build Coastguard Worker         /// </summary>
AddLengthDelimited(ByteString value)263*1b3f573fSAndroid Build Coastguard Worker         internal UnknownField AddLengthDelimited(ByteString value)
264*1b3f573fSAndroid Build Coastguard Worker         {
265*1b3f573fSAndroid Build Coastguard Worker             lengthDelimitedList = Add(lengthDelimitedList, value);
266*1b3f573fSAndroid Build Coastguard Worker             return this;
267*1b3f573fSAndroid Build Coastguard Worker         }
268*1b3f573fSAndroid Build Coastguard Worker 
AddGroup(UnknownFieldSet value)269*1b3f573fSAndroid Build Coastguard Worker         internal UnknownField AddGroup(UnknownFieldSet value)
270*1b3f573fSAndroid Build Coastguard Worker         {
271*1b3f573fSAndroid Build Coastguard Worker             groupList = Add(groupList, value);
272*1b3f573fSAndroid Build Coastguard Worker             return this;
273*1b3f573fSAndroid Build Coastguard Worker         }
274*1b3f573fSAndroid Build Coastguard Worker 
275*1b3f573fSAndroid Build Coastguard Worker         /// <summary>
276*1b3f573fSAndroid Build Coastguard Worker         /// Adds <paramref name="value"/> to the <paramref name="list"/>, creating
277*1b3f573fSAndroid Build Coastguard Worker         /// a new list if <paramref name="list"/> is null. The list is returned - either
278*1b3f573fSAndroid Build Coastguard Worker         /// the original reference or the new list.
279*1b3f573fSAndroid Build Coastguard Worker         /// </summary>
Add(List<T> list, T value)280*1b3f573fSAndroid Build Coastguard Worker         private static List<T> Add<T>(List<T> list, T value)
281*1b3f573fSAndroid Build Coastguard Worker         {
282*1b3f573fSAndroid Build Coastguard Worker             if (list == null)
283*1b3f573fSAndroid Build Coastguard Worker             {
284*1b3f573fSAndroid Build Coastguard Worker                 list = new List<T>();
285*1b3f573fSAndroid Build Coastguard Worker             }
286*1b3f573fSAndroid Build Coastguard Worker             list.Add(value);
287*1b3f573fSAndroid Build Coastguard Worker             return list;
288*1b3f573fSAndroid Build Coastguard Worker         }
289*1b3f573fSAndroid Build Coastguard Worker     }
290*1b3f573fSAndroid Build Coastguard Worker }
291