From 8b08b82779f028963c36aa271624230849219d94 Mon Sep 17 00:00:00 2001 From: Sewer 56 Date: Wed, 6 Jul 2022 15:02:53 +0100 Subject: [PATCH] Added: FromArray Span Methods & Backcompat Overloads --- .../PublicAPI/net5.0/PublicAPI.Shipped.txt | 10 ++- .../PublicAPI/net5.0/PublicAPI.Unshipped.txt | 6 ++ .../PublicAPI/net6.0/PublicAPI.Shipped.txt | 10 ++- .../PublicAPI/net6.0/PublicAPI.Unshipped.txt | 6 ++ .../netstandard2.0/PublicAPI.Shipped.txt | 10 ++- .../netstandard2.0/PublicAPI.Unshipped.txt | 6 ++ .../netstandard2.1/PublicAPI.Shipped.txt | 10 ++- .../netstandard2.1/PublicAPI.Unshipped.txt | 6 ++ Source/Reloaded.Memory/Struct.cs | 67 ++++++++++++++++++- 9 files changed, 117 insertions(+), 14 deletions(-) diff --git a/Source/Reloaded.Memory/PublicAPI/net5.0/PublicAPI.Shipped.txt b/Source/Reloaded.Memory/PublicAPI/net5.0/PublicAPI.Shipped.txt index dd6a265..9865768 100644 --- a/Source/Reloaded.Memory/PublicAPI/net5.0/PublicAPI.Shipped.txt +++ b/Source/Reloaded.Memory/PublicAPI/net5.0/PublicAPI.Shipped.txt @@ -584,8 +584,6 @@ static Reloaded.Memory.Streams.StreamExtensions.WriteBigEndianPrimitive(this static Reloaded.Memory.Streams.StreamExtensions.WriteBigEndianPrimitive(this System.IO.Stream stream, T[] structures) -> void static Reloaded.Memory.Streams.StreamExtensions.WriteBigEndianStruct(this System.IO.Stream stream, T structure) -> void static Reloaded.Memory.Streams.StreamExtensions.WriteBigEndianStruct(this System.IO.Stream stream, T[] structures) -> void -static Reloaded.Memory.Struct.FromArray(byte[] data, out T value, bool marshalElement = true, int startIndex = 0) -> void -static Reloaded.Memory.Struct.FromArray(byte[] data, out T value, int startIndex = 0) -> void static Reloaded.Memory.Struct.FromArray(System.Span data, out T value) -> void static Reloaded.Memory.Struct.FromPtr(nuint pointer, out T value, bool marshalElement = false) -> void static Reloaded.Memory.Struct.FromPtr(nuint pointer, out T value, Reloaded.Memory.Sources.MemoryExtensions.ReadFunction readFunction, bool marshalElement = false) -> void @@ -620,4 +618,10 @@ static Reloaded.Memory.StructArray.GetSize(int elementCount) -> int static Reloaded.Memory.StructArray.GetSize(int elementCount, bool marshalElement) -> int static Reloaded.Memory.StructArray.ToPtr(nuint memoryAddress, T[] item, bool marshal = false) -> void static Reloaded.Memory.Utilities.Blittable.IsBlittable(System.Type type) -> bool -static Reloaded.Memory.Utilities.Blittable.IsBlittable() -> bool \ No newline at end of file +static Reloaded.Memory.Utilities.Blittable.IsBlittable() -> bool +static Reloaded.Memory.Struct.FromArray(byte[] data, out T value) -> void +static Reloaded.Memory.Struct.FromArray(byte[] data, out T value, bool marshalElement) -> void +static Reloaded.Memory.Struct.FromArray(byte[] data, out T value, bool marshalElement, int startIndex) -> void +static Reloaded.Memory.Struct.FromArray(byte[] data, out T value, int startIndex) -> void +static Reloaded.Memory.Struct.FromArray(System.Span data, out T value, bool marshalElement) -> void +static Reloaded.Memory.Struct.FromArray(System.Span data, out T value, bool marshalElement, int startIndex) -> void \ No newline at end of file diff --git a/Source/Reloaded.Memory/PublicAPI/net5.0/PublicAPI.Unshipped.txt b/Source/Reloaded.Memory/PublicAPI/net5.0/PublicAPI.Unshipped.txt index e69de29..8ada0c0 100644 --- a/Source/Reloaded.Memory/PublicAPI/net5.0/PublicAPI.Unshipped.txt +++ b/Source/Reloaded.Memory/PublicAPI/net5.0/PublicAPI.Unshipped.txt @@ -0,0 +1,6 @@ +static Reloaded.Memory.Struct.FromArray(byte[] data, out T value) -> void +static Reloaded.Memory.Struct.FromArray(byte[] data, out T value, bool marshalElement) -> void +static Reloaded.Memory.Struct.FromArray(byte[] data, out T value, bool marshalElement, int startIndex) -> void +static Reloaded.Memory.Struct.FromArray(byte[] data, out T value, int startIndex) -> void +static Reloaded.Memory.Struct.FromArray(System.Span data, out T value, bool marshalElement) -> void +static Reloaded.Memory.Struct.FromArray(System.Span data, out T value, bool marshalElement, int startIndex) -> void \ No newline at end of file diff --git a/Source/Reloaded.Memory/PublicAPI/net6.0/PublicAPI.Shipped.txt b/Source/Reloaded.Memory/PublicAPI/net6.0/PublicAPI.Shipped.txt index dd6a265..9865768 100644 --- a/Source/Reloaded.Memory/PublicAPI/net6.0/PublicAPI.Shipped.txt +++ b/Source/Reloaded.Memory/PublicAPI/net6.0/PublicAPI.Shipped.txt @@ -584,8 +584,6 @@ static Reloaded.Memory.Streams.StreamExtensions.WriteBigEndianPrimitive(this static Reloaded.Memory.Streams.StreamExtensions.WriteBigEndianPrimitive(this System.IO.Stream stream, T[] structures) -> void static Reloaded.Memory.Streams.StreamExtensions.WriteBigEndianStruct(this System.IO.Stream stream, T structure) -> void static Reloaded.Memory.Streams.StreamExtensions.WriteBigEndianStruct(this System.IO.Stream stream, T[] structures) -> void -static Reloaded.Memory.Struct.FromArray(byte[] data, out T value, bool marshalElement = true, int startIndex = 0) -> void -static Reloaded.Memory.Struct.FromArray(byte[] data, out T value, int startIndex = 0) -> void static Reloaded.Memory.Struct.FromArray(System.Span data, out T value) -> void static Reloaded.Memory.Struct.FromPtr(nuint pointer, out T value, bool marshalElement = false) -> void static Reloaded.Memory.Struct.FromPtr(nuint pointer, out T value, Reloaded.Memory.Sources.MemoryExtensions.ReadFunction readFunction, bool marshalElement = false) -> void @@ -620,4 +618,10 @@ static Reloaded.Memory.StructArray.GetSize(int elementCount) -> int static Reloaded.Memory.StructArray.GetSize(int elementCount, bool marshalElement) -> int static Reloaded.Memory.StructArray.ToPtr(nuint memoryAddress, T[] item, bool marshal = false) -> void static Reloaded.Memory.Utilities.Blittable.IsBlittable(System.Type type) -> bool -static Reloaded.Memory.Utilities.Blittable.IsBlittable() -> bool \ No newline at end of file +static Reloaded.Memory.Utilities.Blittable.IsBlittable() -> bool +static Reloaded.Memory.Struct.FromArray(byte[] data, out T value) -> void +static Reloaded.Memory.Struct.FromArray(byte[] data, out T value, bool marshalElement) -> void +static Reloaded.Memory.Struct.FromArray(byte[] data, out T value, bool marshalElement, int startIndex) -> void +static Reloaded.Memory.Struct.FromArray(byte[] data, out T value, int startIndex) -> void +static Reloaded.Memory.Struct.FromArray(System.Span data, out T value, bool marshalElement) -> void +static Reloaded.Memory.Struct.FromArray(System.Span data, out T value, bool marshalElement, int startIndex) -> void \ No newline at end of file diff --git a/Source/Reloaded.Memory/PublicAPI/net6.0/PublicAPI.Unshipped.txt b/Source/Reloaded.Memory/PublicAPI/net6.0/PublicAPI.Unshipped.txt index e69de29..8ada0c0 100644 --- a/Source/Reloaded.Memory/PublicAPI/net6.0/PublicAPI.Unshipped.txt +++ b/Source/Reloaded.Memory/PublicAPI/net6.0/PublicAPI.Unshipped.txt @@ -0,0 +1,6 @@ +static Reloaded.Memory.Struct.FromArray(byte[] data, out T value) -> void +static Reloaded.Memory.Struct.FromArray(byte[] data, out T value, bool marshalElement) -> void +static Reloaded.Memory.Struct.FromArray(byte[] data, out T value, bool marshalElement, int startIndex) -> void +static Reloaded.Memory.Struct.FromArray(byte[] data, out T value, int startIndex) -> void +static Reloaded.Memory.Struct.FromArray(System.Span data, out T value, bool marshalElement) -> void +static Reloaded.Memory.Struct.FromArray(System.Span data, out T value, bool marshalElement, int startIndex) -> void \ No newline at end of file diff --git a/Source/Reloaded.Memory/PublicAPI/netstandard2.0/PublicAPI.Shipped.txt b/Source/Reloaded.Memory/PublicAPI/netstandard2.0/PublicAPI.Shipped.txt index 9d4b81e..8bde0c9 100644 --- a/Source/Reloaded.Memory/PublicAPI/netstandard2.0/PublicAPI.Shipped.txt +++ b/Source/Reloaded.Memory/PublicAPI/netstandard2.0/PublicAPI.Shipped.txt @@ -583,8 +583,6 @@ static Reloaded.Memory.Streams.StreamExtensions.WriteBigEndianPrimitive(this static Reloaded.Memory.Streams.StreamExtensions.WriteBigEndianPrimitive(this System.IO.Stream stream, T[] structures) -> void static Reloaded.Memory.Streams.StreamExtensions.WriteBigEndianStruct(this System.IO.Stream stream, T structure) -> void static Reloaded.Memory.Streams.StreamExtensions.WriteBigEndianStruct(this System.IO.Stream stream, T[] structures) -> void -static Reloaded.Memory.Struct.FromArray(byte[] data, out T value, bool marshalElement = true, int startIndex = 0) -> void -static Reloaded.Memory.Struct.FromArray(byte[] data, out T value, int startIndex = 0) -> void static Reloaded.Memory.Struct.FromArray(System.Span data, out T value) -> void static Reloaded.Memory.Struct.FromPtr(nuint pointer, out T value, bool marshalElement = false) -> void static Reloaded.Memory.Struct.FromPtr(nuint pointer, out T value, Reloaded.Memory.Sources.MemoryExtensions.ReadFunction readFunction, bool marshalElement = false) -> void @@ -619,4 +617,10 @@ static Reloaded.Memory.StructArray.GetSize(int elementCount) -> int static Reloaded.Memory.StructArray.GetSize(int elementCount, bool marshalElement) -> int static Reloaded.Memory.StructArray.ToPtr(nuint memoryAddress, T[] item, bool marshal = false) -> void static Reloaded.Memory.Utilities.Blittable.IsBlittable(System.Type type) -> bool -static Reloaded.Memory.Utilities.Blittable.IsBlittable() -> bool \ No newline at end of file +static Reloaded.Memory.Utilities.Blittable.IsBlittable() -> bool +static Reloaded.Memory.Struct.FromArray(byte[] data, out T value) -> void +static Reloaded.Memory.Struct.FromArray(byte[] data, out T value, bool marshalElement) -> void +static Reloaded.Memory.Struct.FromArray(byte[] data, out T value, bool marshalElement, int startIndex) -> void +static Reloaded.Memory.Struct.FromArray(byte[] data, out T value, int startIndex) -> void +static Reloaded.Memory.Struct.FromArray(System.Span data, out T value, bool marshalElement) -> void +static Reloaded.Memory.Struct.FromArray(System.Span data, out T value, bool marshalElement, int startIndex) -> void \ No newline at end of file diff --git a/Source/Reloaded.Memory/PublicAPI/netstandard2.0/PublicAPI.Unshipped.txt b/Source/Reloaded.Memory/PublicAPI/netstandard2.0/PublicAPI.Unshipped.txt index e69de29..8ada0c0 100644 --- a/Source/Reloaded.Memory/PublicAPI/netstandard2.0/PublicAPI.Unshipped.txt +++ b/Source/Reloaded.Memory/PublicAPI/netstandard2.0/PublicAPI.Unshipped.txt @@ -0,0 +1,6 @@ +static Reloaded.Memory.Struct.FromArray(byte[] data, out T value) -> void +static Reloaded.Memory.Struct.FromArray(byte[] data, out T value, bool marshalElement) -> void +static Reloaded.Memory.Struct.FromArray(byte[] data, out T value, bool marshalElement, int startIndex) -> void +static Reloaded.Memory.Struct.FromArray(byte[] data, out T value, int startIndex) -> void +static Reloaded.Memory.Struct.FromArray(System.Span data, out T value, bool marshalElement) -> void +static Reloaded.Memory.Struct.FromArray(System.Span data, out T value, bool marshalElement, int startIndex) -> void \ No newline at end of file diff --git a/Source/Reloaded.Memory/PublicAPI/netstandard2.1/PublicAPI.Shipped.txt b/Source/Reloaded.Memory/PublicAPI/netstandard2.1/PublicAPI.Shipped.txt index dd6a265..9865768 100644 --- a/Source/Reloaded.Memory/PublicAPI/netstandard2.1/PublicAPI.Shipped.txt +++ b/Source/Reloaded.Memory/PublicAPI/netstandard2.1/PublicAPI.Shipped.txt @@ -584,8 +584,6 @@ static Reloaded.Memory.Streams.StreamExtensions.WriteBigEndianPrimitive(this static Reloaded.Memory.Streams.StreamExtensions.WriteBigEndianPrimitive(this System.IO.Stream stream, T[] structures) -> void static Reloaded.Memory.Streams.StreamExtensions.WriteBigEndianStruct(this System.IO.Stream stream, T structure) -> void static Reloaded.Memory.Streams.StreamExtensions.WriteBigEndianStruct(this System.IO.Stream stream, T[] structures) -> void -static Reloaded.Memory.Struct.FromArray(byte[] data, out T value, bool marshalElement = true, int startIndex = 0) -> void -static Reloaded.Memory.Struct.FromArray(byte[] data, out T value, int startIndex = 0) -> void static Reloaded.Memory.Struct.FromArray(System.Span data, out T value) -> void static Reloaded.Memory.Struct.FromPtr(nuint pointer, out T value, bool marshalElement = false) -> void static Reloaded.Memory.Struct.FromPtr(nuint pointer, out T value, Reloaded.Memory.Sources.MemoryExtensions.ReadFunction readFunction, bool marshalElement = false) -> void @@ -620,4 +618,10 @@ static Reloaded.Memory.StructArray.GetSize(int elementCount) -> int static Reloaded.Memory.StructArray.GetSize(int elementCount, bool marshalElement) -> int static Reloaded.Memory.StructArray.ToPtr(nuint memoryAddress, T[] item, bool marshal = false) -> void static Reloaded.Memory.Utilities.Blittable.IsBlittable(System.Type type) -> bool -static Reloaded.Memory.Utilities.Blittable.IsBlittable() -> bool \ No newline at end of file +static Reloaded.Memory.Utilities.Blittable.IsBlittable() -> bool +static Reloaded.Memory.Struct.FromArray(byte[] data, out T value) -> void +static Reloaded.Memory.Struct.FromArray(byte[] data, out T value, bool marshalElement) -> void +static Reloaded.Memory.Struct.FromArray(byte[] data, out T value, bool marshalElement, int startIndex) -> void +static Reloaded.Memory.Struct.FromArray(byte[] data, out T value, int startIndex) -> void +static Reloaded.Memory.Struct.FromArray(System.Span data, out T value, bool marshalElement) -> void +static Reloaded.Memory.Struct.FromArray(System.Span data, out T value, bool marshalElement, int startIndex) -> void \ No newline at end of file diff --git a/Source/Reloaded.Memory/PublicAPI/netstandard2.1/PublicAPI.Unshipped.txt b/Source/Reloaded.Memory/PublicAPI/netstandard2.1/PublicAPI.Unshipped.txt index e69de29..8ada0c0 100644 --- a/Source/Reloaded.Memory/PublicAPI/netstandard2.1/PublicAPI.Unshipped.txt +++ b/Source/Reloaded.Memory/PublicAPI/netstandard2.1/PublicAPI.Unshipped.txt @@ -0,0 +1,6 @@ +static Reloaded.Memory.Struct.FromArray(byte[] data, out T value) -> void +static Reloaded.Memory.Struct.FromArray(byte[] data, out T value, bool marshalElement) -> void +static Reloaded.Memory.Struct.FromArray(byte[] data, out T value, bool marshalElement, int startIndex) -> void +static Reloaded.Memory.Struct.FromArray(byte[] data, out T value, int startIndex) -> void +static Reloaded.Memory.Struct.FromArray(System.Span data, out T value, bool marshalElement) -> void +static Reloaded.Memory.Struct.FromArray(System.Span data, out T value, bool marshalElement, int startIndex) -> void \ No newline at end of file diff --git a/Source/Reloaded.Memory/Struct.cs b/Source/Reloaded.Memory/Struct.cs index fe478ed..d9cc99b 100644 --- a/Source/Reloaded.Memory/Struct.cs +++ b/Source/Reloaded.Memory/Struct.cs @@ -96,7 +96,7 @@ 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) { @@ -104,6 +104,22 @@ public static unsafe class Struct } } + /// + /// Converts a byte array to a specified structure or class type with explicit StructLayout attribute. + /// + /// A byte array containing data from which to extract a structure from. + /// Local variable to receive the read in struct. + /// Set to true to marshal the element. + [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); + } + /// /// Converts a byte array to a specified structure or class type with explicit StructLayout attribute. /// @@ -111,12 +127,59 @@ public static unsafe class Struct /// A byte array containing data from which to extract a structure from. /// The index in the byte array to read the element from. [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static void FromArray(byte[] data, out T value, int startIndex = 0) where T : unmanaged + public static void FromArray(byte[] data, out T value, int startIndex) where T : unmanaged { var arraySpan = new Span(data, startIndex, data.Length - startIndex); value = MemoryMarshal.Read(arraySpan); } + /// + /// Converts a byte array to a specified structure or class type with explicit StructLayout attribute. + /// + /// Local variable to receive the read in struct. + /// A byte array containing data from which to extract a structure from. + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static void FromArray(byte[] data, out T value) where T : unmanaged + { + FromArray(data, out value, startIndex: 0); + } + + /// + /// Converts a byte array to a specified structure or class type with explicit StructLayout attribute. + /// + /// A byte array containing data from which to extract a structure from. + /// Local variable to receive the read in struct. + /// Set to true to marshal the element. + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static void FromArray< +#if NET5_0_OR_GREATER + [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicConstructors | DynamicallyAccessedMemberTypes.NonPublicConstructors)] +#endif + T>(Span data, out T value, bool marshalElement) + { + FromArray(data, out value, marshalElement, 0); + } + + /// + /// Converts a byte array to a specified structure or class type with explicit StructLayout attribute. + /// + /// A byte array containing data from which to extract a structure from. + /// Local variable to receive the read in struct. + /// Set to true to marshal the element. + /// The index in the byte array to read the element from. + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static void FromArray< +#if NET5_0_OR_GREATER + [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicConstructors | DynamicallyAccessedMemberTypes.NonPublicConstructors)] +#endif + T>(Span data, out T value, bool marshalElement, int startIndex) + { + fixed (byte* dataPtr = data) + { + value = Marshal.PtrToStructure((IntPtr)(&dataPtr[startIndex])); + } + } + /// /// Converts a span to a specified structure or class type with explicit StructLayout attribute. ///