Apollo3zehn / PureHDF

A pure .NET library that makes reading and writing of HDF5 files (groups, datasets, attributes, ...) very easy.
MIT License
50 stars 18 forks source link

Replace SpanExtensions with this approach? #7

Closed Apollo3zehn closed 3 months ago

Apollo3zehn commented 1 year ago
// https://docs.microsoft.com/en-us/dotnet/api/system.array?view=netcore-3.1
// max array length is 0X7FEFFFFF = int.MaxValue - 1024^2 bytes
// max multi dim array length seems to be 0X7FEFFFFF x 2, but no confirmation found
private unsafe T ReadCompactMultiDim<T>()
{
    // vllt. einfach eine weitere Read<T> Methode (z.B. ReadMultiDim), 
    // die keine generic constraint hat (leider), aber T zuerst auf IsArray
    // geprüft wird
    // beide Methoden definieren dann ein Lambda, um den Buffer entsprechender
    // Größe zu erzeugen. Dieser Buffer wird dann gefüllt und kann von der 
    // jeweiligen Methode mit dem korrekten Typ zurückgegeben werden
    //
    // oder `T[,] = Read2D<T>()`, `T[,,] = Read3D<T>()`, etc ..., dann wäre generic constraint wieder möglich
    // oder: use implicit cast operator for multi dim arrays? http://dontcodetired.com/blog/post/Writing-Implicit-and-Explicit-C-Conversion-Operators

    //var a = ReadCompactMultiDim<T[,,]>();
    var type = typeof(T);

    var lengths = new int[] { 100, 200, 10 };
    var size = lengths.Aggregate(1L, (x, y) => x * y);
    object[] args = lengths.Cast<object>().ToArray();

    var buffer = (T)Activator.CreateInstance(type, args);

    var handle = GCHandle.Alloc(buffer, GCHandleType.Pinned);
    try
    {
        var span = new Span<byte>(handle.AddrOfPinnedObject().ToPointer(), (int)size);
        span.Fill(0x25);
        return buffer;
    }
    finally
    {
        handle.Free();
    }
}