You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
68 lines
1.8 KiB
68 lines
1.8 KiB
using System; |
|
using System.Runtime.CompilerServices; |
|
using System.Text; |
|
|
|
namespace ImGuiNET |
|
{ |
|
public unsafe struct RangeAccessor<T> where T : struct |
|
{ |
|
private static readonly int s_sizeOfT = Unsafe.SizeOf<T>(); |
|
|
|
public readonly void* Data; |
|
public readonly int Count; |
|
|
|
public RangeAccessor(IntPtr data, int count) : this(data.ToPointer(), count) { } |
|
public RangeAccessor(void* data, int count) |
|
{ |
|
Data = data; |
|
Count = count; |
|
} |
|
|
|
public ref T this[int index] |
|
{ |
|
get |
|
{ |
|
if (index < 0 || index >= Count) |
|
{ |
|
throw new IndexOutOfRangeException(); |
|
} |
|
|
|
return ref Unsafe.AsRef<T>((byte*)Data + s_sizeOfT * index); |
|
} |
|
} |
|
} |
|
|
|
public unsafe struct RangePtrAccessor<T> where T : struct |
|
{ |
|
public readonly void* Data; |
|
public readonly int Count; |
|
|
|
public RangePtrAccessor(IntPtr data, int count) : this(data.ToPointer(), count) { } |
|
public RangePtrAccessor(void* data, int count) |
|
{ |
|
Data = data; |
|
Count = count; |
|
} |
|
|
|
public T this[int index] |
|
{ |
|
get |
|
{ |
|
if (index < 0 || index >= Count) |
|
{ |
|
throw new IndexOutOfRangeException(); |
|
} |
|
|
|
return Unsafe.Read<T>((byte*)Data + sizeof(void*) * index); |
|
} |
|
} |
|
} |
|
|
|
public static class RangeAccessorExtensions |
|
{ |
|
public static unsafe string GetStringASCII(this RangeAccessor<byte> stringAccessor) |
|
{ |
|
return Encoding.ASCII.GetString((byte*)stringAccessor.Data, stringAccessor.Count); |
|
} |
|
} |
|
}
|
|
|