66
77namespace Kaitai . Async
88{
9- internal class PipeReaderContext : IReaderContext
9+ public class PipeReaderContext : IReaderContext
1010 {
11- private readonly PipeReader _pipeReader ;
12- private ReadResult _readResult ;
11+ protected readonly PipeReader PipeReader ;
12+ protected ReadResult ReadResult ;
1313
1414 public PipeReaderContext ( PipeReader pipeReader )
1515 {
16- _pipeReader = pipeReader ;
16+ PipeReader = pipeReader ;
1717 }
1818
19- private long RemainingBytesInReadResult => _readResult . Buffer . Length - Position ;
19+ protected long RemainingBytesInReadResult => ReadResult . Buffer . Length - Position ;
2020
21- public long Position { get ; private set ; }
21+ public long Position { get ; protected set ; }
2222
23- public async ValueTask < long > GetSizeAsync ( )
23+ public virtual async ValueTask < long > GetSizeAsync ( )
2424 {
2525 await FillReadResultBufferToTheEnd ( ) ;
2626
27- return _readResult . Buffer . Length ;
27+ return ReadResult . Buffer . Length ;
2828 }
2929
30- public async ValueTask < bool > IsEofAsync ( )
30+ public virtual async ValueTask < bool > IsEofAsync ( )
3131 {
3232 await EnsureReadResultIsNotDefault ( ) ;
3333
34- if ( Position >= _readResult . Buffer . Length && ! _readResult . IsCompleted )
34+ if ( Position >= ReadResult . Buffer . Length && ! ReadResult . IsCompleted )
3535 {
36- _pipeReader . AdvanceTo ( _readResult . Buffer . Start , _readResult . Buffer . GetPosition ( Position ) ) ;
37- _readResult = await _pipeReader . ReadAsync ( ) ;
36+ PipeReader . AdvanceTo ( ReadResult . Buffer . Start , ReadResult . Buffer . GetPosition ( Position ) ) ;
37+ ReadResult = await PipeReader . ReadAsync ( ) ;
3838 }
3939
40- return Position >= _readResult . Buffer . Length && _readResult . IsCompleted ;
40+ return Position >= ReadResult . Buffer . Length && ReadResult . IsCompleted ;
4141 }
4242
4343
44- public async ValueTask SeekAsync ( long position )
44+ public virtual async ValueTask SeekAsync ( long position )
4545 {
4646 if ( position <= Position )
4747 {
@@ -51,49 +51,49 @@ public async ValueTask SeekAsync(long position)
5151 {
5252 await EnsureReadResultIsNotDefault ( ) ;
5353
54- while ( _readResult . Buffer . Length < position && ! _readResult . IsCompleted )
54+ while ( ReadResult . Buffer . Length < position && ! ReadResult . IsCompleted )
5555 {
56- _pipeReader . AdvanceTo ( _readResult . Buffer . Start , _readResult . Buffer . End ) ;
57- _readResult = await _pipeReader . ReadAsync ( ) ;
56+ PipeReader . AdvanceTo ( ReadResult . Buffer . Start , ReadResult . Buffer . End ) ;
57+ ReadResult = await PipeReader . ReadAsync ( ) ;
5858 }
5959
60- if ( _readResult . Buffer . Length <= position )
60+ if ( ReadResult . Buffer . Length <= position )
6161 {
6262 Position = position ;
6363 return ;
6464 }
6565
66- if ( _readResult . IsCompleted )
66+ if ( ReadResult . IsCompleted )
6767 {
6868 throw new EndOfStreamException (
6969 $ "requested { position } bytes, but got only { RemainingBytesInReadResult } bytes") ;
7070 }
7171 }
7272 }
7373
74- public async ValueTask < byte > ReadByteAsync ( )
74+ public virtual async ValueTask < byte > ReadByteAsync ( )
7575 {
7676 await EnsureReadResultIsNotDefault ( ) ;
7777
7878 var value = byte . MinValue ;
79- while ( ! TryReadByte ( out value ) && ! _readResult . IsCompleted )
79+ while ( ! TryReadByte ( out value ) && ! ReadResult . IsCompleted )
8080 {
81- _pipeReader . AdvanceTo ( _readResult . Buffer . Start , _readResult . Buffer . GetPosition ( Position ) ) ;
82- _readResult = await _pipeReader . ReadAsync ( ) ;
81+ PipeReader . AdvanceTo ( ReadResult . Buffer . Start , ReadResult . Buffer . GetPosition ( Position ) ) ;
82+ ReadResult = await PipeReader . ReadAsync ( ) ;
8383 }
8484
8585 Position += 1 ;
8686 return value ;
8787
8888 bool TryReadByte ( out byte readValue )
8989 {
90- var sequenceReader = new SequenceReader < byte > ( _readResult . Buffer ) ;
90+ var sequenceReader = new SequenceReader < byte > ( ReadResult . Buffer ) ;
9191 sequenceReader . Advance ( Position ) ;
9292 return sequenceReader . TryRead ( out readValue ) ;
9393 }
9494 }
9595
96- public async ValueTask < byte [ ] > ReadBytesAsync ( long count )
96+ public virtual async ValueTask < byte [ ] > ReadBytesAsync ( long count )
9797 {
9898 if ( count < 0 || count > int . MaxValue )
9999 {
@@ -107,14 +107,14 @@ public async ValueTask<byte[]> ReadBytesAsync(long count)
107107
108108 while ( ! TryRead ( out value , count ) )
109109 {
110- if ( _readResult . IsCompleted )
110+ if ( ReadResult . IsCompleted )
111111 {
112112 throw new EndOfStreamException (
113113 $ "requested { count } bytes, but got only { RemainingBytesInReadResult } bytes") ;
114114 }
115115
116- _pipeReader . AdvanceTo ( _readResult . Buffer . Start , _readResult . Buffer . GetPosition ( Position ) ) ;
117- _readResult = await _pipeReader . ReadAsync ( ) ;
116+ PipeReader . AdvanceTo ( ReadResult . Buffer . Start , ReadResult . Buffer . GetPosition ( Position ) ) ;
117+ ReadResult = await PipeReader . ReadAsync ( ) ;
118118 }
119119
120120 Position += count ;
@@ -128,7 +128,7 @@ bool TryRead(out byte[] readBytes, long readBytesCount)
128128 return false ;
129129 }
130130
131- readBytes = _readResult . Buffer . Slice ( Position , readBytesCount ) . ToArray ( ) ;
131+ readBytes = ReadResult . Buffer . Slice ( Position , readBytesCount ) . ToArray ( ) ;
132132 return true ;
133133 }
134134 }
@@ -137,8 +137,8 @@ public virtual async ValueTask<byte[]> ReadBytesFullAsync()
137137 {
138138 await FillReadResultBufferToTheEnd ( ) ;
139139
140- _pipeReader . AdvanceTo ( _readResult . Buffer . Start , _readResult . Buffer . End ) ;
141- var value = _readResult . Buffer . Slice ( Position , _readResult . Buffer . End ) . ToArray ( ) ;
140+ PipeReader . AdvanceTo ( ReadResult . Buffer . Start , ReadResult . Buffer . End ) ;
141+ var value = ReadResult . Buffer . Slice ( Position , ReadResult . Buffer . End ) . ToArray ( ) ;
142142 Position += value . Length ;
143143 return value ;
144144 }
@@ -147,18 +147,18 @@ private async ValueTask FillReadResultBufferToTheEnd()
147147 {
148148 await EnsureReadResultIsNotDefault ( ) ;
149149
150- while ( ! _readResult . IsCompleted )
150+ while ( ! ReadResult . IsCompleted )
151151 {
152- _pipeReader . AdvanceTo ( _readResult . Buffer . Start , _readResult . Buffer . End ) ;
153- _readResult = await _pipeReader . ReadAsync ( ) ;
152+ PipeReader . AdvanceTo ( ReadResult . Buffer . Start , ReadResult . Buffer . End ) ;
153+ ReadResult = await PipeReader . ReadAsync ( ) ;
154154 }
155155 }
156156
157157 private async ValueTask EnsureReadResultIsNotDefault ( )
158158 {
159- if ( _readResult . Equals ( default ( ReadResult ) ) )
159+ if ( ReadResult . Equals ( default ( ReadResult ) ) )
160160 {
161- _readResult = await _pipeReader . ReadAsync ( ) ;
161+ ReadResult = await PipeReader . ReadAsync ( ) ;
162162 }
163163 }
164164 }
0 commit comments