From ecb567201f0218d525a02eab8768e8071ab9ebe8 Mon Sep 17 00:00:00 2001 From: Ujjwal Chadha <66971578+ujjwalchadha@users.noreply.github.com> Date: Tue, 10 Nov 2020 14:16:14 -0500 Subject: [PATCH] Fixed ConstantSplittableMap's Keys and Values to return read only collections --- .../Projections/IReadOnlyDictionary.net5.cs | 233 ++++++++---------- .../IReadOnlyDictionary.netstandard2.0.cs | 232 ++++++++--------- 2 files changed, 218 insertions(+), 247 deletions(-) diff --git a/WinRT.Runtime/Projections/IReadOnlyDictionary.net5.cs b/WinRT.Runtime/Projections/IReadOnlyDictionary.net5.cs index b976b70b1..6e66b414e 100644 --- a/WinRT.Runtime/Projections/IReadOnlyDictionary.net5.cs +++ b/WinRT.Runtime/Projections/IReadOnlyDictionary.net5.cs @@ -50,6 +50,112 @@ public static void DisposeAbi(IntPtr abi) => public static string GetGuidSignature() => GuidGenerator.GetSignature(typeof(IReadOnlyDictionary)); + private sealed class ReadOnlyDictionaryKeyCollection : global::System.Collections.Generic.IEnumerable + { + private readonly global::System.Collections.Generic.IReadOnlyDictionary dictionary; + + public ReadOnlyDictionaryKeyCollection(global::System.Collections.Generic.IReadOnlyDictionary dictionary) + { + if (dictionary == null) + throw new ArgumentNullException(nameof(dictionary)); + + this.dictionary = dictionary; + } + + public global::System.Collections.Generic.IEnumerator GetEnumerator() + { + return new ReadOnlyDictionaryKeyEnumerator(dictionary); + } + IEnumerator global::System.Collections.IEnumerable.GetEnumerator() => GetEnumerator(); + + private sealed class ReadOnlyDictionaryKeyEnumerator : global::System.Collections.Generic.IEnumerator + { + private readonly global::System.Collections.Generic.IReadOnlyDictionary dictionary; + private global::System.Collections.Generic.IEnumerator> enumeration; + + public ReadOnlyDictionaryKeyEnumerator(global::System.Collections.Generic.IReadOnlyDictionary dictionary) + { + if (dictionary == null) + throw new ArgumentNullException(nameof(dictionary)); + + this.dictionary = dictionary; + enumeration = dictionary.GetEnumerator(); + } + + void IDisposable.Dispose() + { + enumeration.Dispose(); + } + + public bool MoveNext() + { + return enumeration.MoveNext(); + } + + object IEnumerator.Current => Current; + + public K Current => enumeration.Current.Key; + + public void Reset() + { + enumeration = dictionary.GetEnumerator(); + } + } + } + + private sealed class ReadOnlyDictionaryValueCollection : global::System.Collections.Generic.IEnumerable + { + private readonly global::System.Collections.Generic.IReadOnlyDictionary dictionary; + + public ReadOnlyDictionaryValueCollection(global::System.Collections.Generic.IReadOnlyDictionary dictionary) + { + if (dictionary == null) + throw new ArgumentNullException(nameof(dictionary)); + + this.dictionary = dictionary; + } + + public global::System.Collections.Generic.IEnumerator GetEnumerator() + { + return new ReadOnlyDictionaryValueEnumerator(dictionary); + } + global::System.Collections.IEnumerator global::System.Collections.IEnumerable.GetEnumerator() => GetEnumerator(); + + private sealed class ReadOnlyDictionaryValueEnumerator : global::System.Collections.Generic.IEnumerator + { + private readonly global::System.Collections.Generic.IReadOnlyDictionary dictionary; + private global::System.Collections.Generic.IEnumerator> enumeration; + + public ReadOnlyDictionaryValueEnumerator(global::System.Collections.Generic.IReadOnlyDictionary dictionary) + { + if (dictionary == null) + throw new ArgumentNullException(nameof(dictionary)); + + this.dictionary = dictionary; + enumeration = dictionary.GetEnumerator(); + } + + void IDisposable.Dispose() + { + enumeration.Dispose(); + } + + public bool MoveNext() + { + return enumeration.MoveNext(); + } + + object IEnumerator.Current => Current; + + public V Current => enumeration.Current.Value; + + public void Reset() + { + enumeration = dictionary.GetEnumerator(); + } + } + } + public class FromAbiHelper : global::System.Collections.Generic.IReadOnlyDictionary { private readonly global::Windows.Foundation.Collections.IMapView _mapView; @@ -149,111 +255,6 @@ private static V Lookup(global::Windows.Foundation.Collections.IMapView _t IEnumerator global::System.Collections.IEnumerable.GetEnumerator() => GetEnumerator(); - private sealed class ReadOnlyDictionaryKeyCollection : global::System.Collections.Generic.IEnumerable - { - private readonly global::System.Collections.Generic.IReadOnlyDictionary dictionary; - - public ReadOnlyDictionaryKeyCollection(global::System.Collections.Generic.IReadOnlyDictionary dictionary) - { - if (dictionary == null) - throw new ArgumentNullException(nameof(dictionary)); - - this.dictionary = dictionary; - } - - public global::System.Collections.Generic.IEnumerator GetEnumerator() - { - return new ReadOnlyDictionaryKeyEnumerator(dictionary); - } - IEnumerator global::System.Collections.IEnumerable.GetEnumerator() => GetEnumerator(); - - private sealed class ReadOnlyDictionaryKeyEnumerator : global::System.Collections.Generic.IEnumerator - { - private readonly global::System.Collections.Generic.IReadOnlyDictionary dictionary; - private global::System.Collections.Generic.IEnumerator> enumeration; - - public ReadOnlyDictionaryKeyEnumerator(global::System.Collections.Generic.IReadOnlyDictionary dictionary) - { - if (dictionary == null) - throw new ArgumentNullException(nameof(dictionary)); - - this.dictionary = dictionary; - enumeration = dictionary.GetEnumerator(); - } - - void IDisposable.Dispose() - { - enumeration.Dispose(); - } - - public bool MoveNext() - { - return enumeration.MoveNext(); - } - - object IEnumerator.Current => Current; - - public K Current => enumeration.Current.Key; - - public void Reset() - { - enumeration = dictionary.GetEnumerator(); - } - } - } - - private sealed class ReadOnlyDictionaryValueCollection : global::System.Collections.Generic.IEnumerable - { - private readonly global::System.Collections.Generic.IReadOnlyDictionary dictionary; - - public ReadOnlyDictionaryValueCollection(global::System.Collections.Generic.IReadOnlyDictionary dictionary) - { - if (dictionary == null) - throw new ArgumentNullException(nameof(dictionary)); - - this.dictionary = dictionary; - } - - public global::System.Collections.Generic.IEnumerator GetEnumerator() - { - return new ReadOnlyDictionaryValueEnumerator(dictionary); - } - global::System.Collections.IEnumerator global::System.Collections.IEnumerable.GetEnumerator() => GetEnumerator(); - - private sealed class ReadOnlyDictionaryValueEnumerator : global::System.Collections.Generic.IEnumerator - { - private readonly global::System.Collections.Generic.IReadOnlyDictionary dictionary; - private global::System.Collections.Generic.IEnumerator> enumeration; - - public ReadOnlyDictionaryValueEnumerator(global::System.Collections.Generic.IReadOnlyDictionary dictionary) - { - if (dictionary == null) - throw new ArgumentNullException(nameof(dictionary)); - - this.dictionary = dictionary; - enumeration = dictionary.GetEnumerator(); - } - - void IDisposable.Dispose() - { - enumeration.Dispose(); - } - - public bool MoveNext() - { - return enumeration.MoveNext(); - } - - object IEnumerator.Current => Current; - - public V Current => enumeration.Current.Value; - - public void Reset() - { - enumeration = dictionary.GetEnumerator(); - } - } - } } public class ToAbiHelper : global::Windows.Foundation.Collections.IMapView @@ -351,30 +352,14 @@ private ConstantSplittableMap(global::System.Collections.Generic.KeyValuePair (uint)(lastItemIndex - firstItemIndex + 1); - public global::System.Collections.Generic.IEnumerable Keys + public global::System.Collections.Generic.IEnumerable Keys { - get - { - K[] keys = new K[items.Length]; - for (var i = 0; i < items.Length; i++) - { - keys[i] = items[i].Key; - } - return keys; - } + get => new ReadOnlyDictionaryKeyCollection(this); } public global::System.Collections.Generic.IEnumerable Values { - get - { - V[] values = new V[items.Length]; - for (var i = 0; i < items.Length; i++) - { - values[i] = items[i].Value; - } - return values; - } + get => new ReadOnlyDictionaryValueCollection(this); } public int Count => lastItemIndex - firstItemIndex + 1; diff --git a/WinRT.Runtime/Projections/IReadOnlyDictionary.netstandard2.0.cs b/WinRT.Runtime/Projections/IReadOnlyDictionary.netstandard2.0.cs index 9455390bc..ad8d981d5 100644 --- a/WinRT.Runtime/Projections/IReadOnlyDictionary.netstandard2.0.cs +++ b/WinRT.Runtime/Projections/IReadOnlyDictionary.netstandard2.0.cs @@ -51,6 +51,112 @@ public static void DisposeAbi(IntPtr abi) => public static string GetGuidSignature() => GuidGenerator.GetSignature(typeof(IReadOnlyDictionary)); + private sealed class ReadOnlyDictionaryKeyCollection : global::System.Collections.Generic.IEnumerable + { + private readonly global::System.Collections.Generic.IReadOnlyDictionary dictionary; + + public ReadOnlyDictionaryKeyCollection(global::System.Collections.Generic.IReadOnlyDictionary dictionary) + { + if (dictionary == null) + throw new ArgumentNullException(nameof(dictionary)); + + this.dictionary = dictionary; + } + + public global::System.Collections.Generic.IEnumerator GetEnumerator() + { + return new ReadOnlyDictionaryKeyEnumerator(dictionary); + } + IEnumerator global::System.Collections.IEnumerable.GetEnumerator() => GetEnumerator(); + + private sealed class ReadOnlyDictionaryKeyEnumerator : global::System.Collections.Generic.IEnumerator + { + private readonly global::System.Collections.Generic.IReadOnlyDictionary dictionary; + private global::System.Collections.Generic.IEnumerator> enumeration; + + public ReadOnlyDictionaryKeyEnumerator(global::System.Collections.Generic.IReadOnlyDictionary dictionary) + { + if (dictionary == null) + throw new ArgumentNullException(nameof(dictionary)); + + this.dictionary = dictionary; + enumeration = dictionary.GetEnumerator(); + } + + void IDisposable.Dispose() + { + enumeration.Dispose(); + } + + public bool MoveNext() + { + return enumeration.MoveNext(); + } + + object IEnumerator.Current => Current; + + public K Current => enumeration.Current.Key; + + public void Reset() + { + enumeration = dictionary.GetEnumerator(); + } + } + } + + private sealed class ReadOnlyDictionaryValueCollection : global::System.Collections.Generic.IEnumerable + { + private readonly global::System.Collections.Generic.IReadOnlyDictionary dictionary; + + public ReadOnlyDictionaryValueCollection(global::System.Collections.Generic.IReadOnlyDictionary dictionary) + { + if (dictionary == null) + throw new ArgumentNullException(nameof(dictionary)); + + this.dictionary = dictionary; + } + + public global::System.Collections.Generic.IEnumerator GetEnumerator() + { + return new ReadOnlyDictionaryValueEnumerator(dictionary); + } + global::System.Collections.IEnumerator global::System.Collections.IEnumerable.GetEnumerator() => GetEnumerator(); + + private sealed class ReadOnlyDictionaryValueEnumerator : global::System.Collections.Generic.IEnumerator + { + private readonly global::System.Collections.Generic.IReadOnlyDictionary dictionary; + private global::System.Collections.Generic.IEnumerator> enumeration; + + public ReadOnlyDictionaryValueEnumerator(global::System.Collections.Generic.IReadOnlyDictionary dictionary) + { + if (dictionary == null) + throw new ArgumentNullException(nameof(dictionary)); + + this.dictionary = dictionary; + enumeration = dictionary.GetEnumerator(); + } + + void IDisposable.Dispose() + { + enumeration.Dispose(); + } + + public bool MoveNext() + { + return enumeration.MoveNext(); + } + + object IEnumerator.Current => Current; + + public V Current => enumeration.Current.Value; + + public void Reset() + { + enumeration = dictionary.GetEnumerator(); + } + } + } + public class FromAbiHelper : global::System.Collections.Generic.IReadOnlyDictionary { private readonly global::ABI.System.Collections.Generic.IReadOnlyDictionary _mapView; @@ -155,111 +261,7 @@ private static V Lookup(global::ABI.System.Collections.Generic.IReadOnlyDictiona IEnumerator global::System.Collections.IEnumerable.GetEnumerator() => GetEnumerator(); - private sealed class ReadOnlyDictionaryKeyCollection : global::System.Collections.Generic.IEnumerable - { - private readonly global::System.Collections.Generic.IReadOnlyDictionary dictionary; - - public ReadOnlyDictionaryKeyCollection(global::System.Collections.Generic.IReadOnlyDictionary dictionary) - { - if (dictionary == null) - throw new ArgumentNullException(nameof(dictionary)); - - this.dictionary = dictionary; - } - - public global::System.Collections.Generic.IEnumerator GetEnumerator() - { - return new ReadOnlyDictionaryKeyEnumerator(dictionary); - } - IEnumerator global::System.Collections.IEnumerable.GetEnumerator() => GetEnumerator(); - - private sealed class ReadOnlyDictionaryKeyEnumerator : global::System.Collections.Generic.IEnumerator - { - private readonly global::System.Collections.Generic.IReadOnlyDictionary dictionary; - private global::System.Collections.Generic.IEnumerator> enumeration; - - public ReadOnlyDictionaryKeyEnumerator(global::System.Collections.Generic.IReadOnlyDictionary dictionary) - { - if (dictionary == null) - throw new ArgumentNullException(nameof(dictionary)); - - this.dictionary = dictionary; - enumeration = dictionary.GetEnumerator(); - } - - void IDisposable.Dispose() - { - enumeration.Dispose(); - } - - public bool MoveNext() - { - return enumeration.MoveNext(); - } - - object IEnumerator.Current => Current; - - public K Current => enumeration.Current.Key; - - public void Reset() - { - enumeration = dictionary.GetEnumerator(); - } - } - } - - private sealed class ReadOnlyDictionaryValueCollection : global::System.Collections.Generic.IEnumerable - { - private readonly global::System.Collections.Generic.IReadOnlyDictionary dictionary; - - public ReadOnlyDictionaryValueCollection(global::System.Collections.Generic.IReadOnlyDictionary dictionary) - { - if (dictionary == null) - throw new ArgumentNullException(nameof(dictionary)); - - this.dictionary = dictionary; - } - - public global::System.Collections.Generic.IEnumerator GetEnumerator() - { - return new ReadOnlyDictionaryValueEnumerator(dictionary); - } - global::System.Collections.IEnumerator global::System.Collections.IEnumerable.GetEnumerator() => GetEnumerator(); - - private sealed class ReadOnlyDictionaryValueEnumerator : global::System.Collections.Generic.IEnumerator - { - private readonly global::System.Collections.Generic.IReadOnlyDictionary dictionary; - private global::System.Collections.Generic.IEnumerator> enumeration; - - public ReadOnlyDictionaryValueEnumerator(global::System.Collections.Generic.IReadOnlyDictionary dictionary) - { - if (dictionary == null) - throw new ArgumentNullException(nameof(dictionary)); - - this.dictionary = dictionary; - enumeration = dictionary.GetEnumerator(); - } - - void IDisposable.Dispose() - { - enumeration.Dispose(); - } - - public bool MoveNext() - { - return enumeration.MoveNext(); - } - - object IEnumerator.Current => Current; - - public V Current => enumeration.Current.Value; - - public void Reset() - { - enumeration = dictionary.GetEnumerator(); - } - } - } + } public class ToAbiHelper : global::Windows.Foundation.Collections.IMapView @@ -359,28 +361,12 @@ private ConstantSplittableMap(global::System.Collections.Generic.KeyValuePair Keys { - get - { - K[] keys = new K[items.Length]; - for (var i = 0; i < items.Length; i++) - { - keys[i] = items[i].Key; - } - return keys; - } + get => new ReadOnlyDictionaryKeyCollection(this); } public global::System.Collections.Generic.IEnumerable Values { - get - { - V[] values = new V[items.Length]; - for (var i = 0; i < items.Length; i++) - { - values[i] = items[i].Value; - } - return values; - } + get => new ReadOnlyDictionaryValueCollection(this); } public int Count => lastItemIndex - firstItemIndex + 1;