private (int, ReadOnlyMemory <byte>) WriteMessageSize() { // Message size is written as protobuf base 128 varint. // https://developers.google.com/protocol-buffers/docs/encoding#varints int messageSize = _buffer.WrittenCount; int varint = messageSize; const int maxVarintSize = 5; Span <byte> buff = stackalloc byte[maxVarintSize]; const int base128Mask = 0x7F; const int highBit = 0x80; int varintLen = 0; while (true) { buff[varintLen] = (byte)(varint & base128Mask); varint >>= 7; if (varint == 0) { break; } buff[varintLen] |= highBit; ++varintLen; } ++varintLen; _buffer.Write(buff.Slice(0, varintLen)); return(messageSize, _buffer.WrittenMemory.Slice(messageSize, varintLen)); }
/// <inheritdoc/> void ICollection <T> .CopyTo(T[] array, int arrayIndex) => WrittenMemory.CopyTo(array.AsMemory(arrayIndex));