using System; using System.Collections; using System.Collections.Generic; using System.IO; using System.Linq; using Google.Protobuf.Reflection; namespace Google.Protobuf.Collections { // Token: 0x0200006F RID: 111 public sealed class MapField : IDeepCloneable>, IDictionary, ICollection>, IEnumerable>, IEnumerable, IEquatable>, IDictionary, ICollection { // Token: 0x0600060B RID: 1547 RVA: 0x000151CC File Offset: 0x000133CC public MapField Clone() { MapField mapField = new MapField(); if (typeof(IDeepCloneable).IsAssignableFrom(typeof(TValue))) { using (LinkedList>.Enumerator enumerator = this.list.GetEnumerator()) { while (enumerator.MoveNext()) { KeyValuePair keyValuePair = enumerator.Current; mapField.Add(keyValuePair.Key, ((IDeepCloneable)((object)keyValuePair.Value)).Clone()); } return mapField; } } mapField.Add(this); return mapField; } // Token: 0x0600060C RID: 1548 RVA: 0x00015264 File Offset: 0x00013464 public void Add(TKey key, TValue value) { if (this.ContainsKey(key)) { throw new ArgumentException("Key already exists in map", "key"); } this[key] = value; } // Token: 0x0600060D RID: 1549 RVA: 0x00015287 File Offset: 0x00013487 public bool ContainsKey(TKey key) { ProtoPreconditions.CheckNotNullUnconstrained(key, "key"); return this.map.ContainsKey(key); } // Token: 0x0600060E RID: 1550 RVA: 0x000152A4 File Offset: 0x000134A4 private bool ContainsValue(TValue value) { EqualityComparer comparer = EqualityComparer.Default; return this.list.Any((KeyValuePair pair) => comparer.Equals(pair.Value, value)); } // Token: 0x0600060F RID: 1551 RVA: 0x000152E0 File Offset: 0x000134E0 public bool Remove(TKey key) { ProtoPreconditions.CheckNotNullUnconstrained(key, "key"); LinkedListNode> linkedListNode; if (this.map.TryGetValue(key, out linkedListNode)) { this.map.Remove(key); linkedListNode.List.Remove(linkedListNode); return true; } return false; } // Token: 0x06000610 RID: 1552 RVA: 0x00015328 File Offset: 0x00013528 public bool TryGetValue(TKey key, out TValue value) { LinkedListNode> linkedListNode; if (this.map.TryGetValue(key, out linkedListNode)) { value = linkedListNode.Value.Value; return true; } value = default(TValue); return false; } // Token: 0x170001B5 RID: 437 public TValue this[TKey key] { get { ProtoPreconditions.CheckNotNullUnconstrained(key, "key"); TValue tvalue; if (this.TryGetValue(key, out tvalue)) { return tvalue; } throw new KeyNotFoundException(); } set { ProtoPreconditions.CheckNotNullUnconstrained(key, "key"); if (value == null) { ProtoPreconditions.CheckNotNullUnconstrained(value, "value"); } KeyValuePair keyValuePair = new KeyValuePair(key, value); LinkedListNode> linkedListNode; if (this.map.TryGetValue(key, out linkedListNode)) { linkedListNode.Value = keyValuePair; return; } linkedListNode = this.list.AddLast(keyValuePair); this.map[key] = linkedListNode; } } // Token: 0x170001B6 RID: 438 // (get) Token: 0x06000613 RID: 1555 RVA: 0x000153F8 File Offset: 0x000135F8 public ICollection Keys { get { return new MapField.MapView(this, (KeyValuePair pair) => pair.Key, new Func(this.ContainsKey)); } } // Token: 0x170001B7 RID: 439 // (get) Token: 0x06000614 RID: 1556 RVA: 0x0001542C File Offset: 0x0001362C public ICollection Values { get { return new MapField.MapView(this, (KeyValuePair pair) => pair.Value, new Func(this.ContainsValue)); } } // Token: 0x06000615 RID: 1557 RVA: 0x00015460 File Offset: 0x00013660 public void Add(IDictionary entries) { ProtoPreconditions.CheckNotNull>(entries, "entries"); foreach (KeyValuePair keyValuePair in entries) { this.Add(keyValuePair.Key, keyValuePair.Value); } } // Token: 0x06000616 RID: 1558 RVA: 0x000154C4 File Offset: 0x000136C4 public IEnumerator> GetEnumerator() { return this.list.GetEnumerator(); } // Token: 0x06000617 RID: 1559 RVA: 0x000154D6 File Offset: 0x000136D6 IEnumerator IEnumerable.GetEnumerator() { return this.GetEnumerator(); } // Token: 0x06000618 RID: 1560 RVA: 0x000154DE File Offset: 0x000136DE void ICollection>.Add(KeyValuePair item) { this.Add(item.Key, item.Value); } // Token: 0x06000619 RID: 1561 RVA: 0x000154F4 File Offset: 0x000136F4 public void Clear() { this.list.Clear(); this.map.Clear(); } // Token: 0x0600061A RID: 1562 RVA: 0x0001550C File Offset: 0x0001370C bool ICollection>.Contains(KeyValuePair item) { TValue tvalue; return this.TryGetValue(item.Key, out tvalue) && EqualityComparer.Default.Equals(item.Value, tvalue); } // Token: 0x0600061B RID: 1563 RVA: 0x0001553E File Offset: 0x0001373E void ICollection>.CopyTo(KeyValuePair[] array, int arrayIndex) { this.list.CopyTo(array, arrayIndex); } // Token: 0x0600061C RID: 1564 RVA: 0x00015550 File Offset: 0x00013750 bool ICollection>.Remove(KeyValuePair item) { if (item.Key == null) { throw new ArgumentException("Key is null", "item"); } LinkedListNode> linkedListNode; if (this.map.TryGetValue(item.Key, out linkedListNode) && EqualityComparer.Default.Equals(item.Value, linkedListNode.Value.Value)) { this.map.Remove(item.Key); linkedListNode.List.Remove(linkedListNode); return true; } return false; } // Token: 0x170001B8 RID: 440 // (get) Token: 0x0600061D RID: 1565 RVA: 0x000155D4 File Offset: 0x000137D4 public int Count { get { return this.list.Count; } } // Token: 0x170001B9 RID: 441 // (get) Token: 0x0600061E RID: 1566 RVA: 0x0000761F File Offset: 0x0000581F public bool IsReadOnly { get { return false; } } // Token: 0x0600061F RID: 1567 RVA: 0x000155E1 File Offset: 0x000137E1 public override bool Equals(object other) { return this.Equals(other as MapField); } // Token: 0x06000620 RID: 1568 RVA: 0x000155F0 File Offset: 0x000137F0 public override int GetHashCode() { EqualityComparer @default = EqualityComparer.Default; int num = 0; foreach (KeyValuePair keyValuePair in this.list) { int num2 = num; TKey key = keyValuePair.Key; num = num2 ^ (key.GetHashCode() * 31 + @default.GetHashCode(keyValuePair.Value)); } return num; } // Token: 0x06000621 RID: 1569 RVA: 0x00015670 File Offset: 0x00013870 public bool Equals(MapField other) { if (other == null) { return false; } if (other == this) { return true; } if (other.Count != this.Count) { return false; } EqualityComparer @default = EqualityComparer.Default; foreach (KeyValuePair keyValuePair in this) { TValue tvalue; if (!other.TryGetValue(keyValuePair.Key, out tvalue)) { return false; } if (!@default.Equals(tvalue, keyValuePair.Value)) { return false; } } return true; } // Token: 0x06000622 RID: 1570 RVA: 0x00015704 File Offset: 0x00013904 public void AddEntriesFrom(CodedInputStream input, MapField.Codec codec) { MapField.Codec.MessageAdapter messageAdapter = new MapField.Codec.MessageAdapter(codec); do { messageAdapter.Reset(); input.ReadMessage(messageAdapter); this[messageAdapter.Key] = messageAdapter.Value; } while (input.MaybeConsumeTag(codec.MapTag)); } // Token: 0x06000623 RID: 1571 RVA: 0x00015748 File Offset: 0x00013948 public void WriteTo(CodedOutputStream output, MapField.Codec codec) { MapField.Codec.MessageAdapter messageAdapter = new MapField.Codec.MessageAdapter(codec); foreach (KeyValuePair keyValuePair in this.list) { messageAdapter.Key = keyValuePair.Key; messageAdapter.Value = keyValuePair.Value; output.WriteTag(codec.MapTag); output.WriteMessage(messageAdapter); } } // Token: 0x06000624 RID: 1572 RVA: 0x000157C8 File Offset: 0x000139C8 public int CalculateSize(MapField.Codec codec) { if (this.Count == 0) { return 0; } MapField.Codec.MessageAdapter messageAdapter = new MapField.Codec.MessageAdapter(codec); int num = 0; foreach (KeyValuePair keyValuePair in this.list) { messageAdapter.Key = keyValuePair.Key; messageAdapter.Value = keyValuePair.Value; num += CodedOutputStream.ComputeRawVarint32Size(codec.MapTag); num += CodedOutputStream.ComputeMessageSize(messageAdapter); } return num; } // Token: 0x06000625 RID: 1573 RVA: 0x0001585C File Offset: 0x00013A5C public override string ToString() { StringWriter stringWriter = new StringWriter(); JsonFormatter.Default.WriteDictionary(stringWriter, this); return stringWriter.ToString(); } // Token: 0x06000626 RID: 1574 RVA: 0x00015881 File Offset: 0x00013A81 void IDictionary.Add(object key, object value) { this.Add((TKey)((object)key), (TValue)((object)value)); } // Token: 0x06000627 RID: 1575 RVA: 0x00015895 File Offset: 0x00013A95 bool IDictionary.Contains(object key) { return key is TKey && this.ContainsKey((TKey)((object)key)); } // Token: 0x06000628 RID: 1576 RVA: 0x000158AD File Offset: 0x00013AAD IDictionaryEnumerator IDictionary.GetEnumerator() { return new MapField.DictionaryEnumerator(this.GetEnumerator()); } // Token: 0x06000629 RID: 1577 RVA: 0x000158BA File Offset: 0x00013ABA void IDictionary.Remove(object key) { ProtoPreconditions.CheckNotNull(key, "key"); if (!(key is TKey)) { return; } this.Remove((TKey)((object)key)); } // Token: 0x0600062A RID: 1578 RVA: 0x000158DE File Offset: 0x00013ADE void ICollection.CopyTo(Array array, int index) { ((ICollection)this.Select((KeyValuePair pair) => new DictionaryEntry(pair.Key, pair.Value)).ToList()).CopyTo(array, index); } // Token: 0x170001BA RID: 442 // (get) Token: 0x0600062B RID: 1579 RVA: 0x0000761F File Offset: 0x0000581F bool IDictionary.IsFixedSize { get { return false; } } // Token: 0x170001BB RID: 443 // (get) Token: 0x0600062C RID: 1580 RVA: 0x00015911 File Offset: 0x00013B11 ICollection IDictionary.Keys { get { return (ICollection)this.Keys; } } // Token: 0x170001BC RID: 444 // (get) Token: 0x0600062D RID: 1581 RVA: 0x0001591E File Offset: 0x00013B1E ICollection IDictionary.Values { get { return (ICollection)this.Values; } } // Token: 0x170001BD RID: 445 // (get) Token: 0x0600062E RID: 1582 RVA: 0x0000761F File Offset: 0x0000581F bool ICollection.IsSynchronized { get { return false; } } // Token: 0x170001BE RID: 446 // (get) Token: 0x0600062F RID: 1583 RVA: 0x000142A1 File Offset: 0x000124A1 object ICollection.SyncRoot { get { return this; } } // Token: 0x170001BF RID: 447 object IDictionary.this[object key] { get { ProtoPreconditions.CheckNotNull(key, "key"); if (!(key is TKey)) { return null; } TValue tvalue; this.TryGetValue((TKey)((object)key), out tvalue); return tvalue; } set { this[(TKey)((object)key)] = (TValue)((object)value); } } // Token: 0x04000266 RID: 614 private readonly Dictionary>> map = new Dictionary>>(); // Token: 0x04000267 RID: 615 private readonly LinkedList> list = new LinkedList>(); // Token: 0x020000C8 RID: 200 private class DictionaryEnumerator : IDictionaryEnumerator, IEnumerator { // Token: 0x06000787 RID: 1927 RVA: 0x00017941 File Offset: 0x00015B41 internal DictionaryEnumerator(IEnumerator> enumerator) { this.enumerator = enumerator; } // Token: 0x06000788 RID: 1928 RVA: 0x00017950 File Offset: 0x00015B50 public bool MoveNext() { return this.enumerator.MoveNext(); } // Token: 0x06000789 RID: 1929 RVA: 0x0001795D File Offset: 0x00015B5D public void Reset() { this.enumerator.Reset(); } // Token: 0x170001D4 RID: 468 // (get) Token: 0x0600078A RID: 1930 RVA: 0x0001796A File Offset: 0x00015B6A public object Current { get { return this.Entry; } } // Token: 0x170001D5 RID: 469 // (get) Token: 0x0600078B RID: 1931 RVA: 0x00017977 File Offset: 0x00015B77 public DictionaryEntry Entry { get { return new DictionaryEntry(this.Key, this.Value); } } // Token: 0x170001D6 RID: 470 // (get) Token: 0x0600078C RID: 1932 RVA: 0x0001798C File Offset: 0x00015B8C public object Key { get { KeyValuePair keyValuePair = this.enumerator.Current; return keyValuePair.Key; } } // Token: 0x170001D7 RID: 471 // (get) Token: 0x0600078D RID: 1933 RVA: 0x000179B4 File Offset: 0x00015BB4 public object Value { get { KeyValuePair keyValuePair = this.enumerator.Current; return keyValuePair.Value; } } // Token: 0x04000305 RID: 773 private readonly IEnumerator> enumerator; } // Token: 0x020000C9 RID: 201 public sealed class Codec { // Token: 0x0600078E RID: 1934 RVA: 0x000179D9 File Offset: 0x00015BD9 public Codec(FieldCodec keyCodec, FieldCodec valueCodec, uint mapTag) { this.keyCodec = keyCodec; this.valueCodec = valueCodec; this.mapTag = mapTag; } // Token: 0x170001D8 RID: 472 // (get) Token: 0x0600078F RID: 1935 RVA: 0x000179F6 File Offset: 0x00015BF6 internal uint MapTag { get { return this.mapTag; } } // Token: 0x04000306 RID: 774 private readonly FieldCodec keyCodec; // Token: 0x04000307 RID: 775 private readonly FieldCodec valueCodec; // Token: 0x04000308 RID: 776 private readonly uint mapTag; // Token: 0x020000DF RID: 223 internal class MessageAdapter : IMessage { // Token: 0x170001FD RID: 509 // (get) Token: 0x06000818 RID: 2072 RVA: 0x00018B77 File Offset: 0x00016D77 // (set) Token: 0x06000819 RID: 2073 RVA: 0x00018B7F File Offset: 0x00016D7F internal TKey Key { get; set; } // Token: 0x170001FE RID: 510 // (get) Token: 0x0600081A RID: 2074 RVA: 0x00018B88 File Offset: 0x00016D88 // (set) Token: 0x0600081B RID: 2075 RVA: 0x00018B90 File Offset: 0x00016D90 internal TValue Value { get; set; } // Token: 0x0600081C RID: 2076 RVA: 0x00018B99 File Offset: 0x00016D99 internal MessageAdapter(MapField.Codec codec) { this.codec = codec; } // Token: 0x0600081D RID: 2077 RVA: 0x00018BA8 File Offset: 0x00016DA8 internal void Reset() { this.Key = this.codec.keyCodec.DefaultValue; this.Value = this.codec.valueCodec.DefaultValue; } // Token: 0x0600081E RID: 2078 RVA: 0x00018BD8 File Offset: 0x00016DD8 public void MergeFrom(CodedInputStream input) { uint num; while ((num = input.ReadTag()) != 0U) { if (num == this.codec.keyCodec.Tag) { this.Key = this.codec.keyCodec.Read(input); } else if (num == this.codec.valueCodec.Tag) { this.Value = this.codec.valueCodec.Read(input); } else { input.SkipLastField(); } } if (this.Value == null) { this.Value = this.codec.valueCodec.Read(new CodedInputStream(MapField.Codec.MessageAdapter.ZeroLengthMessageStreamData)); } } // Token: 0x0600081F RID: 2079 RVA: 0x00018C7C File Offset: 0x00016E7C public void WriteTo(CodedOutputStream output) { this.codec.keyCodec.WriteTagAndValue(output, this.Key); this.codec.valueCodec.WriteTagAndValue(output, this.Value); } // Token: 0x06000820 RID: 2080 RVA: 0x00018CAC File Offset: 0x00016EAC public int CalculateSize() { return this.codec.keyCodec.CalculateSizeWithTag(this.Key) + this.codec.valueCodec.CalculateSizeWithTag(this.Value); } // Token: 0x170001FF RID: 511 // (get) Token: 0x06000821 RID: 2081 RVA: 0x00018CDB File Offset: 0x00016EDB MessageDescriptor IMessage.Descriptor { get { return null; } } // Token: 0x0400038E RID: 910 private static readonly byte[] ZeroLengthMessageStreamData = new byte[1]; // Token: 0x0400038F RID: 911 private readonly MapField.Codec codec; } } // Token: 0x020000CA RID: 202 private class MapView : ICollection, IEnumerable, IEnumerable, ICollection { // Token: 0x06000790 RID: 1936 RVA: 0x000179FE File Offset: 0x00015BFE internal MapView(MapField parent, Func, T> projection, Func containsCheck) { this.parent = parent; this.projection = projection; this.containsCheck = containsCheck; } // Token: 0x170001D9 RID: 473 // (get) Token: 0x06000791 RID: 1937 RVA: 0x00017A1B File Offset: 0x00015C1B public int Count { get { return this.parent.Count; } } // Token: 0x170001DA RID: 474 // (get) Token: 0x06000792 RID: 1938 RVA: 0x0000324B File Offset: 0x0000144B public bool IsReadOnly { get { return true; } } // Token: 0x170001DB RID: 475 // (get) Token: 0x06000793 RID: 1939 RVA: 0x0000761F File Offset: 0x0000581F public bool IsSynchronized { get { return false; } } // Token: 0x170001DC RID: 476 // (get) Token: 0x06000794 RID: 1940 RVA: 0x00017A28 File Offset: 0x00015C28 public object SyncRoot { get { return this.parent; } } // Token: 0x06000795 RID: 1941 RVA: 0x00007624 File Offset: 0x00005824 public void Add(T item) { throw new NotSupportedException(); } // Token: 0x06000796 RID: 1942 RVA: 0x00007624 File Offset: 0x00005824 public void Clear() { throw new NotSupportedException(); } // Token: 0x06000797 RID: 1943 RVA: 0x00017A30 File Offset: 0x00015C30 public bool Contains(T item) { return this.containsCheck(item); } // Token: 0x06000798 RID: 1944 RVA: 0x00017A40 File Offset: 0x00015C40 public void CopyTo(T[] array, int arrayIndex) { if (arrayIndex < 0) { throw new ArgumentOutOfRangeException("arrayIndex"); } if (arrayIndex + this.Count >= array.Length) { throw new ArgumentException("Not enough space in the array", "array"); } foreach (T t in this) { array[arrayIndex++] = t; } } // Token: 0x06000799 RID: 1945 RVA: 0x00017ABC File Offset: 0x00015CBC public IEnumerator GetEnumerator() { return this.parent.list.Select(this.projection).GetEnumerator(); } // Token: 0x0600079A RID: 1946 RVA: 0x00007624 File Offset: 0x00005824 public bool Remove(T item) { throw new NotSupportedException(); } // Token: 0x0600079B RID: 1947 RVA: 0x00017AD9 File Offset: 0x00015CD9 IEnumerator IEnumerable.GetEnumerator() { return this.GetEnumerator(); } // Token: 0x0600079C RID: 1948 RVA: 0x00017AE4 File Offset: 0x00015CE4 public void CopyTo(Array array, int index) { if (index < 0) { throw new ArgumentOutOfRangeException("index"); } if (index + this.Count >= array.Length) { throw new ArgumentException("Not enough space in the array", "array"); } foreach (T t in this) { array.SetValue(t, index++); } } // Token: 0x04000309 RID: 777 private readonly MapField parent; // Token: 0x0400030A RID: 778 private readonly Func, T> projection; // Token: 0x0400030B RID: 779 private readonly Func containsCheck; } } }