ComInterfaceTable
struct ComInterfaceTable
using System;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
using Windows.Win32.Foundation;
namespace Windows.Win32.System.Com
{
[NullableContext(1)]
[Nullable(0)]
internal readonly struct ComInterfaceTable
{
[Nullable(0)]
[field: Nullable(0)]
public unsafe ComWrappers.ComInterfaceEntry* Entries {
[NullableContext(0)]
get;
[NullableContext(0)]
set;
}
public int Count { get; set; }
public unsafe static ComInterfaceTable Create<[IsUnmanaged] [Nullable(0)] TComInterface>() where TComInterface : struct, IComIID, IVTable
{
Span<ComWrappers.ComInterfaceEntry> span = AllocateEntries<TComInterface>(1);
span[0] = GetEntry<TComInterface>();
ComInterfaceTable result = default(ComInterfaceTable);
result.Entries = (ComWrappers.ComInterfaceEntry*)Unsafe.AsPointer(ref span[0]);
result.Count = span.Length;
return result;
}
public unsafe static ComInterfaceTable Create<[IsUnmanaged] [Nullable(0)] TComInterface1, [IsUnmanaged] [Nullable(0)] TComInterface2>() where TComInterface1 : struct, IComIID, IVTable where TComInterface2 : struct, IComIID, IVTable
{
Span<ComWrappers.ComInterfaceEntry> span = AllocateEntries<TComInterface1>(2);
span[0] = GetEntry<TComInterface1>();
span[1] = GetEntry<TComInterface2>();
ComInterfaceTable result = default(ComInterfaceTable);
result.Entries = (ComWrappers.ComInterfaceEntry*)Unsafe.AsPointer(ref span[0]);
result.Count = span.Length;
return result;
}
public unsafe static ComInterfaceTable Create<[IsUnmanaged] [Nullable(0)] TComInterface1, [IsUnmanaged] [Nullable(0)] TComInterface2, [IsUnmanaged] [Nullable(0)] TComInterface3>() where TComInterface1 : struct, IComIID, IVTable where TComInterface2 : struct, IComIID, IVTable where TComInterface3 : struct, IComIID, IVTable
{
Span<ComWrappers.ComInterfaceEntry> span = AllocateEntries<TComInterface1>(3);
span[0] = GetEntry<TComInterface1>();
span[1] = GetEntry<TComInterface2>();
span[2] = GetEntry<TComInterface3>();
ComInterfaceTable result = default(ComInterfaceTable);
result.Entries = (ComWrappers.ComInterfaceEntry*)Unsafe.AsPointer(ref span[0]);
result.Count = span.Length;
return result;
}
public unsafe static ComInterfaceTable Create<[IsUnmanaged] [Nullable(0)] TComInterface1, [IsUnmanaged] [Nullable(0)] TComInterface2, [IsUnmanaged] [Nullable(0)] TComInterface3, [IsUnmanaged] [Nullable(0)] TComInterface4>() where TComInterface1 : struct, IComIID, IVTable where TComInterface2 : struct, IComIID, IVTable where TComInterface3 : struct, IComIID, IVTable where TComInterface4 : struct, IComIID, IVTable
{
Span<ComWrappers.ComInterfaceEntry> span = AllocateEntries<TComInterface1>(4);
span[0] = GetEntry<TComInterface1>();
span[1] = GetEntry<TComInterface2>();
span[2] = GetEntry<TComInterface3>();
span[3] = GetEntry<TComInterface4>();
ComInterfaceTable result = default(ComInterfaceTable);
result.Entries = (ComWrappers.ComInterfaceEntry*)Unsafe.AsPointer(ref span[0]);
result.Count = span.Length;
return result;
}
public unsafe static ComInterfaceTable Create<[IsUnmanaged] [Nullable(0)] TComInterface1, [IsUnmanaged] [Nullable(0)] TComInterface2, [IsUnmanaged] [Nullable(0)] TComInterface3, [IsUnmanaged] [Nullable(0)] TComInterface4, [IsUnmanaged] [Nullable(0)] TComInterface5>() where TComInterface1 : struct, IComIID, IVTable where TComInterface2 : struct, IComIID, IVTable where TComInterface3 : struct, IComIID, IVTable where TComInterface4 : struct, IComIID, IVTable where TComInterface5 : struct, IComIID, IVTable
{
Span<ComWrappers.ComInterfaceEntry> span = AllocateEntries<TComInterface1>(5);
span[0] = GetEntry<TComInterface1>();
span[1] = GetEntry<TComInterface2>();
span[2] = GetEntry<TComInterface3>();
span[3] = GetEntry<TComInterface4>();
span[4] = GetEntry<TComInterface5>();
ComInterfaceTable result = default(ComInterfaceTable);
result.Entries = (ComWrappers.ComInterfaceEntry*)Unsafe.AsPointer(ref span[0]);
result.Count = span.Length;
return result;
}
public unsafe static ComInterfaceTable Create<[IsUnmanaged] [Nullable(0)] TComInterface1, [IsUnmanaged] [Nullable(0)] TComInterface2, [IsUnmanaged] [Nullable(0)] TComInterface3, [IsUnmanaged] [Nullable(0)] TComInterface4, [IsUnmanaged] [Nullable(0)] TComInterface5, [IsUnmanaged] [Nullable(0)] TComInterface6>() where TComInterface1 : struct, IComIID, IVTable where TComInterface2 : struct, IComIID, IVTable where TComInterface3 : struct, IComIID, IVTable where TComInterface4 : struct, IComIID, IVTable where TComInterface5 : struct, IComIID, IVTable where TComInterface6 : struct, IComIID, IVTable
{
Span<ComWrappers.ComInterfaceEntry> span = AllocateEntries<TComInterface1>(6);
span[0] = GetEntry<TComInterface1>();
span[1] = GetEntry<TComInterface2>();
span[2] = GetEntry<TComInterface3>();
span[3] = GetEntry<TComInterface4>();
span[4] = GetEntry<TComInterface5>();
span[5] = GetEntry<TComInterface6>();
ComInterfaceTable result = default(ComInterfaceTable);
result.Entries = (ComWrappers.ComInterfaceEntry*)Unsafe.AsPointer(ref span[0]);
result.Count = span.Length;
return result;
}
public unsafe static ComInterfaceTable Create<[IsUnmanaged] [Nullable(0)] TComInterface1, [IsUnmanaged] [Nullable(0)] TComInterface2, [IsUnmanaged] [Nullable(0)] TComInterface3, [IsUnmanaged] [Nullable(0)] TComInterface4, [IsUnmanaged] [Nullable(0)] TComInterface5, [IsUnmanaged] [Nullable(0)] TComInterface6, [IsUnmanaged] [Nullable(0)] TComInterface7, [IsUnmanaged] [Nullable(0)] TComInterface8, [IsUnmanaged] [Nullable(0)] TComInterface9, [IsUnmanaged] [Nullable(0)] TComInterface10>() where TComInterface1 : struct, IComIID, IVTable where TComInterface2 : struct, IComIID, IVTable where TComInterface3 : struct, IComIID, IVTable where TComInterface4 : struct, IComIID, IVTable where TComInterface5 : struct, IComIID, IVTable where TComInterface6 : struct, IComIID, IVTable where TComInterface7 : struct, IComIID, IVTable where TComInterface8 : struct, IComIID, IVTable where TComInterface9 : struct, IComIID, IVTable where TComInterface10 : struct, IComIID, IVTable
{
Span<ComWrappers.ComInterfaceEntry> span = AllocateEntries<TComInterface1>(10);
span[0] = GetEntry<TComInterface1>();
span[1] = GetEntry<TComInterface2>();
span[2] = GetEntry<TComInterface3>();
span[3] = GetEntry<TComInterface4>();
span[4] = GetEntry<TComInterface5>();
span[5] = GetEntry<TComInterface6>();
span[6] = GetEntry<TComInterface7>();
span[7] = GetEntry<TComInterface8>();
span[8] = GetEntry<TComInterface9>();
span[9] = GetEntry<TComInterface10>();
ComInterfaceTable result = default(ComInterfaceTable);
result.Entries = (ComWrappers.ComInterfaceEntry*)Unsafe.AsPointer(ref span[0]);
result.Count = span.Length;
return result;
}
public unsafe static ComInterfaceTable Create<[IsUnmanaged] [Nullable(0)] TComInterface1, [IsUnmanaged] [Nullable(0)] TComInterface2, [IsUnmanaged] [Nullable(0)] TComInterface3, [IsUnmanaged] [Nullable(0)] TComInterface4, [IsUnmanaged] [Nullable(0)] TComInterface5, [IsUnmanaged] [Nullable(0)] TComInterface6, [IsUnmanaged] [Nullable(0)] TComInterface7, [IsUnmanaged] [Nullable(0)] TComInterface8, [IsUnmanaged] [Nullable(0)] TComInterface9, [IsUnmanaged] [Nullable(0)] TComInterface10, [IsUnmanaged] [Nullable(0)] TComInterface11, [IsUnmanaged] [Nullable(0)] TComInterface12, [IsUnmanaged] [Nullable(0)] TComInterface13, [IsUnmanaged] [Nullable(0)] TComInterface14, [IsUnmanaged] [Nullable(0)] TComInterface15, [IsUnmanaged] [Nullable(0)] TComInterface16, [IsUnmanaged] [Nullable(0)] TComInterface17, [IsUnmanaged] [Nullable(0)] TComInterface18, [IsUnmanaged] [Nullable(0)] TComInterface19, [IsUnmanaged] [Nullable(0)] TComInterface20, [IsUnmanaged] [Nullable(0)] TComInterface21, [IsUnmanaged] [Nullable(0)] TComInterface22, [IsUnmanaged] [Nullable(0)] TComInterface23, [IsUnmanaged] [Nullable(0)] TComInterface24, [IsUnmanaged] [Nullable(0)] TComInterface25, [IsUnmanaged] [Nullable(0)] TComInterface26, [IsUnmanaged] [Nullable(0)] TComInterface27>() where TComInterface1 : struct, IComIID, IVTable where TComInterface2 : struct, IComIID, IVTable where TComInterface3 : struct, IComIID, IVTable where TComInterface4 : struct, IComIID, IVTable where TComInterface5 : struct, IComIID, IVTable where TComInterface6 : struct, IComIID, IVTable where TComInterface7 : struct, IComIID, IVTable where TComInterface8 : struct, IComIID, IVTable where TComInterface9 : struct, IComIID, IVTable where TComInterface10 : struct, IComIID, IVTable where TComInterface11 : struct, IComIID, IVTable where TComInterface12 : struct, IComIID, IVTable where TComInterface13 : struct, IComIID, IVTable where TComInterface14 : struct, IComIID, IVTable where TComInterface15 : struct, IComIID, IVTable where TComInterface16 : struct, IComIID, IVTable where TComInterface17 : struct, IComIID, IVTable where TComInterface18 : struct, IComIID, IVTable where TComInterface19 : struct, IComIID, IVTable where TComInterface20 : struct, IComIID, IVTable where TComInterface21 : struct, IComIID, IVTable where TComInterface22 : struct, IComIID, IVTable where TComInterface23 : struct, IComIID, IVTable where TComInterface24 : struct, IComIID, IVTable where TComInterface25 : struct, IComIID, IVTable where TComInterface26 : struct, IComIID, IVTable where TComInterface27 : struct, IComIID, IVTable
{
Span<ComWrappers.ComInterfaceEntry> span = AllocateEntries<TComInterface1>(27);
span[0] = GetEntry<TComInterface1>();
span[1] = GetEntry<TComInterface2>();
span[2] = GetEntry<TComInterface3>();
span[3] = GetEntry<TComInterface4>();
span[4] = GetEntry<TComInterface5>();
span[5] = GetEntry<TComInterface6>();
span[6] = GetEntry<TComInterface7>();
span[7] = GetEntry<TComInterface8>();
span[8] = GetEntry<TComInterface9>();
span[9] = GetEntry<TComInterface10>();
span[10] = GetEntry<TComInterface11>();
span[11] = GetEntry<TComInterface12>();
span[12] = GetEntry<TComInterface13>();
span[13] = GetEntry<TComInterface14>();
span[14] = GetEntry<TComInterface15>();
span[15] = GetEntry<TComInterface16>();
span[16] = GetEntry<TComInterface17>();
span[17] = GetEntry<TComInterface18>();
span[18] = GetEntry<TComInterface19>();
span[19] = GetEntry<TComInterface20>();
span[20] = GetEntry<TComInterface21>();
span[21] = GetEntry<TComInterface22>();
span[22] = GetEntry<TComInterface23>();
span[23] = GetEntry<TComInterface24>();
span[24] = GetEntry<TComInterface25>();
span[25] = GetEntry<TComInterface26>();
span[26] = GetEntry<TComInterface27>();
ComInterfaceTable result = default(ComInterfaceTable);
result.Entries = (ComWrappers.ComInterfaceEntry*)Unsafe.AsPointer(ref span[0]);
result.Count = span.Length;
return result;
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
[NullableContext(0)]
private unsafe static Span<ComWrappers.ComInterfaceEntry> AllocateEntries<[Nullable(2)] T>(int count)
{
Span<ComWrappers.ComInterfaceEntry> result = new Span<ComWrappers.ComInterfaceEntry>((void*)(long)RuntimeHelpers.AllocateTypeAssociatedMemory(typeof(T), sizeof(ComWrappers.ComInterfaceEntry) * (count + 1)), count + 1);
result[result.Length - 1] = GetEntry<IComCallableWrapper>();
return result;
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
private unsafe static ComWrappers.ComInterfaceEntry GetEntry<[IsUnmanaged] [Nullable(0)] TComInterface>() where TComInterface : struct, IComIID, IVTable
{
ComWrappers.ComInterfaceEntry result = default(ComWrappers.ComInterfaceEntry);
IUnknown.Vtbl* vTable = ((IVTable)result).VTable;
((ComWrappers.ComInterfaceEntry*)(long)(IntPtr)(void*))->Vtable = (IntPtr)vTable;
result.IID = *IID.Get<TComInterface>();
return result;
}
}
}