Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
80 changes: 46 additions & 34 deletions src/Foundation/NSDictionary.cs
Original file line number Diff line number Diff line change
Expand Up @@ -129,6 +129,40 @@ internal static NSArray PickOdd (object f, object [] args)
return NSArray.FromObjects (ret);
}

// Checks:
// * 'objects' and 'keys' for null
// * count isn't negative
// * count isn't higher than the number of elements in either array
// returns false if an empty dictionary can be returned
private protected static bool ValidateFromObjectsAndKeys<T, K> (T [] objects, K [] keys, nint count)
{
ArgumentNullException.ThrowIfNull (objects);
ArgumentNullException.ThrowIfNull (keys);

if (count < 0)
throw new ArgumentOutOfRangeException (nameof (count), "Must be non-negative and not greater than the length of either array");

if (objects.Length < count || keys.Length < count)
throw new ArgumentException ("Must be non-negative and not greater than the length of either array", nameof (count));

return count > 0;
}

// Checks:
// * 'objects' and 'keys' for null
// * 'objects' and 'keys' have the same number of elements
// returns false if an empty dictionary can be returned
private protected static bool ValidateFromObjectsAndKeys<T, K> (T [] objects, K [] keys)
{
ArgumentNullException.ThrowIfNull (objects);
ArgumentNullException.ThrowIfNull (keys);

if (objects.Length != keys.Length)
throw new ArgumentException (nameof (objects) + " and " + nameof (keys) + " arrays have different sizes");

return objects.Length > 0;
}

/// <summary>
/// Creates a dictionary from a set of values and keys.
/// </summary>
Expand All @@ -137,14 +171,10 @@ internal static NSArray PickOdd (object f, object [] args)
/// <returns>A new <see cref="NSDictionary"/> containing the specified key-value pairs.</returns>
public static NSDictionary FromObjectsAndKeys (NSObject? [] objects, NSObject [] keys)
{
if (objects is null)
throw new ArgumentNullException (nameof (objects));
if (keys is null)
throw new ArgumentNullException (nameof (keys));
if (objects.Length != keys.Length)
throw new ArgumentException (nameof (objects) + " and " + nameof (keys) + " arrays have different sizes");
if (!ValidateFromObjectsAndKeys (objects, keys))
return new NSDictionary ();

return FromObjectsAndKeys (objects, keys, keys.Length);
return FromObjectsAndKeys (objects, keys, objects.Length);
}

/// <summary>
Expand All @@ -160,35 +190,23 @@ public static NSDictionary FromObjectsAndKeys (NSObject? [] objects, NSObject []
/// </remarks>
public static NSDictionary FromObjectsAndKeys (object [] objects, object [] keys)
{
if (objects is null)
throw new ArgumentNullException (nameof (objects));
if (keys is null)
throw new ArgumentNullException (nameof (keys));
if (objects.Length != keys.Length)
throw new ArgumentException (nameof (objects) + " and " + nameof (keys) + " arrays have different sizes");
if (!ValidateFromObjectsAndKeys (objects, keys))
return new NSDictionary ();

using (var no = NSArray.FromObjects (objects))
using (var nk = NSArray.FromObjects (keys))
return FromObjectsAndKeysInternal (no, nk);
return FromObjectsAndKeys (objects, keys, objects.Length);
}

/// <summary>
/// Creates a dictionary from a set of values and keys.
/// </summary>
/// <param name="objects">Array of values for the dictionary. Null elements are stored as <see cref="NSNull.Null"/>.</param>
/// <param name="keys">Array of keys for the dictionary.</param>
/// <param name="count">Number of items to use in the creation; the number must be less than or equal to the number of elements in the arrays.</param>
/// <param name="count">Number of items to use in the creation; the number must be less than or equal to the number of elements in both arrays.</param>
/// <returns>A new <see cref="NSDictionary"/> containing the specified key-value pairs.</returns>
public static NSDictionary FromObjectsAndKeys (NSObject? [] objects, NSObject [] keys, nint count)
{
if (objects is null)
throw new ArgumentNullException (nameof (objects));
if (keys is null)
throw new ArgumentNullException (nameof (keys));
if (objects.Length != keys.Length)
throw new ArgumentException (nameof (objects) + " and " + nameof (keys) + " arrays have different sizes");
if (count < 1 || objects.Length < count || keys.Length < count)
throw new ArgumentException ("count");
if (!ValidateFromObjectsAndKeys (objects, keys, count))
return new NSDictionary ();

using (var no = NSArray.FromNativeObjects (objects, count))
using (var nk = NSArray.FromNativeObjects (keys, count))
Expand All @@ -200,7 +218,7 @@ public static NSDictionary FromObjectsAndKeys (NSObject? [] objects, NSObject []
/// </summary>
/// <param name="objects">Array of values for the dictionary.</param>
/// <param name="keys">Array of keys for the dictionary.</param>
/// <param name="count">Number of items to use in the creation; the number must be less than or equal to the number of elements in the arrays.</param>
/// <param name="count">Number of items to use in the creation; the number must be less than or equal to the number of elements in both arrays.</param>
/// <returns>A new <see cref="NSDictionary"/> containing the specified key-value pairs.</returns>
/// <remarks>
/// <para>
Expand All @@ -209,14 +227,8 @@ public static NSDictionary FromObjectsAndKeys (NSObject? [] objects, NSObject []
/// </remarks>
public static NSDictionary FromObjectsAndKeys (object [] objects, object [] keys, nint count)
{
if (objects is null)
throw new ArgumentNullException (nameof (objects));
if (keys is null)
throw new ArgumentNullException (nameof (keys));
if (objects.Length != keys.Length)
throw new ArgumentException (nameof (objects) + " and " + nameof (keys) + " arrays have different sizes");
if (count < 1 || objects.Length < count || keys.Length < count)
throw new ArgumentException ("count");
if (!ValidateFromObjectsAndKeys (objects, keys, count))
return new NSDictionary ();

using (var no = NSArray.FromObjects (count, objects))
using (var nk = NSArray.FromObjects (count, keys))
Expand Down
47 changes: 12 additions & 35 deletions src/Foundation/NSDictionary_2.cs
Original file line number Diff line number Diff line change
Expand Up @@ -256,13 +256,8 @@ static NSDictionary<TKey, TValue> GenericFromObjectsAndKeysInternal (NSArray obj
/// <returns>A new dictionary containing the specified key-value pairs.</returns>
public static NSDictionary<TKey, TValue> FromObjectsAndKeys (TValue? [] objects, TKey [] keys, nint count)
{
ArgumentNullException.ThrowIfNull (objects);
ArgumentNullException.ThrowIfNull (keys);

if (objects.Length != keys.Length)
throw new ArgumentException (nameof (objects) + " and " + nameof (keys) + " arrays have different sizes");
if (count < 1 || objects.Length < count)
throw new ArgumentException (nameof (count));
if (!ValidateFromObjectsAndKeys (objects, keys, count))
return new NSDictionary<TKey, TValue> ();

using (var no = NSArray.FromNativeObjects (objects, count))
using (var nk = NSArray.FromNativeObjects (keys, count))
Expand All @@ -277,13 +272,10 @@ public static NSDictionary<TKey, TValue> FromObjectsAndKeys (TValue? [] objects,
/// <returns>A new dictionary containing the specified key-value pairs.</returns>
public static NSDictionary<TKey, TValue> FromObjectsAndKeys (TValue? [] objects, TKey [] keys)
{
ArgumentNullException.ThrowIfNull (objects);
ArgumentNullException.ThrowIfNull (keys);
if (!ValidateFromObjectsAndKeys (objects, keys))
return new NSDictionary<TKey, TValue> ();

if (objects.Length != keys.Length)
throw new ArgumentException (nameof (objects) + " and " + nameof (keys) + " arrays have different sizes");

return FromObjectsAndKeys (objects, keys, keys.Length);
return FromObjectsAndKeys (objects, keys, objects.Length);
}

/// <summary>
Expand All @@ -294,15 +286,10 @@ public static NSDictionary<TKey, TValue> FromObjectsAndKeys (TValue? [] objects,
/// <returns>A new dictionary containing the specified key-value pairs.</returns>
public static NSDictionary<TKey, TValue> FromObjectsAndKeys (object [] objects, object [] keys)
{
ArgumentNullException.ThrowIfNull (objects);
ArgumentNullException.ThrowIfNull (keys);

if (objects.Length != keys.Length)
throw new ArgumentException (nameof (objects) + " and " + nameof (keys) + " arrays have different sizes");
if (!ValidateFromObjectsAndKeys (objects, keys))
return new NSDictionary<TKey, TValue> ();

using (var no = NSArray.FromObjects (objects))
using (var nk = NSArray.FromObjects (keys))
return GenericFromObjectsAndKeysInternal (no, nk);
return FromObjectsAndKeys (objects, keys, objects.Length);
}

/// <summary>
Expand All @@ -314,13 +301,8 @@ public static NSDictionary<TKey, TValue> FromObjectsAndKeys (object [] objects,
/// <returns>A new dictionary containing the specified key-value pairs.</returns>
public static NSDictionary<TKey, TValue> FromObjectsAndKeys (NSObject? [] objects, NSObject [] keys, nint count)
{
ArgumentNullException.ThrowIfNull (objects);
ArgumentNullException.ThrowIfNull (keys);

if (objects.Length != keys.Length)
throw new ArgumentException (nameof (objects) + " and " + nameof (keys) + " arrays have different sizes");
if (count < 1 || objects.Length < count || keys.Length < count)
throw new ArgumentException (nameof (count));
if (!ValidateFromObjectsAndKeys (objects, keys, count))
return new NSDictionary<TKey, TValue> ();

using (var no = NSArray.FromNativeObjects (objects, count))
using (var nk = NSArray.FromNativeObjects (keys, count))
Expand All @@ -336,13 +318,8 @@ public static NSDictionary<TKey, TValue> FromObjectsAndKeys (NSObject? [] object
/// <returns>A new dictionary containing the specified key-value pairs.</returns>
public static NSDictionary<TKey, TValue> FromObjectsAndKeys (object [] objects, object [] keys, nint count)
{
ArgumentNullException.ThrowIfNull (objects);
ArgumentNullException.ThrowIfNull (keys);

if (objects.Length != keys.Length)
throw new ArgumentException (nameof (objects) + " and " + nameof (keys) + " arrays have different sizes");
if (count < 1 || objects.Length < count || keys.Length < count)
throw new ArgumentException (nameof (count));
if (!ValidateFromObjectsAndKeys (objects, keys, count))
return new NSDictionary<TKey, TValue> ();

using (var no = NSArray.FromObjects (count, objects))
using (var nk = NSArray.FromObjects (count, keys))
Expand Down
64 changes: 20 additions & 44 deletions src/Foundation/NSMutableDictionary.cs
Original file line number Diff line number Diff line change
Expand Up @@ -41,16 +41,10 @@ public partial class NSMutableDictionary : NSDictionary, IDictionary, IDictionar
/// <exception cref="ArgumentException">Thrown when the arrays have different sizes.</exception>
public static NSMutableDictionary FromObjectsAndKeys (NSObject [] objects, NSObject [] keys)
{
if (objects is null)
throw new ArgumentNullException (nameof (objects));
if (keys is null)
throw new ArgumentNullException (nameof (keys));
if (objects.Length != keys.Length)
throw new ArgumentException (nameof (objects) + " and " + nameof (keys) + " arrays have different sizes");

using (var no = NSArray.FromNSObjects (objects))
using (var nk = NSArray.FromNSObjects (keys))
return FromObjectsAndKeysInternal (no, nk);
if (!ValidateFromObjectsAndKeys (objects, keys))
return new NSMutableDictionary ();

return FromObjectsAndKeys (objects, keys, objects.Length);
}

/// <summary>Creates a mutable dictionary from the specified arrays of objects and keys.</summary>
Expand All @@ -61,16 +55,10 @@ public static NSMutableDictionary FromObjectsAndKeys (NSObject [] objects, NSObj
/// <exception cref="ArgumentException">Thrown when the arrays have different sizes.</exception>
public static NSMutableDictionary FromObjectsAndKeys (object [] objects, object [] keys)
{
if (objects is null)
throw new ArgumentNullException (nameof (objects));
if (keys is null)
throw new ArgumentNullException (nameof (keys));
if (objects.Length != keys.Length)
throw new ArgumentException (nameof (objects) + " and " + nameof (keys) + " arrays have different sizes");

using (var no = NSArray.FromObjects (objects))
using (var nk = NSArray.FromObjects (keys))
return FromObjectsAndKeysInternal (no, nk);
if (!ValidateFromObjectsAndKeys (objects, keys))
return new NSMutableDictionary ();

return FromObjectsAndKeys (objects, keys, objects.Length);
}

/// <summary>Creates a mutable dictionary from the specified number of objects and keys from the arrays.</summary>
Expand All @@ -79,20 +67,14 @@ public static NSMutableDictionary FromObjectsAndKeys (object [] objects, object
/// <param name="count">The number of elements to copy from the arrays.</param>
/// <returns>A new mutable dictionary containing the specified objects and keys.</returns>
/// <exception cref="ArgumentNullException">Thrown when <paramref name="objects"/> or <paramref name="keys"/> is <see langword="null"/>.</exception>
/// <exception cref="ArgumentException">Thrown when the arrays have different sizes or <paramref name="count"/> is invalid.</exception>
/// <exception cref="ArgumentException">Thrown when <paramref name="count"/> is invalid.</exception>
public static NSMutableDictionary FromObjectsAndKeys (NSObject [] objects, NSObject [] keys, nint count)
{
if (objects is null)
throw new ArgumentNullException (nameof (objects));
if (keys is null)
throw new ArgumentNullException (nameof (keys));
if (objects.Length != keys.Length)
throw new ArgumentException (nameof (objects) + " and " + nameof (keys) + " arrays have different sizes");
if (count < 1 || objects.Length < count || keys.Length < count)
throw new ArgumentException (nameof (count));

using (var no = NSArray.FromNSObjects (objects))
using (var nk = NSArray.FromNSObjects (keys))
if (!ValidateFromObjectsAndKeys (objects, keys, count))
return new NSMutableDictionary ();

using (var no = NSArray.FromNativeObjects (objects, count))
using (var nk = NSArray.FromNativeObjects (keys, count))
return FromObjectsAndKeysInternal (no, nk);
}

Expand All @@ -102,20 +84,14 @@ public static NSMutableDictionary FromObjectsAndKeys (NSObject [] objects, NSObj
/// <param name="count">The number of elements to copy from the arrays.</param>
/// <returns>A new mutable dictionary containing the specified objects and keys.</returns>
/// <exception cref="ArgumentNullException">Thrown when <paramref name="objects"/> or <paramref name="keys"/> is <see langword="null"/>.</exception>
/// <exception cref="ArgumentException">Thrown when the arrays have different sizes or <paramref name="count"/> is invalid.</exception>
/// <exception cref="ArgumentException">Thrown when <paramref name="count"/> is invalid.</exception>
public static NSMutableDictionary FromObjectsAndKeys (object [] objects, object [] keys, nint count)
{
if (objects is null)
throw new ArgumentNullException (nameof (objects));
if (keys is null)
throw new ArgumentNullException (nameof (keys));
if (objects.Length != keys.Length)
throw new ArgumentException (nameof (objects) + " and " + nameof (keys) + " arrays have different sizes");
if (count < 1 || objects.Length < count || keys.Length < count)
throw new ArgumentException (nameof (count));

using (var no = NSArray.FromObjects (objects))
using (var nk = NSArray.FromObjects (keys))
if (!ValidateFromObjectsAndKeys (objects, keys, count))
return new NSMutableDictionary ();

using (var no = NSArray.FromObjects (count, objects))
using (var nk = NSArray.FromObjects (count, keys))
return FromObjectsAndKeysInternal (no, nk);
}

Expand Down
Loading
Loading