using System; using System.Buffers; using System.IO; using System.Threading; using System.Threading.Tasks; namespace SharpCompress; public static class StreamExtensions { extension(Stream stream) { public void Skip(long advanceAmount) { if (stream.CanSeek) { stream.Position += advanceAmount; return; } using var readOnlySubStream = new IO.ReadOnlySubStream(stream, advanceAmount); readOnlySubStream.CopyTo(Stream.Null); } public void Skip() => stream.CopyTo(Stream.Null); public Task SkipAsync(CancellationToken cancellationToken = default) { cancellationToken.ThrowIfCancellationRequested(); #if NET8_0_OR_GREATER return stream.CopyToAsync(Stream.Null, cancellationToken); #else return stream.CopyToAsync(Stream.Null); #endif } internal int Read(Span buffer) { var temp = ArrayPool.Shared.Rent(buffer.Length); try { var read = stream.Read(temp, 0, buffer.Length); temp.AsSpan(0, read).CopyTo(buffer); return read; } finally { ArrayPool.Shared.Return(temp); } } internal void Write(ReadOnlySpan buffer) { var temp = ArrayPool.Shared.Rent(buffer.Length); buffer.CopyTo(temp); try { stream.Write(temp, 0, buffer.Length); } finally { ArrayPool.Shared.Return(temp); } } } }