private void WriteCommentMinimized(ReadOnlySpan <char> value) { Debug.Assert(value.Length < (int.MaxValue / JsonConstants.MaxExpansionFactorWhileTranscoding) - 4); // All ASCII, /*...*/ => escapedValue.Length + 4 // Optionally, up to 3x growth when transcoding int maxRequired = (value.Length * JsonConstants.MaxExpansionFactorWhileTranscoding) + 4; if (_memory.Length - BytesPending < maxRequired) { Grow(maxRequired); } Span <byte> output = _memory.Span; output[BytesPending++] = JsonConstants.Slash; output[BytesPending++] = JsonConstants.Asterisk; ReadOnlySpan <byte> byteSpan = MemoryMarshal.AsBytes(value); OperationStatus status = JsonWriterHelper.ToUtf8(byteSpan, output.Slice(BytesPending), out int _, out int written); Debug.Assert(status != OperationStatus.DestinationTooSmall); BytesPending += written; output[BytesPending++] = JsonConstants.Asterisk; output[BytesPending++] = JsonConstants.Slash; }
private void WriteStringValue(ReadOnlySpan <char> escapedValue, ref int idx) { if (_buffer.Length <= idx) { AdvanceAndGrow(ref idx); } _buffer[idx++] = JsonConstants.Quote; ReadOnlySpan <byte> byteSpan = MemoryMarshal.AsBytes(escapedValue); int partialConsumed = 0; while (true) { OperationStatus status = JsonWriterHelper.ToUtf8(byteSpan.Slice(partialConsumed), _buffer.Slice(idx), out int consumed, out int written); idx += written; if (status == OperationStatus.Done) { break; } partialConsumed += consumed; AdvanceAndGrow(ref idx); } if (_buffer.Length <= idx) { AdvanceAndGrow(ref idx); } _buffer[idx++] = JsonConstants.Quote; }
private int WritePropertyNameMinimized(ReadOnlySpan <char> escapedPropertyName) { int idx = 0; if (_currentDepth < 0) { if (_buffer.Length <= idx) { GrowAndEnsure(); } _buffer[idx++] = JsonConstants.ListSeparator; } if (_buffer.Length <= idx) { AdvanceAndGrow(ref idx); } _buffer[idx++] = JsonConstants.Quote; ReadOnlySpan <byte> byteSpan = MemoryMarshal.AsBytes(escapedPropertyName); int partialConsumed = 0; while (true) { OperationStatus status = JsonWriterHelper.ToUtf8(byteSpan.Slice(partialConsumed), _buffer.Slice(idx), out int consumed, out int written); idx += written; if (status == OperationStatus.Done) { break; } partialConsumed += consumed; AdvanceAndGrow(ref idx); } if (_buffer.Length <= idx) { AdvanceAndGrow(ref idx); } _buffer[idx++] = JsonConstants.Quote; if (_buffer.Length <= idx) { AdvanceAndGrow(ref idx); } _buffer[idx++] = JsonConstants.KeyValueSeperator; return(idx); }
private void WriteCommentIndented(ReadOnlySpan <char> value) { int indent = Indentation; Debug.Assert(indent <= 2 * JsonConstants.MaxWriterDepth); Debug.Assert(value.Length < (int.MaxValue / JsonConstants.MaxExpansionFactorWhileTranscoding) - indent - 4 - s_newLineLength); // All ASCII, /*...*/ => escapedValue.Length + 4 // Optionally, 1-2 bytes for new line, and up to 3x growth when transcoding int maxRequired = indent + (value.Length * JsonConstants.MaxExpansionFactorWhileTranscoding) + 4 + s_newLineLength; if (_memory.Length - BytesPending < maxRequired) { Grow(maxRequired); } Span <byte> output = _memory.Span; if (_tokenType != JsonTokenType.None) { WriteNewLine(output); } JsonWriterHelper.WriteIndentation(output.Slice(BytesPending), indent); BytesPending += indent; output[BytesPending++] = JsonConstants.Slash; output[BytesPending++] = JsonConstants.Asterisk; ReadOnlySpan <byte> byteSpan = MemoryMarshal.AsBytes(value); OperationStatus status = JsonWriterHelper.ToUtf8(byteSpan, output.Slice(BytesPending), out int _, out int written); Debug.Assert(status != OperationStatus.DestinationTooSmall); BytesPending += written; output[BytesPending++] = JsonConstants.Asterisk; output[BytesPending++] = JsonConstants.Slash; }
private int WritePropertyNameIndented(ReadOnlySpan <char> escapedPropertyName) { int idx = 0; if (_currentDepth < 0) { if (_buffer.Length <= idx) { GrowAndEnsure(); } _buffer[idx++] = JsonConstants.ListSeparator; } if (_tokenType != JsonTokenType.None) { WriteNewLine(ref idx); } int indent = Indentation; while (true) { bool result = JsonWriterHelper.TryWriteIndentation(_buffer.Slice(idx), indent, out int bytesWritten); idx += bytesWritten; if (result) { break; } indent -= bytesWritten; AdvanceAndGrow(ref idx); } if (_buffer.Length <= idx) { AdvanceAndGrow(ref idx); } _buffer[idx++] = JsonConstants.Quote; ReadOnlySpan <byte> byteSpan = MemoryMarshal.AsBytes(escapedPropertyName); int partialConsumed = 0; while (true) { OperationStatus status = JsonWriterHelper.ToUtf8(byteSpan.Slice(partialConsumed), _buffer.Slice(idx), out int consumed, out int written); idx += written; if (status == OperationStatus.Done) { break; } partialConsumed += consumed; AdvanceAndGrow(ref idx); } if (_buffer.Length <= idx) { AdvanceAndGrow(ref idx); } _buffer[idx++] = JsonConstants.Quote; if (_buffer.Length <= idx) { AdvanceAndGrow(ref idx); } _buffer[idx++] = JsonConstants.KeyValueSeperator; if (_buffer.Length <= idx) { AdvanceAndGrow(ref idx); } _buffer[idx++] = JsonConstants.Space; return(idx); }