mirror of https://github.com/ppy/SDL3-CS.git
Add `SDLOpaquePointerArray` and use it for SDL_GetWindows()
`SDLPointerArray` is inadequate as it does `*(SDL_Window*)ptr` which doesn't make sense as SDL_Window* is an opaque pointer type
This commit is contained in:
parent
d5287637ef
commit
be946eb23c
|
|
@ -107,11 +107,11 @@ namespace SDL
|
|||
}
|
||||
|
||||
[MustDisposeResource]
|
||||
public static unsafe SDLPointerArray<SDL_Window>? SDL_GetWindows()
|
||||
public static unsafe SDLOpaquePointerArray<SDL_Window>? SDL_GetWindows()
|
||||
{
|
||||
int count;
|
||||
var array = SDL_GetWindows(&count);
|
||||
return SDLArray.Create(array, count);
|
||||
return SDLArray.CreateOpaque(array, count);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -63,5 +63,15 @@ namespace SDL
|
|||
|
||||
return new SDLPointerArray<T>(array, count);
|
||||
}
|
||||
|
||||
[MustDisposeResource]
|
||||
internal static SDLOpaquePointerArray<T>? CreateOpaque<T>(T** array, int count)
|
||||
where T : unmanaged
|
||||
{
|
||||
if (array == null)
|
||||
return null;
|
||||
|
||||
return new SDLOpaquePointerArray<T>(array, count);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -0,0 +1,46 @@
|
|||
// Copyright (c) ppy Pty Ltd <contact@ppy.sh>. Licensed under the MIT Licence.
|
||||
// See the LICENCE file in the repository root for full licence text.
|
||||
|
||||
using System;
|
||||
using System.Diagnostics;
|
||||
using JetBrains.Annotations;
|
||||
|
||||
namespace SDL
|
||||
{
|
||||
[MustDisposeResource]
|
||||
public sealed unsafe class SDLOpaquePointerArray<T> : IDisposable
|
||||
where T : unmanaged
|
||||
{
|
||||
private readonly T** array;
|
||||
public readonly int Count;
|
||||
private bool isDisposed;
|
||||
|
||||
internal SDLOpaquePointerArray(T** array, int count)
|
||||
{
|
||||
this.array = array;
|
||||
Count = count;
|
||||
}
|
||||
|
||||
public T* this[int index]
|
||||
{
|
||||
get
|
||||
{
|
||||
ObjectDisposedException.ThrowIf(isDisposed, this);
|
||||
ArgumentOutOfRangeException.ThrowIfNegative(index);
|
||||
ArgumentOutOfRangeException.ThrowIfGreaterThanOrEqual(index, Count);
|
||||
Debug.Assert(array[index] != null);
|
||||
return array[index];
|
||||
}
|
||||
}
|
||||
|
||||
public void Dispose()
|
||||
{
|
||||
if (isDisposed)
|
||||
return;
|
||||
|
||||
isDisposed = true;
|
||||
|
||||
SDL3.SDL_free(array);
|
||||
}
|
||||
}
|
||||
}
|
||||
Loading…
Reference in New Issue