@@ -29,6 +29,9 @@ public ExpressionHasher()
2929 _initialSize = _buffer . Length ;
3030 }
3131
32+ internal int BufferSize => _buffer . Length ;
33+ internal int InitialBufferSize => _initialSize ;
34+
3235 public ExpressionHasher Add ( Expression expression )
3336 {
3437 Visit ( expression ) ;
@@ -50,8 +53,7 @@ public ExpressionHasher Add<T>(SortDefinition<T> sortDefinition)
5053
5154 public ExpressionHasher Add ( char c )
5255 {
53- Append ( c ) ;
54- Append ( ';' ) ;
56+ Append ( c , ';' ) ;
5557 return this ;
5658 }
5759
@@ -211,12 +213,10 @@ private void Append(int i)
211213 {
212214 int written ;
213215
214- while ( ! Utf8Formatter . TryFormat ( i , _buffer . AsSpan ( ) [ _start ..] , out written ) )
216+ var span = _buffer . AsSpan ( ) [ _start ..] ;
217+ while ( ! Utf8Formatter . TryFormat ( i , span , out written ) )
215218 {
216- var newBuffer = ArrayPool < byte > . Shared . Rent ( _buffer . Length * 2 ) ;
217- _buffer . AsSpan ( ) [ .._start ] . CopyTo ( newBuffer ) ;
218- ArrayPool < byte > . Shared . Return ( _buffer ) ;
219- _buffer = newBuffer ;
219+ span = ExpandRollingBufferCapacity ( _start ) ;
220220 }
221221
222222 _start += written ;
@@ -262,23 +262,17 @@ private void Append(char s)
262262 {
263263 if ( _start == _buffer . Length )
264264 {
265- var newBuffer = ArrayPool < byte > . Shared . Rent ( _buffer . Length * 2 ) ;
266- _buffer . AsSpan ( ) . CopyTo ( newBuffer ) ;
267- ArrayPool < byte > . Shared . Return ( _buffer ) ;
268- _buffer = newBuffer ;
265+ ExpandBufferCapacity ( ) ;
269266 }
270267
271268 _buffer [ _start ++ ] = ( byte ) s ;
272269 }
273270
274271 private void Append ( char a , char b )
275272 {
276- if ( _start + 1 = = _buffer . Length )
273+ if ( _start + 1 > = _buffer . Length )
277274 {
278- var newBuffer = ArrayPool < byte > . Shared . Rent ( _buffer . Length * 2 ) ;
279- _buffer . AsSpan ( ) . CopyTo ( newBuffer ) ;
280- ArrayPool < byte > . Shared . Return ( _buffer ) ;
281- _buffer = newBuffer ;
275+ ExpandBufferCapacity ( ) ;
282276 }
283277
284278 _buffer [ _start ++ ] = ( byte ) a ;
@@ -293,11 +287,7 @@ private void Append(string s)
293287
294288 while ( ! Encoding . UTF8 . TryGetBytes ( chars , span , out written ) )
295289 {
296- var newBuffer = ArrayPool < byte > . Shared . Rent ( _buffer . Length * 2 ) ;
297- _buffer . AsSpan ( ) [ .._start ] . CopyTo ( newBuffer ) ;
298- ArrayPool < byte > . Shared . Return ( _buffer ) ;
299- _buffer = newBuffer ;
300- span = _buffer . AsSpan ( ) [ _start ..] ;
290+ span = ExpandRollingBufferCapacity ( _start ) ;
301291 }
302292
303293 _start += written ;
@@ -310,11 +300,7 @@ private void Append(ReadOnlySpan<char> s)
310300
311301 while ( ! Encoding . UTF8 . TryGetBytes ( s , span , out written ) )
312302 {
313- var newBuffer = ArrayPool < byte > . Shared . Rent ( _buffer . Length * 2 ) ;
314- _buffer . AsSpan ( ) [ .._start ] . CopyTo ( newBuffer ) ;
315- ArrayPool < byte > . Shared . Return ( _buffer ) ;
316- _buffer = newBuffer ;
317- span = _buffer . AsSpan ( ) [ _start ..] ;
303+ span = ExpandRollingBufferCapacity ( _start ) ;
318304 }
319305
320306 _start += written ;
@@ -324,10 +310,7 @@ private void Append(byte b)
324310 {
325311 if ( _start == _buffer . Length )
326312 {
327- var newBuffer = ArrayPool < byte > . Shared . Rent ( _buffer . Length * 2 ) ;
328- _buffer . AsSpan ( ) . CopyTo ( newBuffer ) ;
329- ArrayPool < byte > . Shared . Return ( _buffer ) ;
330- _buffer = newBuffer ;
313+ ExpandBufferCapacity ( ) ;
331314 }
332315
333316 _buffer [ _start ++ ] = b ;
@@ -339,13 +322,26 @@ private void Append(ReadOnlySpan<byte> span)
339322
340323 while ( ! span . TryCopyTo ( bufferSpan ) )
341324 {
342- var newBuffer = ArrayPool < byte > . Shared . Rent ( _buffer . Length * 2 ) ;
343- _buffer . AsSpan ( ) [ .._start ] . CopyTo ( newBuffer ) ;
344- ArrayPool < byte > . Shared . Return ( _buffer ) ;
345- _buffer = newBuffer ;
346- bufferSpan = _buffer . AsSpan ( ) [ _start ..] ;
325+ bufferSpan = ExpandRollingBufferCapacity ( _start ) ;
347326 }
348327
349328 _start += span . Length ;
350329 }
330+
331+ private void ExpandBufferCapacity ( )
332+ {
333+ var newBuffer = ArrayPool < byte > . Shared . Rent ( _buffer . Length * 2 ) ;
334+ _buffer . AsSpan ( ) . CopyTo ( newBuffer ) ;
335+ ArrayPool < byte > . Shared . Return ( _buffer ) ;
336+ _buffer = newBuffer ;
337+ }
338+
339+ private Span < byte > ExpandRollingBufferCapacity ( int bufferIndex )
340+ {
341+ var newBuffer = ArrayPool < byte > . Shared . Rent ( _buffer . Length * 2 ) ;
342+ _buffer . AsSpan ( ) [ ..bufferIndex ] . CopyTo ( newBuffer ) ;
343+ ArrayPool < byte > . Shared . Return ( _buffer ) ;
344+ _buffer = newBuffer ;
345+ return _buffer . AsSpan ( ) [ bufferIndex ..] ;
346+ }
351347}
0 commit comments