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