A game framework written with osu! in mind.
1// Copyright (c) ppy Pty Ltd <contact@ppy.sh>. Licensed under the MIT Licence.
2// See the LICENCE file in the repository root for full licence text.
3
4using System;
5
6namespace osu.Framework.Platform.MacOS.Native
7{
8 internal readonly struct NSArray
9 {
10 internal IntPtr Handle { get; }
11
12 private static readonly IntPtr class_pointer = Class.Get("NSArray");
13 private static readonly IntPtr mutable_class_pointer = Class.Get("NSMutableArray");
14 private static readonly IntPtr sel_array_with_object = Selector.Get("arrayWithObject:");
15 private static readonly IntPtr sel_array = Selector.Get("array");
16 private static readonly IntPtr sel_add_object = Selector.Get("addObject:");
17 private static readonly IntPtr sel_count = Selector.Get("count");
18 private static readonly IntPtr sel_object_at_index = Selector.Get("objectAtIndex:");
19
20 internal NSArray(IntPtr handle)
21 {
22 Handle = handle;
23 }
24
25 internal static NSArray ArrayWithObject(IntPtr obj) => new NSArray(Cocoa.SendIntPtr(class_pointer, sel_array_with_object, obj));
26
27 internal static NSArray ArrayWithObjects(IntPtr[] objs)
28 {
29 var mutableArray = Cocoa.SendIntPtr(mutable_class_pointer, sel_array);
30 foreach (IntPtr obj in objs)
31 Cocoa.SendVoid(mutableArray, sel_add_object, obj);
32 return new NSArray(mutableArray);
33 }
34
35 internal int Count() => Cocoa.SendInt(Handle, sel_count);
36
37 internal IntPtr ObjectAtIndex(int index) => Cocoa.SendIntPtr(Handle, sel_object_at_index, index);
38
39 internal IntPtr[] ToArray()
40 {
41 IntPtr[] result = new IntPtr[Count()];
42 for (int i = 0; i < result.Length; i++)
43 result[i] = ObjectAtIndex(i);
44 return result;
45 }
46 }
47}