From c98eb5c42a4e0b7aa6710dbd69faaadcb25dab1a Mon Sep 17 00:00:00 2001 From: Matt Nadareski Date: Sat, 23 Aug 2025 21:11:41 -0400 Subject: [PATCH] Add "here to the end" constructors --- SabreTools.IO.Test/Streams/ViewStreamTests.cs | 28 ++++++++++++++-- SabreTools.IO/Streams/ViewStream.cs | 33 +++++++++++++++++++ 2 files changed, 59 insertions(+), 2 deletions(-) diff --git a/SabreTools.IO.Test/Streams/ViewStreamTests.cs b/SabreTools.IO.Test/Streams/ViewStreamTests.cs index 13f9953..560a4ae 100644 --- a/SabreTools.IO.Test/Streams/ViewStreamTests.cs +++ b/SabreTools.IO.Test/Streams/ViewStreamTests.cs @@ -9,11 +9,23 @@ namespace SabreTools.IO.Test.Streams { #region Constructor + [Theory] + [InlineData(0, 0, 0)] + [InlineData(1024, 0, 1024)] + [InlineData(1024, 256, 768)] + public void Constructor_Array(int size, long offset, long expectedLength) + { + byte[] data = new byte[size]; + var stream = new ViewStream(data, offset); + Assert.Equal(expectedLength, stream.Length); + Assert.Equal(0, stream.Position); + } + [Theory] [InlineData(0, 0, 0, 0)] [InlineData(1024, 0, 1024, 1024)] [InlineData(1024, 256, 512, 512)] - public void Constructor_Array(int size, long offset, long length, long expectedLength) + public void Constructor_Array_Length(int size, long offset, long length, long expectedLength) { byte[] data = new byte[size]; var stream = new ViewStream(data, offset, length); @@ -47,11 +59,23 @@ namespace SabreTools.IO.Test.Streams Assert.Throws(() => _ = new ViewStream(data, offset, length)); } + [Theory] + [InlineData(0, 0, 0)] + [InlineData(1024, 0, 1024)] + [InlineData(1024, 256, 768)] + public void Constructor_Stream(int size, long offset, long expectedLength) + { + Stream data = new MemoryStream(new byte[size]); + var stream = new ViewStream(data, offset); + Assert.Equal(expectedLength, stream.Length); + Assert.Equal(0, stream.Position); + } + [Theory] [InlineData(0, 0, 0, 0)] [InlineData(1024, 0, 1024, 1024)] [InlineData(1024, 256, 512, 512)] - public void Constructor_Stream(int size, long offset, long length, long expectedLength) + public void Constructor_Stream_Length(int size, long offset, long length, long expectedLength) { Stream data = new MemoryStream(new byte[size]); var stream = new ViewStream(data, offset, length); diff --git a/SabreTools.IO/Streams/ViewStream.cs b/SabreTools.IO/Streams/ViewStream.cs index 790f355..dad4fe6 100644 --- a/SabreTools.IO/Streams/ViewStream.cs +++ b/SabreTools.IO/Streams/ViewStream.cs @@ -89,6 +89,23 @@ namespace SabreTools.IO.Streams #region Constructors + /// + /// Construct a new ViewStream from a Stream + /// + public ViewStream(Stream data, long offset) + { + if (!data.CanRead) + throw new ArgumentException(nameof(data)); + if (offset < 0 || offset > data.Length) + throw new ArgumentOutOfRangeException(nameof(offset)); + + _source = data; + _initialPosition = offset; + _length = data.Length - offset; + + _source.Seek(_initialPosition, SeekOrigin.Begin); + } + /// /// Construct a new ViewStream from a Stream /// @@ -108,6 +125,22 @@ namespace SabreTools.IO.Streams _source.Seek(_initialPosition, SeekOrigin.Begin); } + /// + /// Construct a new ViewStream from a byte array + /// + public ViewStream(byte[] data, long offset) + { + if (offset < 0 || offset > data.Length) + throw new ArgumentOutOfRangeException(nameof(offset)); + + long length = data.Length - offset; + _source = new MemoryStream(data, (int)offset, (int)length); + _initialPosition = 0; + _length = length; + + _source.Seek(_initialPosition, SeekOrigin.Begin); + } + /// /// Construct a new ViewStream from a byte array ///