|
|
|
@ -64,7 +64,7 @@ namespace Google.Protobuf |
|
|
|
|
public static unsafe void WriteFloat(ref Span<byte> buffer, ref WriterInternalState state, float value) |
|
|
|
|
{ |
|
|
|
|
const int length = sizeof(float); |
|
|
|
|
if (state.limit - state.position >= length) |
|
|
|
|
if (buffer.Length - state.position >= length) |
|
|
|
|
{ |
|
|
|
|
// if there's enough space in the buffer, write the float directly into the buffer |
|
|
|
|
var floatSpan = buffer.Slice(state.position, length); |
|
|
|
@ -78,19 +78,27 @@ namespace Google.Protobuf |
|
|
|
|
} |
|
|
|
|
else |
|
|
|
|
{ |
|
|
|
|
Span<byte> floatSpan = stackalloc byte[length]; |
|
|
|
|
Unsafe.WriteUnaligned(ref MemoryMarshal.GetReference(floatSpan), value); |
|
|
|
|
WriteFloatSlowPath(ref buffer, ref state, value); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if (!BitConverter.IsLittleEndian) |
|
|
|
|
{ |
|
|
|
|
floatSpan.Reverse(); |
|
|
|
|
} |
|
|
|
|
[MethodImpl(MethodImplOptions.NoInlining)] |
|
|
|
|
private static unsafe void WriteFloatSlowPath(ref Span<byte> buffer, ref WriterInternalState state, float value) |
|
|
|
|
{ |
|
|
|
|
const int length = sizeof(float); |
|
|
|
|
|
|
|
|
|
WriteRawByte(ref buffer, ref state, floatSpan[0]); |
|
|
|
|
WriteRawByte(ref buffer, ref state, floatSpan[1]); |
|
|
|
|
WriteRawByte(ref buffer, ref state, floatSpan[2]); |
|
|
|
|
WriteRawByte(ref buffer, ref state, floatSpan[3]); |
|
|
|
|
// TODO(jtattermusch): deduplicate the code. Populating the span is the same as for the fastpath. |
|
|
|
|
Span<byte> floatSpan = stackalloc byte[length]; |
|
|
|
|
Unsafe.WriteUnaligned(ref MemoryMarshal.GetReference(floatSpan), value); |
|
|
|
|
if (!BitConverter.IsLittleEndian) |
|
|
|
|
{ |
|
|
|
|
floatSpan.Reverse(); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
WriteRawByte(ref buffer, ref state, floatSpan[0]); |
|
|
|
|
WriteRawByte(ref buffer, ref state, floatSpan[1]); |
|
|
|
|
WriteRawByte(ref buffer, ref state, floatSpan[2]); |
|
|
|
|
WriteRawByte(ref buffer, ref state, floatSpan[3]); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/// <summary> |
|
|
|
|