solve 'edge' case and pass cancellation token
This commit is contained in:
parent
0472bfe58e
commit
d3dfdd6a74
15 changed files with 208 additions and 551 deletions
|
|
@ -6,7 +6,7 @@ namespace StitchATon2.Infra.Buffers;
|
|||
public static class MemoryAllocator
|
||||
{
|
||||
public static IBuffer<T> Allocate<T>(int count) where T : unmanaged
|
||||
=> new UnmanagedMemory<T>(count);
|
||||
=> new ImmovableMemory<T>(count);
|
||||
|
||||
public static IMemoryOwner<T> AllocateManaged<T>(int count)
|
||||
=> MemoryPool<T>.Shared.Rent(count);
|
||||
|
|
@ -14,31 +14,23 @@ public static class MemoryAllocator
|
|||
public static ArrayOwner<T> AllocateArray<T>(int count) where T : unmanaged
|
||||
=> new(ArrayPool<T>.Shared, count);
|
||||
|
||||
public static MemoryManager<T> AllocateImmovable<T>(int count) where T : unmanaged
|
||||
=> new ImmovableMemory<T>(count);
|
||||
|
||||
public static unsafe IBuffer<T> Clone<T>(this IBuffer<T> buffer) where T : unmanaged
|
||||
{
|
||||
if (buffer is UnmanagedMemory<T> unmanagedMemory)
|
||||
{
|
||||
var newBuffer = new UnmanagedMemory<T>(buffer.Length);
|
||||
var byteCount = (uint)(Unsafe.SizeOf<T>() * buffer.Length);
|
||||
Unsafe.CopyBlock(newBuffer.Pointer, unmanagedMemory.Pointer, byteCount);
|
||||
return newBuffer;
|
||||
}
|
||||
if (buffer is not ImmovableMemory<T> unmanagedMemory)
|
||||
throw new NotSupportedException();
|
||||
|
||||
throw new NotSupportedException();
|
||||
var newBuffer = new ImmovableMemory<T>(buffer.Length);
|
||||
var byteCount = (uint)(Unsafe.SizeOf<T>() * buffer.Length);
|
||||
Unsafe.CopyBlock(newBuffer.Pointer, unmanagedMemory.Pointer, byteCount);
|
||||
return newBuffer;
|
||||
}
|
||||
|
||||
public static unsafe void Copy<T>(this IBuffer<T> source, IBuffer<T> destination, int count) where T : unmanaged
|
||||
{
|
||||
if (source is UnmanagedMemory<T> sourceBuffer && destination is UnmanagedMemory<T> destinationBuffer)
|
||||
{
|
||||
var byteCount = (uint)(Unsafe.SizeOf<T>() * count);
|
||||
Unsafe.CopyBlock(destinationBuffer.Pointer, sourceBuffer.Pointer, byteCount);
|
||||
return;
|
||||
}
|
||||
if (source is not ImmovableMemory<T> sourceBuffer || destination is not ImmovableMemory<T> destinationBuffer)
|
||||
throw new NotSupportedException();
|
||||
|
||||
throw new NotSupportedException();
|
||||
var byteCount = (uint)(Unsafe.SizeOf<T>() * count);
|
||||
Unsafe.CopyBlock(destinationBuffer.Pointer, sourceBuffer.Pointer, byteCount);
|
||||
}
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue