From 69f23b1cb7aef1be42efb4bba16dbe1aaab5049b Mon Sep 17 00:00:00 2001 From: MeltyPlayer Date: Mon, 26 Jun 2023 23:28:27 -0500 Subject: [PATCH] Added some methods for returning a value from a subread. --- .../system/io/reader/EndianBinaryReader.cs | 25 +++++++++++++++++++ .../system/io/reader/IEndianBinaryReader.cs | 9 +++++++ 2 files changed, 34 insertions(+) diff --git a/Schema/lib/system/io/reader/EndianBinaryReader.cs b/Schema/lib/system/io/reader/EndianBinaryReader.cs index 90e35b5..fb1e17f 100644 --- a/Schema/lib/system/io/reader/EndianBinaryReader.cs +++ b/Schema/lib/system/io/reader/EndianBinaryReader.cs @@ -2,6 +2,7 @@ using SubstreamSharp; +using static schema.binary.BinarySchemaStructureParser; namespace System.IO { public sealed partial class EndianBinaryReader : IEndianBinaryReader, @@ -162,6 +163,30 @@ public void Subread(long position, Action subread) { } + public T Subread(long position, + int len, + Func subread) { + T value = default; + + this.Subread( + position, + len, + ser => { value = subread(ser); }); + + return value!; + } + + public T Subread(long position, Func subread) { + T value = default; + + this.Subread( + position, + ser => { value = subread(ser); }); + + return value!; + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] private static void Assert_(T expectedValue, T actualValue) { if (!expectedValue.Equals(actualValue)) { diff --git a/Schema/lib/system/io/reader/IEndianBinaryReader.cs b/Schema/lib/system/io/reader/IEndianBinaryReader.cs index 4c42f25..6b8f898 100644 --- a/Schema/lib/system/io/reader/IEndianBinaryReader.cs +++ b/Schema/lib/system/io/reader/IEndianBinaryReader.cs @@ -17,12 +17,21 @@ public interface IEndianBinaryReader : IEndiannessStack, IDataReader { T ReadNewAtOffset(long position) where T : IBinaryDeserializable, new(); T[] ReadNewArrayAtOffset(long position, int length) where T : IBinaryDeserializable, new(); + void Subread(long position, int len, Action subread); void Subread(long position, Action subread); + + T Subread(long position, + int len, + Func subread); + + T Subread(long position, Func subread); + + byte[] ReadBytes(long count); void ReadBytes(byte[] dst, int start, int length); void ReadBytes(Span dst);