Skip to content

Commit

Permalink
Added: FromArray Span Methods & Backcompat Overloads
Browse files Browse the repository at this point in the history
  • Loading branch information
Sewer56 committed Jul 6, 2022
1 parent a76e78b commit 8b08b82
Show file tree
Hide file tree
Showing 9 changed files with 117 additions and 14 deletions.
10 changes: 7 additions & 3 deletions Source/Reloaded.Memory/PublicAPI/net5.0/PublicAPI.Shipped.txt
Expand Up @@ -584,8 +584,6 @@ static Reloaded.Memory.Streams.StreamExtensions.WriteBigEndianPrimitive<T>(this
static Reloaded.Memory.Streams.StreamExtensions.WriteBigEndianPrimitive<T>(this System.IO.Stream stream, T[] structures) -> void
static Reloaded.Memory.Streams.StreamExtensions.WriteBigEndianStruct<T>(this System.IO.Stream stream, T structure) -> void
static Reloaded.Memory.Streams.StreamExtensions.WriteBigEndianStruct<T>(this System.IO.Stream stream, T[] structures) -> void
static Reloaded.Memory.Struct.FromArray<T>(byte[] data, out T value, bool marshalElement = true, int startIndex = 0) -> void
static Reloaded.Memory.Struct.FromArray<T>(byte[] data, out T value, int startIndex = 0) -> void
static Reloaded.Memory.Struct.FromArray<T>(System.Span<byte> data, out T value) -> void
static Reloaded.Memory.Struct.FromPtr<T>(nuint pointer, out T value, bool marshalElement = false) -> void
static Reloaded.Memory.Struct.FromPtr<T>(nuint pointer, out T value, Reloaded.Memory.Sources.MemoryExtensions.ReadFunction<T> readFunction, bool marshalElement = false) -> void
Expand Down Expand Up @@ -620,4 +618,10 @@ static Reloaded.Memory.StructArray.GetSize<T>(int elementCount) -> int
static Reloaded.Memory.StructArray.GetSize<T>(int elementCount, bool marshalElement) -> int
static Reloaded.Memory.StructArray.ToPtr<T>(nuint memoryAddress, T[] item, bool marshal = false) -> void
static Reloaded.Memory.Utilities.Blittable.IsBlittable(System.Type type) -> bool
static Reloaded.Memory.Utilities.Blittable.IsBlittable<T>() -> bool
static Reloaded.Memory.Utilities.Blittable.IsBlittable<T>() -> bool
static Reloaded.Memory.Struct.FromArray<T>(byte[] data, out T value) -> void
static Reloaded.Memory.Struct.FromArray<T>(byte[] data, out T value, bool marshalElement) -> void
static Reloaded.Memory.Struct.FromArray<T>(byte[] data, out T value, bool marshalElement, int startIndex) -> void
static Reloaded.Memory.Struct.FromArray<T>(byte[] data, out T value, int startIndex) -> void
static Reloaded.Memory.Struct.FromArray<T>(System.Span<byte> data, out T value, bool marshalElement) -> void
static Reloaded.Memory.Struct.FromArray<T>(System.Span<byte> data, out T value, bool marshalElement, int startIndex) -> void
@@ -0,0 +1,6 @@
static Reloaded.Memory.Struct.FromArray<T>(byte[] data, out T value) -> void
static Reloaded.Memory.Struct.FromArray<T>(byte[] data, out T value, bool marshalElement) -> void
static Reloaded.Memory.Struct.FromArray<T>(byte[] data, out T value, bool marshalElement, int startIndex) -> void
static Reloaded.Memory.Struct.FromArray<T>(byte[] data, out T value, int startIndex) -> void
static Reloaded.Memory.Struct.FromArray<T>(System.Span<byte> data, out T value, bool marshalElement) -> void
static Reloaded.Memory.Struct.FromArray<T>(System.Span<byte> data, out T value, bool marshalElement, int startIndex) -> void
10 changes: 7 additions & 3 deletions Source/Reloaded.Memory/PublicAPI/net6.0/PublicAPI.Shipped.txt
Expand Up @@ -584,8 +584,6 @@ static Reloaded.Memory.Streams.StreamExtensions.WriteBigEndianPrimitive<T>(this
static Reloaded.Memory.Streams.StreamExtensions.WriteBigEndianPrimitive<T>(this System.IO.Stream stream, T[] structures) -> void
static Reloaded.Memory.Streams.StreamExtensions.WriteBigEndianStruct<T>(this System.IO.Stream stream, T structure) -> void
static Reloaded.Memory.Streams.StreamExtensions.WriteBigEndianStruct<T>(this System.IO.Stream stream, T[] structures) -> void
static Reloaded.Memory.Struct.FromArray<T>(byte[] data, out T value, bool marshalElement = true, int startIndex = 0) -> void
static Reloaded.Memory.Struct.FromArray<T>(byte[] data, out T value, int startIndex = 0) -> void
static Reloaded.Memory.Struct.FromArray<T>(System.Span<byte> data, out T value) -> void
static Reloaded.Memory.Struct.FromPtr<T>(nuint pointer, out T value, bool marshalElement = false) -> void
static Reloaded.Memory.Struct.FromPtr<T>(nuint pointer, out T value, Reloaded.Memory.Sources.MemoryExtensions.ReadFunction<T> readFunction, bool marshalElement = false) -> void
Expand Down Expand Up @@ -620,4 +618,10 @@ static Reloaded.Memory.StructArray.GetSize<T>(int elementCount) -> int
static Reloaded.Memory.StructArray.GetSize<T>(int elementCount, bool marshalElement) -> int
static Reloaded.Memory.StructArray.ToPtr<T>(nuint memoryAddress, T[] item, bool marshal = false) -> void
static Reloaded.Memory.Utilities.Blittable.IsBlittable(System.Type type) -> bool
static Reloaded.Memory.Utilities.Blittable.IsBlittable<T>() -> bool
static Reloaded.Memory.Utilities.Blittable.IsBlittable<T>() -> bool
static Reloaded.Memory.Struct.FromArray<T>(byte[] data, out T value) -> void
static Reloaded.Memory.Struct.FromArray<T>(byte[] data, out T value, bool marshalElement) -> void
static Reloaded.Memory.Struct.FromArray<T>(byte[] data, out T value, bool marshalElement, int startIndex) -> void
static Reloaded.Memory.Struct.FromArray<T>(byte[] data, out T value, int startIndex) -> void
static Reloaded.Memory.Struct.FromArray<T>(System.Span<byte> data, out T value, bool marshalElement) -> void
static Reloaded.Memory.Struct.FromArray<T>(System.Span<byte> data, out T value, bool marshalElement, int startIndex) -> void
@@ -0,0 +1,6 @@
static Reloaded.Memory.Struct.FromArray<T>(byte[] data, out T value) -> void
static Reloaded.Memory.Struct.FromArray<T>(byte[] data, out T value, bool marshalElement) -> void
static Reloaded.Memory.Struct.FromArray<T>(byte[] data, out T value, bool marshalElement, int startIndex) -> void
static Reloaded.Memory.Struct.FromArray<T>(byte[] data, out T value, int startIndex) -> void
static Reloaded.Memory.Struct.FromArray<T>(System.Span<byte> data, out T value, bool marshalElement) -> void
static Reloaded.Memory.Struct.FromArray<T>(System.Span<byte> data, out T value, bool marshalElement, int startIndex) -> void
Expand Up @@ -583,8 +583,6 @@ static Reloaded.Memory.Streams.StreamExtensions.WriteBigEndianPrimitive<T>(this
static Reloaded.Memory.Streams.StreamExtensions.WriteBigEndianPrimitive<T>(this System.IO.Stream stream, T[] structures) -> void
static Reloaded.Memory.Streams.StreamExtensions.WriteBigEndianStruct<T>(this System.IO.Stream stream, T structure) -> void
static Reloaded.Memory.Streams.StreamExtensions.WriteBigEndianStruct<T>(this System.IO.Stream stream, T[] structures) -> void
static Reloaded.Memory.Struct.FromArray<T>(byte[] data, out T value, bool marshalElement = true, int startIndex = 0) -> void
static Reloaded.Memory.Struct.FromArray<T>(byte[] data, out T value, int startIndex = 0) -> void
static Reloaded.Memory.Struct.FromArray<T>(System.Span<byte> data, out T value) -> void
static Reloaded.Memory.Struct.FromPtr<T>(nuint pointer, out T value, bool marshalElement = false) -> void
static Reloaded.Memory.Struct.FromPtr<T>(nuint pointer, out T value, Reloaded.Memory.Sources.MemoryExtensions.ReadFunction<T> readFunction, bool marshalElement = false) -> void
Expand Down Expand Up @@ -619,4 +617,10 @@ static Reloaded.Memory.StructArray.GetSize<T>(int elementCount) -> int
static Reloaded.Memory.StructArray.GetSize<T>(int elementCount, bool marshalElement) -> int
static Reloaded.Memory.StructArray.ToPtr<T>(nuint memoryAddress, T[] item, bool marshal = false) -> void
static Reloaded.Memory.Utilities.Blittable.IsBlittable(System.Type type) -> bool
static Reloaded.Memory.Utilities.Blittable.IsBlittable<T>() -> bool
static Reloaded.Memory.Utilities.Blittable.IsBlittable<T>() -> bool
static Reloaded.Memory.Struct.FromArray<T>(byte[] data, out T value) -> void
static Reloaded.Memory.Struct.FromArray<T>(byte[] data, out T value, bool marshalElement) -> void
static Reloaded.Memory.Struct.FromArray<T>(byte[] data, out T value, bool marshalElement, int startIndex) -> void
static Reloaded.Memory.Struct.FromArray<T>(byte[] data, out T value, int startIndex) -> void
static Reloaded.Memory.Struct.FromArray<T>(System.Span<byte> data, out T value, bool marshalElement) -> void
static Reloaded.Memory.Struct.FromArray<T>(System.Span<byte> data, out T value, bool marshalElement, int startIndex) -> void
@@ -0,0 +1,6 @@
static Reloaded.Memory.Struct.FromArray<T>(byte[] data, out T value) -> void
static Reloaded.Memory.Struct.FromArray<T>(byte[] data, out T value, bool marshalElement) -> void
static Reloaded.Memory.Struct.FromArray<T>(byte[] data, out T value, bool marshalElement, int startIndex) -> void
static Reloaded.Memory.Struct.FromArray<T>(byte[] data, out T value, int startIndex) -> void
static Reloaded.Memory.Struct.FromArray<T>(System.Span<byte> data, out T value, bool marshalElement) -> void
static Reloaded.Memory.Struct.FromArray<T>(System.Span<byte> data, out T value, bool marshalElement, int startIndex) -> void
Expand Up @@ -584,8 +584,6 @@ static Reloaded.Memory.Streams.StreamExtensions.WriteBigEndianPrimitive<T>(this
static Reloaded.Memory.Streams.StreamExtensions.WriteBigEndianPrimitive<T>(this System.IO.Stream stream, T[] structures) -> void
static Reloaded.Memory.Streams.StreamExtensions.WriteBigEndianStruct<T>(this System.IO.Stream stream, T structure) -> void
static Reloaded.Memory.Streams.StreamExtensions.WriteBigEndianStruct<T>(this System.IO.Stream stream, T[] structures) -> void
static Reloaded.Memory.Struct.FromArray<T>(byte[] data, out T value, bool marshalElement = true, int startIndex = 0) -> void
static Reloaded.Memory.Struct.FromArray<T>(byte[] data, out T value, int startIndex = 0) -> void
static Reloaded.Memory.Struct.FromArray<T>(System.Span<byte> data, out T value) -> void
static Reloaded.Memory.Struct.FromPtr<T>(nuint pointer, out T value, bool marshalElement = false) -> void
static Reloaded.Memory.Struct.FromPtr<T>(nuint pointer, out T value, Reloaded.Memory.Sources.MemoryExtensions.ReadFunction<T> readFunction, bool marshalElement = false) -> void
Expand Down Expand Up @@ -620,4 +618,10 @@ static Reloaded.Memory.StructArray.GetSize<T>(int elementCount) -> int
static Reloaded.Memory.StructArray.GetSize<T>(int elementCount, bool marshalElement) -> int
static Reloaded.Memory.StructArray.ToPtr<T>(nuint memoryAddress, T[] item, bool marshal = false) -> void
static Reloaded.Memory.Utilities.Blittable.IsBlittable(System.Type type) -> bool
static Reloaded.Memory.Utilities.Blittable.IsBlittable<T>() -> bool
static Reloaded.Memory.Utilities.Blittable.IsBlittable<T>() -> bool
static Reloaded.Memory.Struct.FromArray<T>(byte[] data, out T value) -> void
static Reloaded.Memory.Struct.FromArray<T>(byte[] data, out T value, bool marshalElement) -> void
static Reloaded.Memory.Struct.FromArray<T>(byte[] data, out T value, bool marshalElement, int startIndex) -> void
static Reloaded.Memory.Struct.FromArray<T>(byte[] data, out T value, int startIndex) -> void
static Reloaded.Memory.Struct.FromArray<T>(System.Span<byte> data, out T value, bool marshalElement) -> void
static Reloaded.Memory.Struct.FromArray<T>(System.Span<byte> data, out T value, bool marshalElement, int startIndex) -> void
@@ -0,0 +1,6 @@
static Reloaded.Memory.Struct.FromArray<T>(byte[] data, out T value) -> void
static Reloaded.Memory.Struct.FromArray<T>(byte[] data, out T value, bool marshalElement) -> void
static Reloaded.Memory.Struct.FromArray<T>(byte[] data, out T value, bool marshalElement, int startIndex) -> void
static Reloaded.Memory.Struct.FromArray<T>(byte[] data, out T value, int startIndex) -> void
static Reloaded.Memory.Struct.FromArray<T>(System.Span<byte> data, out T value, bool marshalElement) -> void
static Reloaded.Memory.Struct.FromArray<T>(System.Span<byte> data, out T value, bool marshalElement, int startIndex) -> void
67 changes: 65 additions & 2 deletions Source/Reloaded.Memory/Struct.cs
Expand Up @@ -96,27 +96,90 @@ public static unsafe class Struct
#if NET5_0_OR_GREATER
[DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicConstructors | DynamicallyAccessedMemberTypes.NonPublicConstructors)]
#endif
T>(byte[] data, out T value, bool marshalElement = true, int startIndex = 0)
T>(byte[] data, out T value, bool marshalElement, int startIndex)
{
fixed (byte* dataPtr = data)
{
value = Marshal.PtrToStructure<T>((IntPtr)(&dataPtr[startIndex]));
}
}

/// <summary>
/// Converts a byte array to a specified structure or class type with explicit StructLayout attribute.
/// </summary>
/// <param name="data">A byte array containing data from which to extract a structure from.</param>
/// <param name="value">Local variable to receive the read in struct.</param>
/// <param name="marshalElement">Set to true to marshal the element.</param>
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public static void FromArray<
#if NET5_0_OR_GREATER
[DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicConstructors | DynamicallyAccessedMemberTypes.NonPublicConstructors)]
#endif
T>(byte[] data, out T value, bool marshalElement)
{
FromArray(data, out value, marshalElement, startIndex: 0);
}

/// <summary>
/// Converts a byte array to a specified structure or class type with explicit StructLayout attribute.
/// </summary>
/// <param name="value">Local variable to receive the read in struct.</param>
/// <param name="data">A byte array containing data from which to extract a structure from.</param>
/// <param name="startIndex">The index in the byte array to read the element from.</param>
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public static void FromArray<T>(byte[] data, out T value, int startIndex = 0) where T : unmanaged
public static void FromArray<T>(byte[] data, out T value, int startIndex) where T : unmanaged
{
var arraySpan = new Span<byte>(data, startIndex, data.Length - startIndex);
value = MemoryMarshal.Read<T>(arraySpan);
}

/// <summary>
/// Converts a byte array to a specified structure or class type with explicit StructLayout attribute.
/// </summary>
/// <param name="value">Local variable to receive the read in struct.</param>
/// <param name="data">A byte array containing data from which to extract a structure from.</param>
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public static void FromArray<T>(byte[] data, out T value) where T : unmanaged
{
FromArray(data, out value, startIndex: 0);
}

/// <summary>
/// Converts a byte array to a specified structure or class type with explicit StructLayout attribute.
/// </summary>
/// <param name="data">A byte array containing data from which to extract a structure from.</param>
/// <param name="value">Local variable to receive the read in struct.</param>
/// <param name="marshalElement">Set to true to marshal the element.</param>
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public static void FromArray<
#if NET5_0_OR_GREATER
[DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicConstructors | DynamicallyAccessedMemberTypes.NonPublicConstructors)]
#endif
T>(Span<byte> data, out T value, bool marshalElement)
{
FromArray(data, out value, marshalElement, 0);
}

/// <summary>
/// Converts a byte array to a specified structure or class type with explicit StructLayout attribute.
/// </summary>
/// <param name="data">A byte array containing data from which to extract a structure from.</param>
/// <param name="value">Local variable to receive the read in struct.</param>
/// <param name="marshalElement">Set to true to marshal the element.</param>
/// <param name="startIndex">The index in the byte array to read the element from.</param>
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public static void FromArray<
#if NET5_0_OR_GREATER
[DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicConstructors | DynamicallyAccessedMemberTypes.NonPublicConstructors)]
#endif
T>(Span<byte> data, out T value, bool marshalElement, int startIndex)
{
fixed (byte* dataPtr = data)
{
value = Marshal.PtrToStructure<T>((IntPtr)(&dataPtr[startIndex]));
}
}

/// <summary>
/// Converts a span to a specified structure or class type with explicit StructLayout attribute.
/// </summary>
Expand Down

0 comments on commit 8b08b82

Please sign in to comment.