mirror of
https://github.com/SabreTools/SabreTools.IO.git
synced 2026-07-10 02:39:06 +00:00
This change looks dramatic, but it's just separating out the already-split namespaces into separate top-level folders. In theory, every single one could be built into their own Nuget package. `SabreTools.IO.Meta` builds the normal Nuget package that is used by all other projects and includes all namespaces. `SabreTools.IO` builds to `SabreTools.IO.Common` to avoid overwriting issues on publish.
47 lines
1.3 KiB
C#
47 lines
1.3 KiB
C#
using System.Runtime.InteropServices;
|
|
|
|
namespace SabreTools.IO.Compression.zlib
|
|
{
|
|
#pragma warning disable IDE0044
|
|
public unsafe class UnsafeArray2D<T> where T : struct
|
|
{
|
|
private readonly UnsafeArray1D<T>[] _data;
|
|
private long[] _pinAddresses;
|
|
private readonly GCHandle _pinAddressesHandle;
|
|
|
|
public UnsafeArray1D<T> this[int index]
|
|
{
|
|
get => _data[index];
|
|
set
|
|
{
|
|
_data[index] = value;
|
|
}
|
|
}
|
|
|
|
public UnsafeArray2D(int size1, int size2)
|
|
{
|
|
_data = new UnsafeArray1D<T>[size1];
|
|
_pinAddresses = new long[size1];
|
|
for (var i = 0; i < size1; ++i)
|
|
{
|
|
_data[i] = new UnsafeArray1D<T>(size2);
|
|
_pinAddresses[i] = _data[i].PinHandle.AddrOfPinnedObject().ToInt64();
|
|
}
|
|
|
|
_pinAddressesHandle = GCHandle.Alloc(_pinAddresses, GCHandleType.Pinned);
|
|
}
|
|
|
|
~UnsafeArray2D()
|
|
{
|
|
_pinAddressesHandle.Free();
|
|
}
|
|
|
|
public void* ToPointer() => _pinAddressesHandle.AddrOfPinnedObject().ToPointer();
|
|
|
|
public static implicit operator void*(UnsafeArray2D<T> array)
|
|
{
|
|
return array.ToPointer();
|
|
}
|
|
}
|
|
}
|