Implement internal ISpanFormattable on {U}IntPtr (#44496)
authorStephen Toub <stoub@microsoft.com>
Wed, 11 Nov 2020 03:33:05 +0000 (22:33 -0500)
committerGitHub <noreply@github.com>
Wed, 11 Nov 2020 03:33:05 +0000 (19:33 -0800)
Allows nint and nuint to participate in the same optimizations in string building / formatting as do the other primitives.

src/libraries/System.Private.CoreLib/src/System/IntPtr.cs
src/libraries/System.Private.CoreLib/src/System/UIntPtr.cs

index c1a9fb8..42ce73f 100644 (file)
@@ -20,7 +20,7 @@ namespace System
     [Serializable]
     [StructLayout(LayoutKind.Sequential)]
     [System.Runtime.CompilerServices.TypeForwardedFrom("mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089")]
-    public readonly struct IntPtr : IEquatable<IntPtr>, IComparable, IComparable<IntPtr>, IFormattable, ISerializable
+    public readonly struct IntPtr : IEquatable<IntPtr>, IComparable, IComparable<IntPtr>, IFormattable, ISpanFormattable, ISerializable
     {
         // WARNING: We allow diagnostic tools to directly inspect this member (_value).
         // See https://github.com/dotnet/corert/blob/master/Documentation/design-docs/diagnostics/diagnostics-tools-contract.md for more details.
@@ -207,6 +207,9 @@ namespace System
         public unsafe string ToString(IFormatProvider? provider) => ((nint_t)_value).ToString(provider);
         public unsafe string ToString(string? format, IFormatProvider? provider) => ((nint_t)_value).ToString(format, provider);
 
+        unsafe bool ISpanFormattable.TryFormat(Span<char> destination, out int charsWritten, ReadOnlySpan<char> format, IFormatProvider? provider) =>
+            ((nint_t)_value).TryFormat(destination, out charsWritten, format, provider);
+
         public static IntPtr Parse(string s) => (IntPtr)nint_t.Parse(s);
         public static IntPtr Parse(string s, NumberStyles style) => (IntPtr)nint_t.Parse(s, style);
         public static IntPtr Parse(string s, IFormatProvider? provider) => (IntPtr)nint_t.Parse(s, provider);
index 9654032..28d95bf 100644 (file)
@@ -21,7 +21,7 @@ namespace System
     [CLSCompliant(false)]
     [StructLayout(LayoutKind.Sequential)]
     [System.Runtime.CompilerServices.TypeForwardedFrom("mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089")]
-    public readonly struct UIntPtr : IEquatable<UIntPtr>, IComparable, IComparable<UIntPtr>, IFormattable, ISerializable
+    public readonly struct UIntPtr : IEquatable<UIntPtr>, IComparable, IComparable<UIntPtr>, IFormattable, ISpanFormattable, ISerializable
     {
         private readonly unsafe void* _value; // Do not rename (binary serialization)
 
@@ -199,6 +199,9 @@ namespace System
         public unsafe string ToString(IFormatProvider? provider) => ((nuint_t)_value).ToString(provider);
         public unsafe string ToString(string? format, IFormatProvider? provider) => ((nuint_t)_value).ToString(format, provider);
 
+        unsafe bool ISpanFormattable.TryFormat(Span<char> destination, out int charsWritten, ReadOnlySpan<char> format, IFormatProvider? provider) =>
+            ((nuint_t)_value).TryFormat(destination, out charsWritten, format, provider);
+
         public static UIntPtr Parse(string s) => (UIntPtr)nuint_t.Parse(s);
         public static UIntPtr Parse(string s, NumberStyles style) => (UIntPtr)nuint_t.Parse(s, style);
         public static UIntPtr Parse(string s, IFormatProvider? provider) => (UIntPtr)nuint_t.Parse(s, provider);