Skip to content
This repository was archived by the owner on Aug 2, 2023. It is now read-only.
This repository was archived by the owner on Aug 2, 2023. It is now read-only.

API Proposal: BufferWriter<T> #2177

@KrzysztofCwalina

Description

@KrzysztofCwalina

The prototype of this type is in https://github.com/dotnet/corefxlab/tree/master/src/System.Buffers.ReaderWriter/System/Buffers/Writer

namespace System.Buffers.Writer {
    public ref struct BufferWriter<T> where T : IBufferWriter<byte> {

        public BufferWriter(T output);
        public ReadOnlySpan<byte> NewLine; 

        public Span<byte> Buffer { get; }
        public void Advance(int count);
        public void Ensure(int count=1);
        public void Flush();

        // primitive APIs will be available for:
        // byte, sbyte, ushort, short, uint, int, ulong, long, float, double, char, Utf8Char
        // DateTime, DateTimeOffset, TimeSpan, Guid, Uri, BigInteger, Decimal
        public void Write(int value);
        public void WriteLine(int value);
        public void Write(int value, StandardFormat format=default);
        public void WriteLine(int value, StandardFormat format=default);
        public void Write(int value, TransformationFormat format);
        public void WriteLine(int value, TransformationFormat format);

        // string APIs
        public void Write(string value);
        public void WriteLine(string value);
        public void Write(string value, TransformationFormat format);
        public void WriteLine(string value, TransformationFormat format);

        public void Write(ReadOnlySpan<char> value);
        public void WriteLine(ReadOnlySpan<char>  value);
        public void Write(ReadOnlySpan<char> value, TransformationFormat format);
        public void WriteLine(ReadOnlySpan<char> value, TransformationFormat format);

        public void Write(Utf8String value);
        public void WriteLine(Utf8String value);
        public void Write(Utf8String value, TransformationFormat format);
        public void WriteLine(Utf8String value, TransformationFormat format);

        public void Write(ReadOnlySpan<Utf8Char> value);
        public void WriteLine(ReadOnlySpan<Utf8Char>  value);
        public void Write(ReadOnlySpan<Utf8Char> value, TransformationFormat format);
        public void WriteLine(ReadOnlySpan<Utf8Char> value, TransformationFormat format);

        // writables
        public void Write<TWritable>(TWritable value) where TWritable : IWritable;
        public void WriteLine<TWritable>(TWritable value) where TWritable : IWritable;

        public void Write<TWritable>(TWritable value, StandardFormat format) where TWritable : IWritable;
        public void WriteLine<TWritable>(TWritable value, StandardFormat format) where TWritable : IWritable;

        public void Write<TWritable>(TWritable value, TransformationFormat format) where TWritable : IWritable;
        public void WriteLine<TWritable>(TWritable value, TransformationFormat format) where TWritable : IWritable;

        // buffers
        public void WriteBytes(ReadOnlySpan<byte> value);
        public void WriteBytes(ReadOnlySpan<byte> value, TransformationFormat format);

        // Binary write APIs will be available for:
        // byte, sbyte, ushort, short, uint, int, ulong, long, float, double
        // binary. format is L for Little Endian, and B for Big Endian.
        public void WriteBytes(int value, StandardFormat format=default);
        public void WriteBytes(int value, TransformationFormat format);
    }

    public struct TransformationFormat {
        public TransformationFormat(IBufferTransformation transformation);
        public TransformationFormat(params IBufferTransformation[] transformations);
        public StandardFormat Format { get; }
        public bool TryTransform(Span<byte> buffer, ref int written);
    }
}
namespace System.Buffers {
    public interface IWritable {
        bool TryWrite(Span<byte> buffer, out int written, StandardFormat format=default(StandardFormat));
    }
}
namespace System.Buffers.Operations {
    public interface IBufferOperation {
        OperationStatus Execute(ReadOnlySpan<byte> input, Span<byte> output, out int consumed, out int written);
    }
    public interface IBufferTransformation : IBufferOperation {
        OperationStatus Transform(Span<byte> buffer, int dataLength, out int written);
    }
}

cc: @davidfowl, @pakrym, @GrabYourPitchforks, @ahsonkhan, @joshfree, @terrajobst

Metadata

Metadata

Labels

OpenBeforeArchivingThese issues were open before the repo was archived. For re-open them, file them in the new repoarea-System.Buffers

Type

No type
No fields configured for issues without a type.

Projects

No projects

Relationships

None yet

Development

No branches or pull requests

Issue actions