@@ -87,6 +87,33 @@ public int Read(byte[] buffer, int offset, int count)
8787 var dataLength = ReadFromInputBuffer ( buffer , offset , count ) ;
8888 return dataLength ;
8989 }
90+
91+ public int Read ( Span < byte > buffer , int offset , int count )
92+ {
93+ if ( _inputBuffer . Count < count ) {
94+ var readBuffer = _readBuffer ;
95+ int read ;
96+ try {
97+ read = _dataProvider . Read ( readBuffer , 0 , readBuffer . Length ) ;
98+ }
99+ catch ( IOException ) {
100+ IOFailed = true ;
101+ throw ;
102+ }
103+ if ( read != 0 ) {
104+ if ( _decryptor != null ) {
105+ _decryptor . ProcessBytes ( readBuffer , 0 , read , readBuffer , 0 ) ;
106+ }
107+ if ( _decompressor != null ) {
108+ read = HandleDecompression ( readBuffer , read ) ;
109+ readBuffer = _compressionBuffer ;
110+ }
111+ WriteToInputBuffer ( readBuffer , read ) ;
112+ }
113+ }
114+ var dataLength = ReadFromInputBuffer ( buffer , offset , count ) ;
115+ return dataLength ;
116+ }
90117 public async ValueTask < int > ReadAsync ( byte [ ] buffer , int offset , int count , CancellationToken cancellationToken = default )
91118 {
92119 if ( _inputBuffer . Count < count )
@@ -120,6 +147,24 @@ public async ValueTask<int> ReadAsync(byte[] buffer, int offset, int count, Canc
120147 return dataLength ;
121148 }
122149
150+ public async ValueTask < int > ReadAsync ( Memory < byte > buffer , int offset , int count , CancellationToken cancellationToken = default )
151+ {
152+ var rented = new byte [ count ] ;
153+ try
154+ {
155+ var read = await ReadAsync ( rented , 0 , count , cancellationToken ) . ConfigureAwait ( false ) ;
156+ rented . AsSpan ( 0 , read ) . CopyTo ( buffer . Span . Slice ( offset , read ) ) ;
157+ return read ;
158+ }
159+ finally { }
160+ }
161+
162+ public void Write ( ReadOnlySpan < byte > buffer )
163+ {
164+ foreach ( var b in buffer )
165+ _outputBuffer . Enqueue ( b ) ;
166+ }
167+
123168 public void Write ( byte [ ] buffer , int offset , int count )
124169 {
125170 for ( var i = 0 ; i < count ; i ++ )
@@ -132,6 +177,14 @@ public ValueTask WriteAsync(byte[] buffer, int offset, int count, CancellationTo
132177 return ValueTask . CompletedTask ;
133178 }
134179
180+ public ValueTask WriteAsync ( ReadOnlyMemory < byte > buffer , int offset , int count , CancellationToken cancellationToken = default )
181+ {
182+ var span = buffer . Span . Slice ( offset , count ) ;
183+ foreach ( var b in span )
184+ _outputBuffer . Enqueue ( b ) ;
185+ return ValueTask2 . CompletedTask ;
186+ }
187+
135188 public void Flush ( )
136189 {
137190 var buffer = _outputBuffer . ToArray ( ) ;
@@ -206,6 +259,15 @@ int ReadFromInputBuffer(byte[] buffer, int offset, int count)
206259 return read ;
207260 }
208261
262+ int ReadFromInputBuffer ( Span < byte > buffer , int offset , int count )
263+ {
264+ var read = Math . Min ( count , _inputBuffer . Count ) ;
265+ for ( var i = 0 ; i < read ; i ++ ) {
266+ buffer [ offset + i ] = _inputBuffer . Dequeue ( ) ;
267+ }
268+ return read ;
269+ }
270+
209271 void WriteToInputBuffer ( byte [ ] data , int count )
210272 {
211273 for ( var i = 0 ; i < count ; i ++ )
0 commit comments