SharpGen.Runtime/MarshallingHelpers.ToPointerArray.cs (63 lines of code) (raw):

using System; namespace SharpGen.Runtime { public static partial class MarshallingHelpers { /// <summary> /// Converts an <see cref="ICallbackable"/> array to an array of native object pointers. /// </summary> public static void ConvertToPointerArray<TCallback>(Span<IntPtr> pointers, ReadOnlySpan<TCallback> interfaces) where TCallback : ICallbackable { var arrayLength = interfaces.Length; Guid? callbackTypeGuid = null; for (var i = 0; i < arrayLength; ++i) pointers[i] = interfaces[i] switch { null => IntPtr.Zero, CppObject cpp => cpp.NativePointer, { } item => item.Shadow.Find(callbackTypeGuid ??= GetCallbackTypeGuid()) }; static Guid GetCallbackTypeGuid() => ShadowContainer.GuidFromType(typeof(TCallback)); } /// <summary> /// Converts an <see cref="ICallbackable"/> array to an array of native object pointers. /// </summary> public static void ConvertToPointerArray<TCallback>(Span<IntPtr> pointers, Span<TCallback> interfaces) where TCallback : ICallbackable { var arrayLength = interfaces.Length; Guid? callbackTypeGuid = null; for (var i = 0; i < arrayLength; ++i) pointers[i] = interfaces[i] switch { null => IntPtr.Zero, CppObject cpp => cpp.NativePointer, { } item => item.Shadow.Find(callbackTypeGuid ??= GetCallbackTypeGuid()) }; static Guid GetCallbackTypeGuid() => ShadowContainer.GuidFromType(typeof(TCallback)); } /// <summary> /// Converts an <see cref="ICallbackable"/> array to an array of native object pointers. /// </summary> public static void ConvertToPointerArray<TCallback>(Span<IntPtr> pointers, TCallback[] interfaces) where TCallback : ICallbackable { var arrayLength = interfaces.Length; Guid? callbackTypeGuid = null; for (var i = 0; i < arrayLength; ++i) pointers[i] = interfaces[i] switch { null => IntPtr.Zero, CppObject cpp => cpp.NativePointer, { } item => item.Shadow.Find(callbackTypeGuid ??= GetCallbackTypeGuid()) }; static Guid GetCallbackTypeGuid() => ShadowContainer.GuidFromType(typeof(TCallback)); } /// <summary> /// Converts an <see cref="ICallbackable"/> array to an array of native object pointers. /// </summary> public static void ConvertToPointerArray<TCallback>(Span<IntPtr> pointers, ICallbackable[] interfaces) where TCallback : ICallbackable { var arrayLength = interfaces.Length; Guid? callbackTypeGuid = null; for (var i = 0; i < arrayLength; ++i) pointers[i] = interfaces[i] switch { null => IntPtr.Zero, CppObject cpp => cpp.NativePointer, { } item => item.Shadow.Find(callbackTypeGuid ??= GetCallbackTypeGuid()) }; static Guid GetCallbackTypeGuid() => ShadowContainer.GuidFromType(typeof(TCallback)); } } }