CPF/CPF.Mac/Mac/Foundation/NSMutableDictionary.cs
2023-11-21 23:05:03 +08:00

689 lines
18 KiB
C#

using CPF.Mac.ObjCRuntime;
using System;
using System.Collections;
using System.Collections.Generic;
using System.ComponentModel;
namespace CPF.Mac.Foundation
{
[Register("NSMutableDictionary", true)]
public class NSMutableDictionary : NSDictionary, IDictionary, ICollection, IEnumerable, IDictionary<NSObject, NSObject>, ICollection<KeyValuePair<NSObject, NSObject>>, IEnumerable<KeyValuePair<NSObject, NSObject>>
{
private class ShimEnumerator : IDictionaryEnumerator, IEnumerator
{
private IEnumerator<KeyValuePair<NSObject, NSObject>> e;
public DictionaryEntry Entry
{
get
{
DictionaryEntry result = default(DictionaryEntry);
result.Key = e.Current.Key;
result.Value = e.Current.Value;
return result;
}
}
public object Key => e.Current.Key;
public object Value => e.Current.Value;
public object Current => Entry;
public ShimEnumerator(NSMutableDictionary host)
{
e = host.GetEnumerator();
}
public void Dispose()
{
e.Dispose();
}
public bool MoveNext()
{
return e.MoveNext();
}
public void Reset()
{
e.Reset();
}
}
private static readonly NSObject marker = new NSObject();
private static readonly IntPtr selDictionaryWithContentsOfFile_Handle = Selector.GetHandle("dictionaryWithContentsOfFile:");
private static readonly IntPtr selDictionaryWithContentsOfURL_Handle = Selector.GetHandle("dictionaryWithContentsOfURL:");
private static readonly IntPtr selDictionaryWithObjectForKey_Handle = Selector.GetHandle("dictionaryWithObject:forKey:");
private static readonly IntPtr selDictionaryWithDictionary_Handle = Selector.GetHandle("dictionaryWithDictionary:");
private static readonly IntPtr selDictionaryWithObjectsForKeysCount_Handle = Selector.GetHandle("dictionaryWithObjects:forKeys:count:");
private static readonly IntPtr selDictionaryWithObjectsForKeys_Handle = Selector.GetHandle("dictionaryWithObjects:forKeys:");
private static readonly IntPtr selInitWithDictionary_Handle = Selector.GetHandle("initWithDictionary:");
private static readonly IntPtr selInitWithContentsOfFile_Handle = Selector.GetHandle("initWithContentsOfFile:");
private static readonly IntPtr selInitWithContentsOfURL_Handle = Selector.GetHandle("initWithContentsOfURL:");
private static readonly IntPtr selRemoveAllObjectsHandle = Selector.GetHandle("removeAllObjects");
private static readonly IntPtr selRemoveObjectForKey_Handle = Selector.GetHandle("removeObjectForKey:");
private static readonly IntPtr selSetObjectForKey_Handle = Selector.GetHandle("setObject:forKey:");
private static readonly IntPtr selDictionaryWithSharedKeySet_Handle = Selector.GetHandle("dictionaryWithSharedKeySet:");
private static readonly IntPtr class_ptr = Class.GetHandle("NSMutableDictionary");
int ICollection<KeyValuePair<NSObject, NSObject>>.Count => (int)Count;
bool ICollection<KeyValuePair<NSObject, NSObject>>.IsReadOnly => false;
bool IDictionary.IsFixedSize => false;
bool IDictionary.IsReadOnly => false;
object IDictionary.this[object key]
{
get
{
NSObject nSObject = key as NSObject;
if (nSObject == null)
{
return null;
}
return ObjectForKey(nSObject);
}
set
{
NSObject nSObject = key as NSObject;
NSObject nSObject2 = value as NSObject;
if (nSObject == null || nSObject2 == null)
{
throw new ArgumentException("You can only use NSObjects for keys and values in an NSMutableDictionary");
}
SetObject(nSObject2, nSObject);
}
}
ICollection IDictionary.Keys => Keys;
ICollection IDictionary.Values => Values;
public override NSObject this[NSObject key]
{
get
{
if (key == null)
{
throw new ArgumentNullException("key");
}
return ObjectForKey(key);
}
set
{
if (key == null)
{
throw new ArgumentNullException("key");
}
if (value == null)
{
throw new ArgumentNullException("value");
}
if (IsDirectBinding)
{
Messaging.void_objc_msgSend_IntPtr_IntPtr(base.Handle, selSetObjectForKey_Handle, value.Handle, key.Handle);
}
else
{
Messaging.void_objc_msgSendSuper_IntPtr_IntPtr(base.SuperHandle, selSetObjectForKey_Handle, value.Handle, key.Handle);
}
}
}
public override NSObject this[NSString key]
{
get
{
if (key == null)
{
throw new ArgumentNullException("key");
}
return ObjectForKey(key);
}
set
{
if (key == null)
{
throw new ArgumentNullException("key");
}
if (value == null)
{
throw new ArgumentNullException("value");
}
if (IsDirectBinding)
{
Messaging.void_objc_msgSend_IntPtr_IntPtr(base.Handle, selSetObjectForKey_Handle, value.Handle, key.Handle);
}
else
{
Messaging.void_objc_msgSendSuper_IntPtr_IntPtr(base.SuperHandle, selSetObjectForKey_Handle, value.Handle, key.Handle);
}
}
}
public override NSObject this[string key]
{
get
{
if (key == null)
{
throw new ArgumentNullException("key");
}
using (NSString key2 = new NSString(key))
{
return ObjectForKey(key2);
}
}
set
{
if (key == null)
{
throw new ArgumentNullException("key");
}
if (value == null)
{
throw new ArgumentNullException("value");
}
using (NSString nSString = new NSString(key))
{
if (IsDirectBinding)
{
Messaging.void_objc_msgSend_IntPtr_IntPtr(base.Handle, selSetObjectForKey_Handle, value.Handle, nSString.Handle);
}
else
{
Messaging.void_objc_msgSendSuper_IntPtr_IntPtr(base.SuperHandle, selSetObjectForKey_Handle, value.Handle, nSString.Handle);
}
}
}
}
ICollection<NSObject> IDictionary<NSObject, NSObject>.Keys => Keys;
ICollection<NSObject> IDictionary<NSObject, NSObject>.Values => Values;
public override IntPtr ClassHandle => class_ptr;
internal NSMutableDictionary(IntPtr handle, bool owns)
: base(handle)
{
if (!owns)
{
Release();
}
}
public new static NSMutableDictionary FromObjectsAndKeys(NSObject[] objects, NSObject[] keys)
{
if (objects.Length != keys.Length)
{
throw new ArgumentException("objects and keys arrays have different sizes");
}
NSArray nSArray = NSArray.FromNSObjects(objects);
NSArray nSArray2 = NSArray.FromNSObjects(keys);
NSMutableDictionary result = FromObjectsAndKeysInternal(nSArray, nSArray2);
nSArray.Dispose();
nSArray2.Dispose();
return result;
}
public new static NSMutableDictionary FromObjectsAndKeys(object[] objects, object[] keys)
{
if (objects.Length != keys.Length)
{
throw new ArgumentException("objects and keys arrays have different sizes");
}
NSArray nSArray = NSArray.FromObjects(objects);
NSArray nSArray2 = NSArray.FromObjects(keys);
NSMutableDictionary result = FromObjectsAndKeysInternal(nSArray, nSArray2);
nSArray.Dispose();
nSArray2.Dispose();
return result;
}
public new static NSMutableDictionary FromObjectsAndKeys(NSObject[] objects, NSObject[] keys, int count)
{
if (objects.Length != keys.Length)
{
throw new ArgumentException("objects and keys arrays have different sizes");
}
if (count < 1 || objects.Length < count || keys.Length < count)
{
throw new ArgumentException("count");
}
NSArray nSArray = NSArray.FromNSObjects(objects);
NSArray nSArray2 = NSArray.FromNSObjects(keys);
NSMutableDictionary result = FromObjectsAndKeysInternal(nSArray, nSArray2);
nSArray.Dispose();
nSArray2.Dispose();
return result;
}
public new static NSMutableDictionary FromObjectsAndKeys(object[] objects, object[] keys, int count)
{
if (objects.Length != keys.Length)
{
throw new ArgumentException("objects and keys arrays have different sizes");
}
if (count < 1 || objects.Length < count || keys.Length < count)
{
throw new ArgumentException("count");
}
NSArray nSArray = NSArray.FromObjects(objects);
NSArray nSArray2 = NSArray.FromObjects(keys);
NSMutableDictionary result = FromObjectsAndKeysInternal(nSArray, nSArray2);
nSArray.Dispose();
nSArray2.Dispose();
return result;
}
void ICollection<KeyValuePair<NSObject, NSObject>>.Add(KeyValuePair<NSObject, NSObject> item)
{
SetObject(item.Value, item.Key);
}
public void Clear()
{
RemoveAllObjects();
}
bool ICollection<KeyValuePair<NSObject, NSObject>>.Contains(KeyValuePair<NSObject, NSObject> keyValuePair)
{
return ContainsKeyValuePair(keyValuePair);
}
void ICollection<KeyValuePair<NSObject, NSObject>>.CopyTo(KeyValuePair<NSObject, NSObject>[] array, int index)
{
if (array == null)
{
throw new ArgumentNullException("array");
}
if (index < 0)
{
throw new ArgumentOutOfRangeException("index");
}
if (index > array.Length)
{
throw new ArgumentException("index larger than largest valid index of array");
}
if (array.Length - index < (int)Count)
{
throw new ArgumentException("Destination array cannot hold the requested elements!");
}
IEnumerator<KeyValuePair<NSObject, NSObject>> enumerator = GetEnumerator();
while (enumerator.MoveNext())
{
array[index++] = enumerator.Current;
}
}
bool ICollection<KeyValuePair<NSObject, NSObject>>.Remove(KeyValuePair<NSObject, NSObject> keyValuePair)
{
ulong count = Count;
RemoveObjectForKey(keyValuePair.Key);
return count != Count;
}
void IDictionary.Add(object key, object value)
{
NSObject nSObject = key as NSObject;
NSObject nSObject2 = value as NSObject;
if (nSObject == null || nSObject2 == null)
{
throw new ArgumentException("You can only use NSObjects for keys and values in an NSMutableDictionary");
}
SetObject(nSObject2, nSObject);
}
bool IDictionary.Contains(object key)
{
if (key == null)
{
throw new ArgumentNullException("key");
}
NSObject nSObject = key as NSObject;
if (nSObject == null)
{
return false;
}
return ContainsKey(nSObject);
}
IDictionaryEnumerator IDictionary.GetEnumerator()
{
return new ShimEnumerator(this);
}
void IDictionary.Remove(object key)
{
if (key == null)
{
throw new ArgumentNullException("key");
}
NSObject nSObject = key as NSObject;
if (nSObject == null)
{
throw new ArgumentException("The key must be an NSObject");
}
RemoveObjectForKey(nSObject);
}
public void Add(NSObject key, NSObject value)
{
SetObject(value, key);
}
public bool Remove(NSObject key)
{
if (key == null)
{
throw new ArgumentNullException("key");
}
ulong count = Count;
RemoveObjectForKey(key);
return count != Count;
}
public new bool TryGetValue(NSObject key, out NSObject value)
{
if (key == null)
{
throw new ArgumentNullException("key");
}
NSArray keys = NSArray.FromNSObjects(key);
NSObject[] array = ObjectsForKeys(keys, marker);
if (marker == array[0])
{
value = null;
return false;
}
value = array[0];
return true;
}
IEnumerator IEnumerable.GetEnumerator()
{
return GetEnumerator();
}
public new IEnumerator<KeyValuePair<NSObject, NSObject>> GetEnumerator()
{
NSObject[] keys = Keys;
foreach (NSObject key in keys)
{
yield return new KeyValuePair<NSObject, NSObject>(key, ObjectForKey(key));
}
}
public static NSMutableDictionary LowlevelFromObjectAndKey(IntPtr obj, IntPtr key)
{
return (NSMutableDictionary)Runtime.GetNSObject(Messaging.IntPtr_objc_msgSend_IntPtr_IntPtr(class_ptr, selDictionaryWithObjectForKey_Handle, obj, key));
}
public void LowlevelSetObject(IntPtr obj, IntPtr key)
{
Messaging.void_objc_msgSend_IntPtr_IntPtr(base.Handle, selSetObjectForKey_Handle, obj, key);
}
public void LowlevelSetObject(NSObject obj, IntPtr key)
{
if (obj == null)
{
throw new ArgumentNullException("obj");
}
Messaging.void_objc_msgSend_IntPtr_IntPtr(base.Handle, selSetObjectForKey_Handle, obj.Handle, key);
}
[EditorBrowsable(EditorBrowsableState.Advanced)]
[Export("init")]
public NSMutableDictionary()
: base(NSObjectFlag.Empty)
{
if (IsDirectBinding)
{
base.Handle = Messaging.IntPtr_objc_msgSend(base.Handle, Selector.Init);
}
else
{
base.Handle = Messaging.IntPtr_objc_msgSendSuper(base.SuperHandle, Selector.Init);
}
}
[EditorBrowsable(EditorBrowsableState.Advanced)]
[Export("initWithCoder:")]
public NSMutableDictionary(NSCoder coder)
: base(NSObjectFlag.Empty)
{
if (IsDirectBinding)
{
base.Handle = Messaging.IntPtr_objc_msgSend_IntPtr(base.Handle, Selector.InitWithCoder, coder.Handle);
}
else
{
base.Handle = Messaging.IntPtr_objc_msgSendSuper_IntPtr(base.SuperHandle, Selector.InitWithCoder, coder.Handle);
}
}
[EditorBrowsable(EditorBrowsableState.Advanced)]
public NSMutableDictionary(NSObjectFlag t)
: base(t)
{
}
[EditorBrowsable(EditorBrowsableState.Advanced)]
public NSMutableDictionary(IntPtr handle)
: base(handle)
{
}
[Export("dictionaryWithContentsOfFile:")]
public new static NSMutableDictionary FromFile(string path)
{
if (path == null)
{
throw new ArgumentNullException("path");
}
IntPtr intPtr = NSString.CreateNative(path);
NSMutableDictionary result = (NSMutableDictionary)Runtime.GetNSObject(Messaging.IntPtr_objc_msgSend_IntPtr(class_ptr, selDictionaryWithContentsOfFile_Handle, intPtr));
NSString.ReleaseNative(intPtr);
return result;
}
[Export("dictionaryWithContentsOfURL:")]
public new static NSMutableDictionary FromUrl(NSUrl url)
{
if (url == null)
{
throw new ArgumentNullException("url");
}
return (NSMutableDictionary)Runtime.GetNSObject(Messaging.IntPtr_objc_msgSend_IntPtr(class_ptr, selDictionaryWithContentsOfURL_Handle, url.Handle));
}
[Export("dictionaryWithObject:forKey:")]
public new static NSMutableDictionary FromObjectAndKey(NSObject obj, NSObject key)
{
if (obj == null)
{
throw new ArgumentNullException("obj");
}
if (key == null)
{
throw new ArgumentNullException("key");
}
return (NSMutableDictionary)Runtime.GetNSObject(Messaging.IntPtr_objc_msgSend_IntPtr_IntPtr(class_ptr, selDictionaryWithObjectForKey_Handle, obj.Handle, key.Handle));
}
[Export("dictionaryWithDictionary:")]
public new static NSMutableDictionary FromDictionary(NSDictionary source)
{
if (source == null)
{
throw new ArgumentNullException("source");
}
return (NSMutableDictionary)Runtime.GetNSObject(Messaging.IntPtr_objc_msgSend_IntPtr(class_ptr, selDictionaryWithDictionary_Handle, source.Handle));
}
[Export("dictionaryWithObjects:forKeys:count:")]
internal static NSMutableDictionary FromObjectsAndKeysInternalCount(NSArray objects, NSArray keys, ulong count)
{
if (objects == null)
{
throw new ArgumentNullException("objects");
}
if (keys == null)
{
throw new ArgumentNullException("keys");
}
return (NSMutableDictionary)Runtime.GetNSObject(Messaging.IntPtr_objc_msgSend_IntPtr_IntPtr_UInt64(class_ptr, selDictionaryWithObjectsForKeysCount_Handle, objects.Handle, keys.Handle, count));
}
[Export("dictionaryWithObjects:forKeys:")]
internal new static NSMutableDictionary FromObjectsAndKeysInternal(NSArray objects, NSArray Keys)
{
if (objects == null)
{
throw new ArgumentNullException("objects");
}
if (Keys == null)
{
throw new ArgumentNullException("Keys");
}
return (NSMutableDictionary)Runtime.GetNSObject(Messaging.IntPtr_objc_msgSend_IntPtr_IntPtr(class_ptr, selDictionaryWithObjectsForKeys_Handle, objects.Handle, Keys.Handle));
}
[Export("initWithDictionary:")]
public NSMutableDictionary(NSDictionary other)
: base(NSObjectFlag.Empty)
{
if (other == null)
{
throw new ArgumentNullException("other");
}
if (IsDirectBinding)
{
base.Handle = Messaging.IntPtr_objc_msgSend_IntPtr(base.Handle, selInitWithDictionary_Handle, other.Handle);
}
else
{
base.Handle = Messaging.IntPtr_objc_msgSendSuper_IntPtr(base.SuperHandle, selInitWithDictionary_Handle, other.Handle);
}
}
[Export("initWithContentsOfFile:")]
public NSMutableDictionary(string fileName)
: base(NSObjectFlag.Empty)
{
if (fileName == null)
{
throw new ArgumentNullException("fileName");
}
IntPtr intPtr = NSString.CreateNative(fileName);
if (IsDirectBinding)
{
base.Handle = Messaging.IntPtr_objc_msgSend_IntPtr(base.Handle, selInitWithContentsOfFile_Handle, intPtr);
}
else
{
base.Handle = Messaging.IntPtr_objc_msgSendSuper_IntPtr(base.SuperHandle, selInitWithContentsOfFile_Handle, intPtr);
}
NSString.ReleaseNative(intPtr);
}
[Export("initWithContentsOfURL:")]
public NSMutableDictionary(NSUrl url)
: base(NSObjectFlag.Empty)
{
if (url == null)
{
throw new ArgumentNullException("url");
}
if (IsDirectBinding)
{
base.Handle = Messaging.IntPtr_objc_msgSend_IntPtr(base.Handle, selInitWithContentsOfURL_Handle, url.Handle);
}
else
{
base.Handle = Messaging.IntPtr_objc_msgSendSuper_IntPtr(base.SuperHandle, selInitWithContentsOfURL_Handle, url.Handle);
}
}
[Export("removeAllObjects")]
internal virtual void RemoveAllObjects()
{
if (IsDirectBinding)
{
Messaging.void_objc_msgSend(base.Handle, selRemoveAllObjectsHandle);
}
else
{
Messaging.void_objc_msgSendSuper(base.SuperHandle, selRemoveAllObjectsHandle);
}
}
[Export("removeObjectForKey:")]
internal virtual void RemoveObjectForKey(NSObject key)
{
if (key == null)
{
throw new ArgumentNullException("key");
}
if (IsDirectBinding)
{
Messaging.void_objc_msgSend_IntPtr(base.Handle, selRemoveObjectForKey_Handle, key.Handle);
}
else
{
Messaging.void_objc_msgSendSuper_IntPtr(base.SuperHandle, selRemoveObjectForKey_Handle, key.Handle);
}
}
[Export("setObject:forKey:")]
internal virtual void SetObject(NSObject obj, NSObject key)
{
if (obj == null)
{
throw new ArgumentNullException("obj");
}
if (key == null)
{
throw new ArgumentNullException("key");
}
if (IsDirectBinding)
{
Messaging.void_objc_msgSend_IntPtr_IntPtr(base.Handle, selSetObjectForKey_Handle, obj.Handle, key.Handle);
}
else
{
Messaging.void_objc_msgSendSuper_IntPtr_IntPtr(base.SuperHandle, selSetObjectForKey_Handle, obj.Handle, key.Handle);
}
}
[Export("dictionaryWithSharedKeySet:")]
public static NSDictionary FromSharedKeySet(NSObject sharedKeyToken)
{
if (sharedKeyToken == null)
{
throw new ArgumentNullException("sharedKeyToken");
}
return (NSDictionary)Runtime.GetNSObject(Messaging.IntPtr_objc_msgSend_IntPtr(class_ptr, selDictionaryWithSharedKeySet_Handle, sharedKeyToken.Handle));
}
}
}