Skip to content

Commit 56887ef

Browse files
committed
Added: Ability to optionally not dispose underlying Streams
1 parent bdb2655 commit 56887ef

6 files changed

Lines changed: 54 additions & 22 deletions

File tree

Source/Reloaded.Memory/Streams/Readers/BigEndianStreamReader.cs

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
1-
using System.Diagnostics.CodeAnalysis;
2-
using System.Runtime.CompilerServices;
1+
using System.Runtime.CompilerServices;
32

43
namespace Reloaded.Memory.Streams.Readers
54
{
@@ -13,6 +12,11 @@ public partial class BigEndianStreamReader : EndianStreamReader
1312
/// </summary>
1413
public BigEndianStreamReader(BufferedStreamReader streamReader) : base(streamReader) { }
1514

15+
/// <summary>
16+
/// Constructs a <see cref="EndianStreamReader"/> given an existing stream reader.
17+
/// </summary>
18+
public BigEndianStreamReader(BufferedStreamReader streamReader, bool disposeUnderlyingStream = true) : base(streamReader, disposeUnderlyingStream) { }
19+
1620
/// <inheritdoc />
1721
[MethodImpl(MethodImplOptions.AggressiveInlining)]
1822
public override unsafe void Read<T>(out T value) => Reader.ReadBigEndianPrimitive(out value);

Source/Reloaded.Memory/Streams/Readers/EndianStreamReader.cs

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,11 @@ public abstract partial class EndianStreamReader : IDisposable
1515
/// </summary>
1616
public BufferedStreamReader Reader { get; private set; }
1717

18+
/// <summary>
19+
/// If this is set, the underlying stream will be disposed.
20+
/// </summary>
21+
public bool DisposeUnderlyingStream { get; private set; } = true;
22+
1823
/* Properties (Written as methods to force inlining). */
1924

2025
/// <summary>
@@ -50,6 +55,15 @@ public abstract partial class EndianStreamReader : IDisposable
5055
/// </summary>
5156
protected EndianStreamReader(BufferedStreamReader streamReader) => Reader = streamReader;
5257

58+
/// <summary>
59+
/// Constructs a <see cref="EndianStreamReader"/> given an existing stream reader.
60+
/// </summary>
61+
protected EndianStreamReader(BufferedStreamReader streamReader, bool disposeUnderlyingStream)
62+
{
63+
Reader = streamReader;
64+
DisposeUnderlyingStream = disposeUnderlyingStream;
65+
}
66+
5367
/// <summary/>
5468
~EndianStreamReader()
5569
{
@@ -59,7 +73,9 @@ public abstract partial class EndianStreamReader : IDisposable
5973
/// <inheritdoc/>
6074
public void Dispose()
6175
{
62-
Reader?.Dispose();
76+
if (DisposeUnderlyingStream)
77+
Reader?.Dispose();
78+
6379
GC.SuppressFinalize(this);
6480
}
6581

Source/Reloaded.Memory/Streams/Readers/LittleEndianStreamReader.cs

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
1-
using System.Diagnostics.CodeAnalysis;
2-
using System.Runtime.CompilerServices;
1+
using System.Runtime.CompilerServices;
32

43
namespace Reloaded.Memory.Streams.Readers
54
{
@@ -13,6 +12,11 @@ public partial class LittleEndianStreamReader : EndianStreamReader
1312
/// </summary>
1413
public LittleEndianStreamReader(BufferedStreamReader streamReader) : base(streamReader) { }
1514

15+
/// <summary>
16+
/// Constructs a <see cref="EndianStreamReader"/> given an existing stream reader.
17+
/// </summary>
18+
public LittleEndianStreamReader(BufferedStreamReader streamReader, bool disposeUnderlyingStream = true) : base(streamReader, disposeUnderlyingStream) { }
19+
1620
/// <inheritdoc />
1721
[MethodImpl(MethodImplOptions.AggressiveInlining)]
1822
public override unsafe void Read<T>(out T value) => Reader.Read(out value);

Source/Reloaded.Memory/Streams/Writers/BigEndianMemoryStream.cs

Lines changed: 4 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,5 @@
1-
using System;
2-
using System.Collections.Generic;
3-
using System.Diagnostics.CodeAnalysis;
4-
using System.IO;
1+
using System.IO;
52
using System.Runtime.CompilerServices;
6-
using System.Text;
7-
using Reloaded.Memory.Streams.Readers;
8-
using Reloaded.Memory.Utilities;
93

104
namespace Reloaded.Memory.Streams.Writers
115
{
@@ -17,6 +11,9 @@ public partial class BigEndianMemoryStream : EndianMemoryStream
1711
/// <inheritdoc />
1812
public BigEndianMemoryStream(ExtendedMemoryStream stream) : base(stream) {}
1913

14+
/// <inheritdoc />
15+
public BigEndianMemoryStream(ExtendedMemoryStream stream, bool disposeUnderlyingStream = true) : base(stream, disposeUnderlyingStream) { }
16+
2017
/// <inheritdoc />
2118
public override void Write<T>(T[] structure) => Stream.WriteBigEndianPrimitive(structure);
2219

Source/Reloaded.Memory/Streams/Writers/EndianMemoryStream.cs

Lines changed: 17 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,6 @@
11
using System;
2-
using System.Collections.Generic;
3-
using System.Diagnostics.CodeAnalysis;
42
using System.IO;
53
using System.Runtime.CompilerServices;
6-
using System.Text;
7-
using Reloaded.Memory.Utilities;
84

95
namespace Reloaded.Memory.Streams.Writers
106
{
@@ -18,11 +14,25 @@ public abstract partial class EndianMemoryStream : IDisposable
1814
/// </summary>
1915
public ExtendedMemoryStream Stream { get; private set; }
2016

17+
/// <summary>
18+
/// If this is set, the underlying stream will be disposed.
19+
/// </summary>
20+
public bool DisposeUnderlyingStream { get; private set; } = true;
21+
2122
/// <summary>
2223
/// Constructs a <see cref="EndianMemoryStream"/> given an existing stream.
2324
/// </summary>
2425
protected EndianMemoryStream(ExtendedMemoryStream stream) => Stream = stream;
2526

27+
/// <summary>
28+
/// Constructs a <see cref="EndianMemoryStream"/> given an existing stream.
29+
/// </summary>
30+
protected EndianMemoryStream(ExtendedMemoryStream stream, bool disposeUnderlyingStream)
31+
{
32+
Stream = stream;
33+
DisposeUnderlyingStream = disposeUnderlyingStream;
34+
}
35+
2636
/// <summary/>
2737
~EndianMemoryStream()
2838
{
@@ -32,7 +42,9 @@ public abstract partial class EndianMemoryStream : IDisposable
3242
/// <inheritdoc/>
3343
public void Dispose()
3444
{
35-
Stream?.Dispose();
45+
if (DisposeUnderlyingStream)
46+
Stream?.Dispose();
47+
3648
GC.SuppressFinalize(this);
3749
}
3850

Source/Reloaded.Memory/Streams/Writers/LittleEndianMemoryStream.cs

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,5 @@
1-
using System;
2-
using System.Collections.Generic;
3-
using System.Diagnostics.CodeAnalysis;
4-
using System.IO;
1+
using System.IO;
52
using System.Runtime.CompilerServices;
6-
using System.Text;
73

84
namespace Reloaded.Memory.Streams.Writers
95
{
@@ -15,6 +11,9 @@ public partial class LittleEndianMemoryStream : EndianMemoryStream
1511
/// <inheritdoc />
1612
public LittleEndianMemoryStream(ExtendedMemoryStream stream) : base(stream) { }
1713

14+
/// <inheritdoc />
15+
public LittleEndianMemoryStream(ExtendedMemoryStream stream, bool disposeUnderlyingStream = true) : base(stream, disposeUnderlyingStream) { }
16+
1817
/// <inheritdoc />
1918
public override void Write<T>(T[] structure) => Stream.Write(structure);
2019

0 commit comments

Comments
 (0)