SAFEARRAY
struct SAFEARRAY
Represents a safe array.
using System;
using System.CodeDom.Compiler;
using System.Runtime.CompilerServices;
using Windows.Win32.System.Variant;
namespace Windows.Win32.System.Com
{
[GeneratedCode("Microsoft.Windows.CsWin32", "0.3.106+a37a0b4b70")]
internal struct SAFEARRAY
{
internal ushort cDims;
internal ADVANCED_FEATURE_FLAGS fFeatures;
internal uint cbElements;
internal uint cLocks;
internal unsafe void* pvData;
internal VariableLengthInlineArray<SAFEARRAYBOUND> rgsabound;
public unsafe VARENUM VarType {
get {
ADVANCED_FEATURE_FLAGS aDVANCED_FEATURE_FLAGS = fFeatures & (ADVANCED_FEATURE_FLAGS.FADF_BSTR | ADVANCED_FEATURE_FLAGS.FADF_UNKNOWN | ADVANCED_FEATURE_FLAGS.FADF_DISPATCH | ADVANCED_FEATURE_FLAGS.FADF_VARIANT);
if (aDVANCED_FEATURE_FLAGS == ADVANCED_FEATURE_FLAGS.FADF_BSTR && cbElements == sizeof(char*))
return VARENUM.VT_BSTR;
if (aDVANCED_FEATURE_FLAGS == ADVANCED_FEATURE_FLAGS.FADF_UNKNOWN && cbElements == sizeof(IntPtr))
return VARENUM.VT_UNKNOWN;
if (aDVANCED_FEATURE_FLAGS == ADVANCED_FEATURE_FLAGS.FADF_DISPATCH && cbElements == sizeof(IntPtr))
return VARENUM.VT_DISPATCH;
if (aDVANCED_FEATURE_FLAGS != ADVANCED_FEATURE_FLAGS.FADF_VARIANT || cbElements != sizeof(VARIANT)) {
VARENUM result = VARENUM.VT_EMPTY;
fixed (SAFEARRAY* psa = &this) {
PInvokeCore.SafeArrayGetVartype(psa, &result).ThrowOnFailure((IntPtr)0);
return result;
}
}
return VARENUM.VT_VARIANT;
}
}
public unsafe SAFEARRAYBOUND GetBounds(int dimension = 0)
{
fixed (VariableLengthInlineArray<SAFEARRAYBOUND>* ptr = &rgsabound) {
void* pointer = ptr;
return new ReadOnlySpan<SAFEARRAYBOUND>(pointer, cDims)[dimension];
}
}
public unsafe static SAFEARRAY* CreateEmpty(VARENUM arrayType)
{
SAFEARRAYBOUND sAFEARRAYBOUND = default(SAFEARRAYBOUND);
sAFEARRAYBOUND.cElements = 0;
sAFEARRAYBOUND.lLbound = 0;
SAFEARRAYBOUND sAFEARRAYBOUND2 = sAFEARRAYBOUND;
return PInvokeCore.SafeArrayCreate(arrayType, 1, &sAFEARRAYBOUND2);
}
[return: Nullable(1)]
public unsafe T GetValue<[Nullable(2)] T>(Span<int> indices)
{
int num = 0;
int num3 = indices[num++];
uint num4 = 1;
fixed (VariableLengthInlineArray<SAFEARRAYBOUND>* ptr = &rgsabound) {
void* pointer = ptr;
ReadOnlySpan<SAFEARRAYBOUND> readOnlySpan = new ReadOnlySpan<SAFEARRAYBOUND>(pointer, (int)cDims);
int num5 = cDims - 1;
uint num6 = 0;
for (ushort num7 = 1; num7 < cDims; num7 = (ushort)(num7 + 1)) {
num4 *= readOnlySpan[num5--].cElements;
int num10 = indices[num++] - readOnlySpan[num5].lLbound;
num6 = (uint)((int)num6 + num10 * (int)num4);
}
num6 = (uint)((int)num6 + (num3 - readOnlySpan[cDims - 1].lLbound));
return Unsafe.AsRef<T>(Unsafe.Add<T>(pvData, (int)num6));
}
}
internal unsafe static int SizeOf(int count)
{
int num = sizeof(SAFEARRAY);
if (count > 1)
num += checked((count - 1) * sizeof(SAFEARRAYBOUND));
else if (count < 0) {
throw new ArgumentOutOfRangeException();
}
return num;
}
}
}