From 584feb33e6673e01402be9beaa422874ef381a9a Mon Sep 17 00:00:00 2001 From: Matt Nadareski Date: Tue, 7 May 2024 05:00:43 -0400 Subject: [PATCH] Handle special struct types --- .../Extensions/BinaryReaderExtensions.cs | 14 ++++++++++++++ .../Extensions/BinaryWriterExtensions.cs | 18 ++++++++++++++++++ .../Extensions/ByteArrayReaderExtensions.cs | 14 ++++++++++++++ .../Extensions/ByteArrayWriterExtensions.cs | 18 ++++++++++++++++++ .../Extensions/StreamReaderExtensions.cs | 14 ++++++++++++++ .../Extensions/StreamWriterExtensions.cs | 18 ++++++++++++++++++ 6 files changed, 96 insertions(+) diff --git a/SabreTools.IO/Extensions/BinaryReaderExtensions.cs b/SabreTools.IO/Extensions/BinaryReaderExtensions.cs index 694b251..22852ea 100644 --- a/SabreTools.IO/Extensions/BinaryReaderExtensions.cs +++ b/SabreTools.IO/Extensions/BinaryReaderExtensions.cs @@ -494,6 +494,20 @@ namespace SabreTools.IO.Extensions /// public static object? ReadType(this BinaryReader reader, Type type) { + // Handle special struct cases + if (type == typeof(Guid)) + return reader.ReadGuid(); +#if NET6_0_OR_GREATER + else if (type == typeof(Half)) + return reader.ReadHalf(); +#endif +#if NET7_0_OR_GREATER + else if (type == typeof(Int128)) + return reader.ReadInt128(); + else if (type == typeof(UInt128)) + return reader.ReadUInt128(); +#endif + if (type.IsClass || (type.IsValueType && !type.IsEnum && !type.IsPrimitive)) return ReadComplexType(reader, type); else if (type.IsValueType && type.IsEnum) diff --git a/SabreTools.IO/Extensions/BinaryWriterExtensions.cs b/SabreTools.IO/Extensions/BinaryWriterExtensions.cs index 59272eb..0f22ee1 100644 --- a/SabreTools.IO/Extensions/BinaryWriterExtensions.cs +++ b/SabreTools.IO/Extensions/BinaryWriterExtensions.cs @@ -448,6 +448,24 @@ namespace SabreTools.IO.Extensions /// public static bool WriteType(this BinaryWriter writer, object? value, Type type) { + // Null values cannot be written + if (value == null) + return true; + + // Handle special struct cases + if (type == typeof(Guid)) + return writer.Write((Guid)value); +#if NET6_0_OR_GREATER + else if (type == typeof(Half)) + return writer.Write((Half)value); +#endif +#if NET7_0_OR_GREATER + else if (type == typeof(Int128)) + return writer.Write((Int128)value); + else if (type == typeof(UInt128)) + return writer.Write((UInt128)value); +#endif + if (type.IsClass || (type.IsValueType && !type.IsEnum && !type.IsPrimitive)) return WriteComplexType(writer, value, type); else if (type.IsValueType && type.IsEnum) diff --git a/SabreTools.IO/Extensions/ByteArrayReaderExtensions.cs b/SabreTools.IO/Extensions/ByteArrayReaderExtensions.cs index 0662423..03894ba 100644 --- a/SabreTools.IO/Extensions/ByteArrayReaderExtensions.cs +++ b/SabreTools.IO/Extensions/ByteArrayReaderExtensions.cs @@ -622,6 +622,20 @@ namespace SabreTools.IO.Extensions /// public static object? ReadType(this byte[] content, ref int offset, Type type) { + // Handle special struct cases + if (type == typeof(Guid)) + return content.ReadGuid(ref offset); +#if NET6_0_OR_GREATER + else if (type == typeof(Half)) + return content.ReadHalf(ref offset); +#endif +#if NET7_0_OR_GREATER + else if (type == typeof(Int128)) + return content.ReadInt128(ref offset); + else if (type == typeof(UInt128)) + return content.ReadUInt128(ref offset); +#endif + if (type.IsClass || (type.IsValueType && !type.IsEnum && !type.IsPrimitive)) return ReadComplexType(content, ref offset, type); else if (type.IsValueType && type.IsEnum) diff --git a/SabreTools.IO/Extensions/ByteArrayWriterExtensions.cs b/SabreTools.IO/Extensions/ByteArrayWriterExtensions.cs index 88fe234..a8768bd 100644 --- a/SabreTools.IO/Extensions/ByteArrayWriterExtensions.cs +++ b/SabreTools.IO/Extensions/ByteArrayWriterExtensions.cs @@ -601,6 +601,24 @@ namespace SabreTools.IO.Extensions /// public static bool WriteType(this byte[] content, ref int offset, object? value, Type type) { + // Null values cannot be written + if (value == null) + return true; + + // Handle special struct cases + if (type == typeof(Guid)) + return content.Write(ref offset, (Guid)value); +#if NET6_0_OR_GREATER + else if (type == typeof(Half)) + return content.Write(ref offset, (Half)value); +#endif +#if NET7_0_OR_GREATER + else if (type == typeof(Int128)) + return content.Write(ref offset, (Int128)value); + else if (type == typeof(UInt128)) + return content.Write(ref offset, (UInt128)value); +#endif + if (type.IsClass || (type.IsValueType && !type.IsEnum && !type.IsPrimitive)) return WriteComplexType(content, ref offset, value, type); else if (type.IsValueType && type.IsEnum) diff --git a/SabreTools.IO/Extensions/StreamReaderExtensions.cs b/SabreTools.IO/Extensions/StreamReaderExtensions.cs index 7b72179..03b9df4 100644 --- a/SabreTools.IO/Extensions/StreamReaderExtensions.cs +++ b/SabreTools.IO/Extensions/StreamReaderExtensions.cs @@ -606,6 +606,20 @@ namespace SabreTools.IO.Extensions /// public static object? ReadType(this Stream stream, Type type) { + // Handle special struct cases + if (type == typeof(Guid)) + return stream.ReadGuid(); +#if NET6_0_OR_GREATER + else if (type == typeof(Half)) + return stream.ReadHalf(); +#endif +#if NET7_0_OR_GREATER + else if (type == typeof(Int128)) + return stream.ReadInt128(); + else if (type == typeof(UInt128)) + return stream.ReadUInt128(); +#endif + if (type.IsClass || (type.IsValueType && !type.IsEnum && !type.IsPrimitive)) return ReadComplexType(stream, type); else if (type.IsValueType && type.IsEnum) diff --git a/SabreTools.IO/Extensions/StreamWriterExtensions.cs b/SabreTools.IO/Extensions/StreamWriterExtensions.cs index 610e9fa..13490ea 100644 --- a/SabreTools.IO/Extensions/StreamWriterExtensions.cs +++ b/SabreTools.IO/Extensions/StreamWriterExtensions.cs @@ -602,6 +602,24 @@ namespace SabreTools.IO.Extensions /// public static bool WriteType(this Stream stream, object? value, Type type) { + // Null values cannot be written + if (value == null) + return true; + + // Handle special struct cases + if (type == typeof(Guid)) + return stream.Write((Guid)value); +#if NET6_0_OR_GREATER + else if (type == typeof(Half)) + return stream.Write((Half)value); +#endif +#if NET7_0_OR_GREATER + else if (type == typeof(Int128)) + return stream.Write((Int128)value); + else if (type == typeof(UInt128)) + return stream.Write((UInt128)value); +#endif + if (type.IsClass || (type.IsValueType && !type.IsEnum && !type.IsPrimitive)) return WriteComplexType(stream, value, type); else if (type.IsValueType && type.IsEnum)