Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -634,6 +634,7 @@
<Compile Include="$(MSBuildThisFileDirectory)System\Number.Rounding.cs" />
<Compile Include="$(MSBuildThisFileDirectory)System\Numerics\BFloat16.cs" />
<Compile Include="$(MSBuildThisFileDirectory)System\Numerics\BigIntegerCalculator.Shared.cs" />
<Compile Include="$(MSBuildThisFileDirectory)System\Numerics\BinaryIntegerWriter.cs" />
<Compile Include="$(MSBuildThisFileDirectory)System\Numerics\BitOperations.cs" />
<Compile Include="$(MSBuildThisFileDirectory)System\Numerics\Colors\Argb.cs" />
<Compile Include="$(MSBuildThisFileDirectory)System\Numerics\Colors\Argb.T.cs" />
Expand Down
18 changes: 18 additions & 0 deletions src/libraries/System.Private.CoreLib/src/System/Byte.cs
Original file line number Diff line number Diff line change
Expand Up @@ -396,6 +396,24 @@ bool IBinaryInteger<byte>.TryWriteLittleEndian(Span<byte> destination, out int b
}
}

/// <inheritdoc cref="IBinaryInteger{TSelf}.WriteBigEndian(byte[])" />
int IBinaryInteger<byte>.WriteBigEndian(byte[] destination) => BinaryIntegerWriter.WriteBigEndian(this, destination);

/// <inheritdoc cref="IBinaryInteger{TSelf}.WriteBigEndian(byte[], int)" />
int IBinaryInteger<byte>.WriteBigEndian(byte[] destination, int startIndex) => BinaryIntegerWriter.WriteBigEndian(this, destination.AsSpan(startIndex));

/// <inheritdoc cref="IBinaryInteger{TSelf}.WriteBigEndian(Span{byte})" />
int IBinaryInteger<byte>.WriteBigEndian(Span<byte> destination) => BinaryIntegerWriter.WriteBigEndian(this, destination);

/// <inheritdoc cref="IBinaryInteger{TSelf}.WriteLittleEndian(byte[])" />
int IBinaryInteger<byte>.WriteLittleEndian(byte[] destination) => BinaryIntegerWriter.WriteLittleEndian(this, destination);

/// <inheritdoc cref="IBinaryInteger{TSelf}.WriteLittleEndian(byte[], int)" />
int IBinaryInteger<byte>.WriteLittleEndian(byte[] destination, int startIndex) => BinaryIntegerWriter.WriteLittleEndian(this, destination.AsSpan(startIndex));

/// <inheritdoc cref="IBinaryInteger{TSelf}.WriteLittleEndian(Span{byte})" />
int IBinaryInteger<byte>.WriteLittleEndian(Span<byte> destination) => BinaryIntegerWriter.WriteLittleEndian(this, destination);

//
// IBinaryNumber
//
Expand Down
18 changes: 18 additions & 0 deletions src/libraries/System.Private.CoreLib/src/System/Char.cs
Original file line number Diff line number Diff line change
Expand Up @@ -1361,6 +1361,24 @@ bool IBinaryInteger<char>.TryWriteLittleEndian(Span<byte> destination, out int b
return false;
}

/// <inheritdoc cref="IBinaryInteger{TSelf}.WriteBigEndian(byte[])" />
int IBinaryInteger<char>.WriteBigEndian(byte[] destination) => BinaryIntegerWriter.WriteBigEndian(this, destination);

/// <inheritdoc cref="IBinaryInteger{TSelf}.WriteBigEndian(byte[], int)" />
int IBinaryInteger<char>.WriteBigEndian(byte[] destination, int startIndex) => BinaryIntegerWriter.WriteBigEndian(this, destination.AsSpan(startIndex));

/// <inheritdoc cref="IBinaryInteger{TSelf}.WriteBigEndian(Span{byte})" />
int IBinaryInteger<char>.WriteBigEndian(Span<byte> destination) => BinaryIntegerWriter.WriteBigEndian(this, destination);

/// <inheritdoc cref="IBinaryInteger{TSelf}.WriteLittleEndian(byte[])" />
int IBinaryInteger<char>.WriteLittleEndian(byte[] destination) => BinaryIntegerWriter.WriteLittleEndian(this, destination);

/// <inheritdoc cref="IBinaryInteger{TSelf}.WriteLittleEndian(byte[], int)" />
int IBinaryInteger<char>.WriteLittleEndian(byte[] destination, int startIndex) => BinaryIntegerWriter.WriteLittleEndian(this, destination.AsSpan(startIndex));

/// <inheritdoc cref="IBinaryInteger{TSelf}.WriteLittleEndian(Span{byte})" />
int IBinaryInteger<char>.WriteLittleEndian(Span<byte> destination) => BinaryIntegerWriter.WriteLittleEndian(this, destination);

//
// IBinaryNumber
//
Expand Down
18 changes: 18 additions & 0 deletions src/libraries/System.Private.CoreLib/src/System/Int128.cs
Original file line number Diff line number Diff line change
Expand Up @@ -947,6 +947,24 @@ bool IBinaryInteger<Int128>.TryWriteLittleEndian(Span<byte> destination, out int
return false;
}

/// <inheritdoc cref="IBinaryInteger{TSelf}.WriteBigEndian(byte[])" />
int IBinaryInteger<Int128>.WriteBigEndian(byte[] destination) => BinaryIntegerWriter.WriteBigEndian(this, destination);

/// <inheritdoc cref="IBinaryInteger{TSelf}.WriteBigEndian(byte[], int)" />
int IBinaryInteger<Int128>.WriteBigEndian(byte[] destination, int startIndex) => BinaryIntegerWriter.WriteBigEndian(this, destination.AsSpan(startIndex));

/// <inheritdoc cref="IBinaryInteger{TSelf}.WriteBigEndian(Span{byte})" />
int IBinaryInteger<Int128>.WriteBigEndian(Span<byte> destination) => BinaryIntegerWriter.WriteBigEndian(this, destination);

/// <inheritdoc cref="IBinaryInteger{TSelf}.WriteLittleEndian(byte[])" />
int IBinaryInteger<Int128>.WriteLittleEndian(byte[] destination) => BinaryIntegerWriter.WriteLittleEndian(this, destination);

/// <inheritdoc cref="IBinaryInteger{TSelf}.WriteLittleEndian(byte[], int)" />
int IBinaryInteger<Int128>.WriteLittleEndian(byte[] destination, int startIndex) => BinaryIntegerWriter.WriteLittleEndian(this, destination.AsSpan(startIndex));

/// <inheritdoc cref="IBinaryInteger{TSelf}.WriteLittleEndian(Span{byte})" />
int IBinaryInteger<Int128>.WriteLittleEndian(Span<byte> destination) => BinaryIntegerWriter.WriteLittleEndian(this, destination);

//
// IBinaryNumber
//
Expand Down
18 changes: 18 additions & 0 deletions src/libraries/System.Private.CoreLib/src/System/Int16.cs
Original file line number Diff line number Diff line change
Expand Up @@ -476,6 +476,24 @@ bool IBinaryInteger<short>.TryWriteLittleEndian(Span<byte> destination, out int
return false;
}

/// <inheritdoc cref="IBinaryInteger{TSelf}.WriteBigEndian(byte[])" />
int IBinaryInteger<short>.WriteBigEndian(byte[] destination) => BinaryIntegerWriter.WriteBigEndian(this, destination);

/// <inheritdoc cref="IBinaryInteger{TSelf}.WriteBigEndian(byte[], int)" />
int IBinaryInteger<short>.WriteBigEndian(byte[] destination, int startIndex) => BinaryIntegerWriter.WriteBigEndian(this, destination.AsSpan(startIndex));

/// <inheritdoc cref="IBinaryInteger{TSelf}.WriteBigEndian(Span{byte})" />
int IBinaryInteger<short>.WriteBigEndian(Span<byte> destination) => BinaryIntegerWriter.WriteBigEndian(this, destination);

/// <inheritdoc cref="IBinaryInteger{TSelf}.WriteLittleEndian(byte[])" />
int IBinaryInteger<short>.WriteLittleEndian(byte[] destination) => BinaryIntegerWriter.WriteLittleEndian(this, destination);

/// <inheritdoc cref="IBinaryInteger{TSelf}.WriteLittleEndian(byte[], int)" />
int IBinaryInteger<short>.WriteLittleEndian(byte[] destination, int startIndex) => BinaryIntegerWriter.WriteLittleEndian(this, destination.AsSpan(startIndex));

/// <inheritdoc cref="IBinaryInteger{TSelf}.WriteLittleEndian(Span{byte})" />
int IBinaryInteger<short>.WriteLittleEndian(Span<byte> destination) => BinaryIntegerWriter.WriteLittleEndian(this, destination);

//
// IBinaryNumber
//
Expand Down
18 changes: 18 additions & 0 deletions src/libraries/System.Private.CoreLib/src/System/Int32.cs
Original file line number Diff line number Diff line change
Expand Up @@ -516,6 +516,24 @@ bool IBinaryInteger<int>.TryWriteLittleEndian(Span<byte> destination, out int by
return false;
}

/// <inheritdoc cref="IBinaryInteger{TSelf}.WriteBigEndian(byte[])" />
int IBinaryInteger<int>.WriteBigEndian(byte[] destination) => BinaryIntegerWriter.WriteBigEndian(this, destination);

/// <inheritdoc cref="IBinaryInteger{TSelf}.WriteBigEndian(byte[], int)" />
int IBinaryInteger<int>.WriteBigEndian(byte[] destination, int startIndex) => BinaryIntegerWriter.WriteBigEndian(this, destination.AsSpan(startIndex));

/// <inheritdoc cref="IBinaryInteger{TSelf}.WriteBigEndian(Span{byte})" />
int IBinaryInteger<int>.WriteBigEndian(Span<byte> destination) => BinaryIntegerWriter.WriteBigEndian(this, destination);

/// <inheritdoc cref="IBinaryInteger{TSelf}.WriteLittleEndian(byte[])" />
int IBinaryInteger<int>.WriteLittleEndian(byte[] destination) => BinaryIntegerWriter.WriteLittleEndian(this, destination);

/// <inheritdoc cref="IBinaryInteger{TSelf}.WriteLittleEndian(byte[], int)" />
int IBinaryInteger<int>.WriteLittleEndian(byte[] destination, int startIndex) => BinaryIntegerWriter.WriteLittleEndian(this, destination.AsSpan(startIndex));

/// <inheritdoc cref="IBinaryInteger{TSelf}.WriteLittleEndian(Span{byte})" />
int IBinaryInteger<int>.WriteLittleEndian(Span<byte> destination) => BinaryIntegerWriter.WriteLittleEndian(this, destination);

//
// IBinaryNumber
//
Expand Down
18 changes: 18 additions & 0 deletions src/libraries/System.Private.CoreLib/src/System/Int64.cs
Original file line number Diff line number Diff line change
Expand Up @@ -513,6 +513,24 @@ bool IBinaryInteger<long>.TryWriteLittleEndian(Span<byte> destination, out int b
return false;
}

/// <inheritdoc cref="IBinaryInteger{TSelf}.WriteBigEndian(byte[])" />
int IBinaryInteger<long>.WriteBigEndian(byte[] destination) => BinaryIntegerWriter.WriteBigEndian(this, destination);

/// <inheritdoc cref="IBinaryInteger{TSelf}.WriteBigEndian(byte[], int)" />
int IBinaryInteger<long>.WriteBigEndian(byte[] destination, int startIndex) => BinaryIntegerWriter.WriteBigEndian(this, destination.AsSpan(startIndex));

/// <inheritdoc cref="IBinaryInteger{TSelf}.WriteBigEndian(Span{byte})" />
int IBinaryInteger<long>.WriteBigEndian(Span<byte> destination) => BinaryIntegerWriter.WriteBigEndian(this, destination);

/// <inheritdoc cref="IBinaryInteger{TSelf}.WriteLittleEndian(byte[])" />
int IBinaryInteger<long>.WriteLittleEndian(byte[] destination) => BinaryIntegerWriter.WriteLittleEndian(this, destination);

/// <inheritdoc cref="IBinaryInteger{TSelf}.WriteLittleEndian(byte[], int)" />
int IBinaryInteger<long>.WriteLittleEndian(byte[] destination, int startIndex) => BinaryIntegerWriter.WriteLittleEndian(this, destination.AsSpan(startIndex));

/// <inheritdoc cref="IBinaryInteger{TSelf}.WriteLittleEndian(Span{byte})" />
int IBinaryInteger<long>.WriteLittleEndian(Span<byte> destination) => BinaryIntegerWriter.WriteLittleEndian(this, destination);

//
// IBinaryNumber
//
Expand Down
18 changes: 18 additions & 0 deletions src/libraries/System.Private.CoreLib/src/System/IntPtr.cs
Original file line number Diff line number Diff line change
Expand Up @@ -546,6 +546,24 @@ bool IBinaryInteger<nint>.TryWriteLittleEndian(Span<byte> destination, out int b
return false;
}

/// <inheritdoc cref="IBinaryInteger{TSelf}.WriteBigEndian(byte[])" />
int IBinaryInteger<nint>.WriteBigEndian(byte[] destination) => BinaryIntegerWriter.WriteBigEndian(this, destination);

/// <inheritdoc cref="IBinaryInteger{TSelf}.WriteBigEndian(byte[], int)" />
int IBinaryInteger<nint>.WriteBigEndian(byte[] destination, int startIndex) => BinaryIntegerWriter.WriteBigEndian(this, destination.AsSpan(startIndex));

/// <inheritdoc cref="IBinaryInteger{TSelf}.WriteBigEndian(Span{byte})" />
int IBinaryInteger<nint>.WriteBigEndian(Span<byte> destination) => BinaryIntegerWriter.WriteBigEndian(this, destination);

/// <inheritdoc cref="IBinaryInteger{TSelf}.WriteLittleEndian(byte[])" />
int IBinaryInteger<nint>.WriteLittleEndian(byte[] destination) => BinaryIntegerWriter.WriteLittleEndian(this, destination);

/// <inheritdoc cref="IBinaryInteger{TSelf}.WriteLittleEndian(byte[], int)" />
int IBinaryInteger<nint>.WriteLittleEndian(byte[] destination, int startIndex) => BinaryIntegerWriter.WriteLittleEndian(this, destination.AsSpan(startIndex));

/// <inheritdoc cref="IBinaryInteger{TSelf}.WriteLittleEndian(Span{byte})" />
int IBinaryInteger<nint>.WriteLittleEndian(Span<byte> destination) => BinaryIntegerWriter.WriteLittleEndian(this, destination);

//
// IBinaryNumber
//
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.

namespace System.Numerics
{
/// <summary>Implements the throwing <see cref="IBinaryInteger{TSelf}" /> write methods for types that implement them explicitly.</summary>
/// <remarks>
/// Calling a default interface implementation on a value type boxes it unless the JIT removes the box,
/// so value types implement the methods explicitly and forward here, where the call to the
/// <c>TryWrite</c> method is constrained and does not box.
/// </remarks>
internal static class BinaryIntegerWriter
{
public static int WriteBigEndian<TSelf>(TSelf value, Span<byte> destination)
where TSelf : IBinaryInteger<TSelf>
{
if (!value.TryWriteBigEndian(destination, out int bytesWritten))
{
ThrowHelper.ThrowArgumentException_DestinationTooShort();
}
return bytesWritten;
}

public static int WriteLittleEndian<TSelf>(TSelf value, Span<byte> destination)
where TSelf : IBinaryInteger<TSelf>
{
if (!value.TryWriteLittleEndian(destination, out int bytesWritten))
{
ThrowHelper.ThrowArgumentException_DestinationTooShort();
}
return bytesWritten;
}
}
}
18 changes: 18 additions & 0 deletions src/libraries/System.Private.CoreLib/src/System/SByte.cs
Original file line number Diff line number Diff line change
Expand Up @@ -455,6 +455,24 @@ bool IBinaryInteger<sbyte>.TryWriteLittleEndian(Span<byte> destination, out int
return false;
}

/// <inheritdoc cref="IBinaryInteger{TSelf}.WriteBigEndian(byte[])" />
int IBinaryInteger<sbyte>.WriteBigEndian(byte[] destination) => BinaryIntegerWriter.WriteBigEndian(this, destination);

/// <inheritdoc cref="IBinaryInteger{TSelf}.WriteBigEndian(byte[], int)" />
int IBinaryInteger<sbyte>.WriteBigEndian(byte[] destination, int startIndex) => BinaryIntegerWriter.WriteBigEndian(this, destination.AsSpan(startIndex));

/// <inheritdoc cref="IBinaryInteger{TSelf}.WriteBigEndian(Span{byte})" />
int IBinaryInteger<sbyte>.WriteBigEndian(Span<byte> destination) => BinaryIntegerWriter.WriteBigEndian(this, destination);

/// <inheritdoc cref="IBinaryInteger{TSelf}.WriteLittleEndian(byte[])" />
int IBinaryInteger<sbyte>.WriteLittleEndian(byte[] destination) => BinaryIntegerWriter.WriteLittleEndian(this, destination);

/// <inheritdoc cref="IBinaryInteger{TSelf}.WriteLittleEndian(byte[], int)" />
int IBinaryInteger<sbyte>.WriteLittleEndian(byte[] destination, int startIndex) => BinaryIntegerWriter.WriteLittleEndian(this, destination.AsSpan(startIndex));

/// <inheritdoc cref="IBinaryInteger{TSelf}.WriteLittleEndian(Span{byte})" />
int IBinaryInteger<sbyte>.WriteLittleEndian(Span<byte> destination) => BinaryIntegerWriter.WriteLittleEndian(this, destination);

//
// IBinaryNumber
//
Expand Down
18 changes: 18 additions & 0 deletions src/libraries/System.Private.CoreLib/src/System/UInt128.cs
Original file line number Diff line number Diff line change
Expand Up @@ -1234,6 +1234,24 @@ bool IBinaryInteger<UInt128>.TryWriteLittleEndian(Span<byte> destination, out in
return false;
}

/// <inheritdoc cref="IBinaryInteger{TSelf}.WriteBigEndian(byte[])" />
int IBinaryInteger<UInt128>.WriteBigEndian(byte[] destination) => BinaryIntegerWriter.WriteBigEndian(this, destination);

/// <inheritdoc cref="IBinaryInteger{TSelf}.WriteBigEndian(byte[], int)" />
int IBinaryInteger<UInt128>.WriteBigEndian(byte[] destination, int startIndex) => BinaryIntegerWriter.WriteBigEndian(this, destination.AsSpan(startIndex));

/// <inheritdoc cref="IBinaryInteger{TSelf}.WriteBigEndian(Span{byte})" />
int IBinaryInteger<UInt128>.WriteBigEndian(Span<byte> destination) => BinaryIntegerWriter.WriteBigEndian(this, destination);

/// <inheritdoc cref="IBinaryInteger{TSelf}.WriteLittleEndian(byte[])" />
int IBinaryInteger<UInt128>.WriteLittleEndian(byte[] destination) => BinaryIntegerWriter.WriteLittleEndian(this, destination);

/// <inheritdoc cref="IBinaryInteger{TSelf}.WriteLittleEndian(byte[], int)" />
int IBinaryInteger<UInt128>.WriteLittleEndian(byte[] destination, int startIndex) => BinaryIntegerWriter.WriteLittleEndian(this, destination.AsSpan(startIndex));

/// <inheritdoc cref="IBinaryInteger{TSelf}.WriteLittleEndian(Span{byte})" />
int IBinaryInteger<UInt128>.WriteLittleEndian(Span<byte> destination) => BinaryIntegerWriter.WriteLittleEndian(this, destination);

//
// IBinaryNumber
//
Expand Down
18 changes: 18 additions & 0 deletions src/libraries/System.Private.CoreLib/src/System/UInt16.cs
Original file line number Diff line number Diff line change
Expand Up @@ -401,6 +401,24 @@ bool IBinaryInteger<ushort>.TryWriteLittleEndian(Span<byte> destination, out int
return false;
}

/// <inheritdoc cref="IBinaryInteger{TSelf}.WriteBigEndian(byte[])" />
int IBinaryInteger<ushort>.WriteBigEndian(byte[] destination) => BinaryIntegerWriter.WriteBigEndian(this, destination);

/// <inheritdoc cref="IBinaryInteger{TSelf}.WriteBigEndian(byte[], int)" />
int IBinaryInteger<ushort>.WriteBigEndian(byte[] destination, int startIndex) => BinaryIntegerWriter.WriteBigEndian(this, destination.AsSpan(startIndex));

/// <inheritdoc cref="IBinaryInteger{TSelf}.WriteBigEndian(Span{byte})" />
int IBinaryInteger<ushort>.WriteBigEndian(Span<byte> destination) => BinaryIntegerWriter.WriteBigEndian(this, destination);

/// <inheritdoc cref="IBinaryInteger{TSelf}.WriteLittleEndian(byte[])" />
int IBinaryInteger<ushort>.WriteLittleEndian(byte[] destination) => BinaryIntegerWriter.WriteLittleEndian(this, destination);

/// <inheritdoc cref="IBinaryInteger{TSelf}.WriteLittleEndian(byte[], int)" />
int IBinaryInteger<ushort>.WriteLittleEndian(byte[] destination, int startIndex) => BinaryIntegerWriter.WriteLittleEndian(this, destination.AsSpan(startIndex));

/// <inheritdoc cref="IBinaryInteger{TSelf}.WriteLittleEndian(Span{byte})" />
int IBinaryInteger<ushort>.WriteLittleEndian(Span<byte> destination) => BinaryIntegerWriter.WriteLittleEndian(this, destination);

//
// IBinaryNumber
//
Expand Down
18 changes: 18 additions & 0 deletions src/libraries/System.Private.CoreLib/src/System/UInt32.cs
Original file line number Diff line number Diff line change
Expand Up @@ -465,6 +465,24 @@ bool IBinaryInteger<uint>.TryWriteLittleEndian(Span<byte> destination, out int b
return false;
}

/// <inheritdoc cref="IBinaryInteger{TSelf}.WriteBigEndian(byte[])" />
int IBinaryInteger<uint>.WriteBigEndian(byte[] destination) => BinaryIntegerWriter.WriteBigEndian(this, destination);

/// <inheritdoc cref="IBinaryInteger{TSelf}.WriteBigEndian(byte[], int)" />
int IBinaryInteger<uint>.WriteBigEndian(byte[] destination, int startIndex) => BinaryIntegerWriter.WriteBigEndian(this, destination.AsSpan(startIndex));

/// <inheritdoc cref="IBinaryInteger{TSelf}.WriteBigEndian(Span{byte})" />
int IBinaryInteger<uint>.WriteBigEndian(Span<byte> destination) => BinaryIntegerWriter.WriteBigEndian(this, destination);

/// <inheritdoc cref="IBinaryInteger{TSelf}.WriteLittleEndian(byte[])" />
int IBinaryInteger<uint>.WriteLittleEndian(byte[] destination) => BinaryIntegerWriter.WriteLittleEndian(this, destination);

/// <inheritdoc cref="IBinaryInteger{TSelf}.WriteLittleEndian(byte[], int)" />
int IBinaryInteger<uint>.WriteLittleEndian(byte[] destination, int startIndex) => BinaryIntegerWriter.WriteLittleEndian(this, destination.AsSpan(startIndex));

/// <inheritdoc cref="IBinaryInteger{TSelf}.WriteLittleEndian(Span{byte})" />
int IBinaryInteger<uint>.WriteLittleEndian(Span<byte> destination) => BinaryIntegerWriter.WriteLittleEndian(this, destination);

//
// IBinaryNumber
//
Expand Down
Loading
Loading