using System; using System.Collections; using System.Collections.Generic; using System.IO; namespace Google.Protobuf.Collections { // Token: 0x02000071 RID: 113 public sealed class RepeatedField : IList, ICollection, IEnumerable, IEnumerable, IList, ICollection, IDeepCloneable>, IEquatable> { // Token: 0x06000648 RID: 1608 RVA: 0x00015A60 File Offset: 0x00013C60 public RepeatedField Clone() { RepeatedField repeatedField = new RepeatedField(); if (this.array != RepeatedField.EmptyArray) { repeatedField.array = (T[])this.array.Clone(); IDeepCloneable[] array = repeatedField.array as IDeepCloneable[]; if (array != null) { for (int i = 0; i < this.count; i++) { repeatedField.array[i] = array[i].Clone(); } } } repeatedField.count = this.count; return repeatedField; } // Token: 0x06000649 RID: 1609 RVA: 0x00015AD8 File Offset: 0x00013CD8 public void AddEntriesFrom(CodedInputStream input, FieldCodec codec) { uint lastTag = input.LastTag; Func valueReader = codec.ValueReader; if (FieldCodec.IsPackedRepeatedField(lastTag)) { int num = input.ReadLength(); if (num > 0) { int num2 = input.PushLimit(num); while (!input.ReachedLimit) { this.Add(valueReader(input)); } input.PopLimit(num2); return; } } else { do { this.Add(valueReader(input)); } while (input.MaybeConsumeTag(lastTag)); } } // Token: 0x0600064A RID: 1610 RVA: 0x00015B44 File Offset: 0x00013D44 public int CalculateSize(FieldCodec codec) { if (this.count == 0) { return 0; } uint tag = codec.Tag; if (codec.PackedRepeatedField) { int num = this.CalculatePackedDataSize(codec); return CodedOutputStream.ComputeRawVarint32Size(tag) + CodedOutputStream.ComputeLengthSize(num) + num; } Func valueSizeCalculator = codec.ValueSizeCalculator; int num2 = this.count * CodedOutputStream.ComputeRawVarint32Size(tag); for (int i = 0; i < this.count; i++) { num2 += valueSizeCalculator(this.array[i]); } return num2; } // Token: 0x0600064B RID: 1611 RVA: 0x00015BC4 File Offset: 0x00013DC4 private int CalculatePackedDataSize(FieldCodec codec) { int fixedSize = codec.FixedSize; if (fixedSize == 0) { Func valueSizeCalculator = codec.ValueSizeCalculator; int num = 0; for (int i = 0; i < this.count; i++) { num += valueSizeCalculator(this.array[i]); } return num; } return fixedSize * this.Count; } // Token: 0x0600064C RID: 1612 RVA: 0x00015C14 File Offset: 0x00013E14 public void WriteTo(CodedOutputStream output, FieldCodec codec) { if (this.count == 0) { return; } Action valueWriter = codec.ValueWriter; uint tag = codec.Tag; if (codec.PackedRepeatedField) { uint num = (uint)this.CalculatePackedDataSize(codec); output.WriteTag(tag); output.WriteRawVarint32(num); for (int i = 0; i < this.count; i++) { valueWriter(output, this.array[i]); } return; } for (int j = 0; j < this.count; j++) { output.WriteTag(tag); valueWriter(output, this.array[j]); } } // Token: 0x0600064D RID: 1613 RVA: 0x00015CAC File Offset: 0x00013EAC private void EnsureSize(int size) { if (this.array.Length < size) { size = Math.Max(size, 8); T[] array = new T[Math.Max(this.array.Length * 2, size)]; Array.Copy(this.array, 0, array, 0, this.array.Length); this.array = array; } } // Token: 0x0600064E RID: 1614 RVA: 0x00015D00 File Offset: 0x00013F00 public void Add(T item) { ProtoPreconditions.CheckNotNullUnconstrained(item, "item"); this.EnsureSize(this.count + 1); T[] array = this.array; int num = this.count; this.count = num + 1; array[num] = item; } // Token: 0x0600064F RID: 1615 RVA: 0x00015D44 File Offset: 0x00013F44 public void Clear() { this.array = RepeatedField.EmptyArray; this.count = 0; } // Token: 0x06000650 RID: 1616 RVA: 0x00015D58 File Offset: 0x00013F58 public bool Contains(T item) { return this.IndexOf(item) != -1; } // Token: 0x06000651 RID: 1617 RVA: 0x00015D67 File Offset: 0x00013F67 public void CopyTo(T[] array, int arrayIndex) { Array.Copy(this.array, 0, array, arrayIndex, this.count); } // Token: 0x06000652 RID: 1618 RVA: 0x00015D80 File Offset: 0x00013F80 public bool Remove(T item) { int num = this.IndexOf(item); if (num == -1) { return false; } Array.Copy(this.array, num + 1, this.array, num, this.count - num - 1); this.count--; this.array[this.count] = default(T); return true; } // Token: 0x170001C5 RID: 453 // (get) Token: 0x06000653 RID: 1619 RVA: 0x00015DE3 File Offset: 0x00013FE3 public int Count { get { return this.count; } } // Token: 0x170001C6 RID: 454 // (get) Token: 0x06000654 RID: 1620 RVA: 0x0000761F File Offset: 0x0000581F public bool IsReadOnly { get { return false; } } // Token: 0x06000655 RID: 1621 RVA: 0x00015DEC File Offset: 0x00013FEC public void AddRange(IEnumerable values) { ProtoPreconditions.CheckNotNull>(values, "values"); RepeatedField repeatedField = values as RepeatedField; if (repeatedField != null) { this.EnsureSize(this.count + repeatedField.count); Array.Copy(repeatedField.array, 0, this.array, this.count, repeatedField.count); this.count += repeatedField.count; return; } ICollection collection = values as ICollection; if (collection != null) { int num = collection.Count; if (default(T) == null) { using (IEnumerator enumerator = collection.GetEnumerator()) { while (enumerator.MoveNext()) { if (enumerator.Current == null) { throw new ArgumentException("Sequence contained null element", "values"); } } } } this.EnsureSize(this.count + num); collection.CopyTo(this.array, this.count); this.count += num; return; } foreach (T t in values) { this.Add(t); } } // Token: 0x06000656 RID: 1622 RVA: 0x00015F38 File Offset: 0x00014138 public void Add(IEnumerable values) { this.AddRange(values); } // Token: 0x06000657 RID: 1623 RVA: 0x00015F41 File Offset: 0x00014141 public IEnumerator GetEnumerator() { int num; for (int i = 0; i < this.count; i = num + 1) { yield return this.array[i]; num = i; } yield break; } // Token: 0x06000658 RID: 1624 RVA: 0x00015F50 File Offset: 0x00014150 public override bool Equals(object obj) { return this.Equals(obj as RepeatedField); } // Token: 0x06000659 RID: 1625 RVA: 0x00015F5E File Offset: 0x0001415E IEnumerator IEnumerable.GetEnumerator() { return this.GetEnumerator(); } // Token: 0x0600065A RID: 1626 RVA: 0x00015F68 File Offset: 0x00014168 public override int GetHashCode() { int num = 0; for (int i = 0; i < this.count; i++) { num = num * 31 + this.array[i].GetHashCode(); } return num; } // Token: 0x0600065B RID: 1627 RVA: 0x00015FA8 File Offset: 0x000141A8 public bool Equals(RepeatedField other) { if (other == null) { return false; } if (other == this) { return true; } if (other.Count != this.Count) { return false; } EqualityComparer @default = EqualityComparer.Default; for (int i = 0; i < this.count; i++) { if (!@default.Equals(this.array[i], other.array[i])) { return false; } } return true; } // Token: 0x0600065C RID: 1628 RVA: 0x0001600C File Offset: 0x0001420C public int IndexOf(T item) { ProtoPreconditions.CheckNotNullUnconstrained(item, "item"); EqualityComparer @default = EqualityComparer.Default; for (int i = 0; i < this.count; i++) { if (@default.Equals(this.array[i], item)) { return i; } } return -1; } // Token: 0x0600065D RID: 1629 RVA: 0x00016054 File Offset: 0x00014254 public void Insert(int index, T item) { ProtoPreconditions.CheckNotNullUnconstrained(item, "item"); if (index < 0 || index > this.count) { throw new ArgumentOutOfRangeException("index"); } this.EnsureSize(this.count + 1); Array.Copy(this.array, index, this.array, index + 1, this.count - index); this.array[index] = item; this.count++; } // Token: 0x0600065E RID: 1630 RVA: 0x000160CC File Offset: 0x000142CC public void RemoveAt(int index) { if (index < 0 || index >= this.count) { throw new ArgumentOutOfRangeException("index"); } Array.Copy(this.array, index + 1, this.array, index, this.count - index - 1); this.count--; this.array[this.count] = default(T); } // Token: 0x0600065F RID: 1631 RVA: 0x00016138 File Offset: 0x00014338 public override string ToString() { StringWriter stringWriter = new StringWriter(); JsonFormatter.Default.WriteList(stringWriter, this); return stringWriter.ToString(); } // Token: 0x170001C7 RID: 455 public T this[int index] { get { if (index < 0 || index >= this.count) { throw new ArgumentOutOfRangeException("index"); } return this.array[index]; } set { if (index < 0 || index >= this.count) { throw new ArgumentOutOfRangeException("index"); } ProtoPreconditions.CheckNotNullUnconstrained(value, "value"); this.array[index] = value; } } // Token: 0x170001C8 RID: 456 // (get) Token: 0x06000662 RID: 1634 RVA: 0x0000761F File Offset: 0x0000581F bool IList.IsFixedSize { get { return false; } } // Token: 0x06000663 RID: 1635 RVA: 0x00015D67 File Offset: 0x00013F67 void ICollection.CopyTo(Array array, int index) { Array.Copy(this.array, 0, array, index, this.count); } // Token: 0x170001C9 RID: 457 // (get) Token: 0x06000664 RID: 1636 RVA: 0x0000761F File Offset: 0x0000581F bool ICollection.IsSynchronized { get { return false; } } // Token: 0x170001CA RID: 458 // (get) Token: 0x06000665 RID: 1637 RVA: 0x000142A1 File Offset: 0x000124A1 object ICollection.SyncRoot { get { return this; } } // Token: 0x170001CB RID: 459 object IList.this[int index] { get { return this[index]; } set { this[index] = (T)((object)value); } } // Token: 0x06000668 RID: 1640 RVA: 0x000161D3 File Offset: 0x000143D3 int IList.Add(object value) { this.Add((T)((object)value)); return this.count - 1; } // Token: 0x06000669 RID: 1641 RVA: 0x000161E9 File Offset: 0x000143E9 bool IList.Contains(object value) { return value is T && this.Contains((T)((object)value)); } // Token: 0x0600066A RID: 1642 RVA: 0x00016201 File Offset: 0x00014401 int IList.IndexOf(object value) { if (!(value is T)) { return -1; } return this.IndexOf((T)((object)value)); } // Token: 0x0600066B RID: 1643 RVA: 0x00016219 File Offset: 0x00014419 void IList.Insert(int index, object value) { this.Insert(index, (T)((object)value)); } // Token: 0x0600066C RID: 1644 RVA: 0x00016228 File Offset: 0x00014428 void IList.Remove(object value) { if (!(value is T)) { return; } this.Remove((T)((object)value)); } // Token: 0x04000269 RID: 617 private static readonly T[] EmptyArray = new T[0]; // Token: 0x0400026A RID: 618 private const int MinArraySize = 8; // Token: 0x0400026B RID: 619 private T[] array = RepeatedField.EmptyArray; // Token: 0x0400026C RID: 620 private int count; } }