@@ -75,7 +75,7 @@ public long FilePosition
7575 ArgumentOutOfRangeException . ThrowIfNegative ( value ) ;
7676
7777 if ( HasBufferedData )
78- throw new InvalidOperationException ( ) ;
78+ throw new InvalidOperationException ( ExceptionMessages . ReadBufferNotEmpty ) ;
7979
8080 fileOffset = value ;
8181 }
@@ -199,25 +199,32 @@ public ValueTask<bool> ReadAsync(CancellationToken token = default)
199199
200200 private ValueTask < int > ReadCoreAsync ( CancellationToken token )
201201 {
202- Memory < byte > buffer ;
202+ return PrepareReadBuffer ( out var readBuffer )
203+ ? RandomAccess . ReadAsync ( handle , readBuffer . Slice ( bufferEnd ) , fileOffset + bufferEnd , token )
204+ : ValueTask . FromException < int > ( new InternalBufferOverflowException ( ) ) ;
205+ }
206+
207+ private bool PrepareReadBuffer ( out Memory < byte > readBuffer )
208+ {
203209 switch ( bufferStart )
204210 {
205211 case 0 when bufferEnd == maxBufferSize :
206- return ValueTask . FromException < int > ( new InternalBufferOverflowException ( ) ) ;
212+ readBuffer = default ;
213+ return false ;
207214 case > 0 :
208- buffer = this . buffer . Memory ;
215+ readBuffer = buffer . Memory ;
209216
210217 // compact buffer
211- buffer [ bufferStart ..bufferEnd ] . CopyTo ( buffer ) ;
218+ readBuffer [ bufferStart ..bufferEnd ] . CopyTo ( readBuffer ) ;
212219 bufferEnd -= bufferStart ;
213220 bufferStart = 0 ;
214221 break ;
215222 default :
216- buffer = EnsureBufferAllocated ( ) . Memory ;
223+ readBuffer = EnsureBufferAllocated ( ) . Memory ;
217224 break ;
218225 }
219226
220- return RandomAccess . ReadAsync ( handle , buffer . Slice ( bufferEnd ) , fileOffset + bufferEnd , token ) ;
227+ return true ;
221228 }
222229
223230 /// <summary>
@@ -238,24 +245,10 @@ public bool Read()
238245
239246 private bool ReadCore ( )
240247 {
241- Span < byte > buffer ;
242- switch ( bufferStart )
243- {
244- case 0 when bufferEnd == maxBufferSize :
245- throw new InternalBufferOverflowException ( ) ;
246- case > 0 :
247- // compact buffer
248- buffer = this . buffer . Span ;
249- buffer [ bufferStart ..bufferEnd ] . CopyTo ( buffer ) ;
250- bufferEnd -= bufferStart ;
251- bufferStart = 0 ;
252- break ;
253- default :
254- buffer = EnsureBufferAllocated ( ) . Span ;
255- break ;
256- }
248+ if ( ! PrepareReadBuffer ( out var readBuffer ) )
249+ throw new InternalBufferOverflowException ( ) ;
257250
258- var count = RandomAccess . Read ( handle , buffer . Slice ( bufferEnd ) , fileOffset + bufferEnd ) ;
251+ var count = RandomAccess . Read ( handle , readBuffer . Span . Slice ( bufferEnd ) , fileOffset + bufferEnd ) ;
259252 bufferEnd += count ;
260253
261254 ResetIfNeeded ( ) ;
0 commit comments