Skip to content

Commit

Permalink
Ensure the generic math interfaces are implemented implicitly where p…
Browse files Browse the repository at this point in the history
…ossible (#66748)

* Updating generic math interfaces to be implicitly implemented where possible

* Resolve a build error in OdbcConnection caused by new Parse APIs

* Revert "Resolve a build error in OdbcConnection caused by new Parse APIs"

This reverts commit 6fd7ec7.

* Suppress CA1846 for System.Data.Odbc

* Updating the xml doc comments for exposed constants
  • Loading branch information
tannergooding authored Mar 17, 2022
1 parent a1bc0f3 commit 7f2cdc5
Show file tree
Hide file tree
Showing 23 changed files with 3,292 additions and 4,067 deletions.
2 changes: 1 addition & 1 deletion src/libraries/System.Data.Odbc/src/System.Data.Odbc.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
<PropertyGroup>
<AllowUnsafeBlocks>true</AllowUnsafeBlocks>
<TargetFrameworks>$(NetCoreAppCurrent)-windows;$(NetCoreAppCurrent)-FreeBSD;$(NetCoreAppCurrent)-illumos;$(NetCoreAppCurrent)-Solaris;$(NetCoreAppCurrent)-Linux;$(NetCoreAppCurrent)-OSX;$(NetCoreAppCurrent)-iOS;$(NetCoreAppCurrent)-tvOS;$(NetCoreAppCurrent);$(NetCoreAppMinimum)-windows;$(NetCoreAppMinimum)-FreeBSD;$(NetCoreAppMinimum)-Linux;$(NetCoreAppMinimum)-OSX;$(NetCoreAppMinimum);netstandard2.0;$(NetFrameworkMinimum)</TargetFrameworks>
<NoWarn>$(NoWarn);CA2249;CA1838</NoWarn>
<NoWarn>$(NoWarn);CA2249;CA1838;CA1846</NoWarn>
<!-- Suppress CA1845: Use span-based 'string.Concat' and 'AsSpan' instead of 'Substring' to avoid ifdefs. -->
<NoWarn>$(NoWarn);CA1845</NoWarn>
<Nullable>enable</Nullable>
Expand Down
244 changes: 126 additions & 118 deletions src/libraries/System.Private.CoreLib/src/System/Byte.cs

Large diffs are not rendered by default.

233 changes: 120 additions & 113 deletions src/libraries/System.Private.CoreLib/src/System/Char.cs

Large diffs are not rendered by default.

54 changes: 12 additions & 42 deletions src/libraries/System.Private.CoreLib/src/System/DateOnly.cs
Original file line number Diff line number Diff line change
Expand Up @@ -163,6 +163,7 @@ public DateOnly AddDays(int value)
/// <param name="left">The first object to compare.</param>
/// <param name="right">The second object to compare.</param>
/// <returns>true if left is later than right; otherwise, false.</returns>
/// <inheritdoc cref="IComparisonOperators{TSelf, TOther}.op_GreaterThan(TSelf, TOther)" />
public static bool operator >(DateOnly left, DateOnly right) => left._dayNumber > right._dayNumber;

/// <summary>
Expand All @@ -171,6 +172,7 @@ public DateOnly AddDays(int value)
/// <param name="left">The first object to compare.</param>
/// <param name="right">The second object to compare.</param>
/// <returns>true if left is the same as or later than right; otherwise, false.</returns>
/// <inheritdoc cref="IComparisonOperators{TSelf, TOther}.op_GreaterThanOrEqual(TSelf, TOther)" />
public static bool operator >=(DateOnly left, DateOnly right) => left._dayNumber >= right._dayNumber;

/// <summary>
Expand All @@ -179,6 +181,7 @@ public DateOnly AddDays(int value)
/// <param name="left">The first object to compare.</param>
/// <param name="right">The second object to compare.</param>
/// <returns>true if left is earlier than right; otherwise, false.</returns>
/// <inheritdoc cref="IComparisonOperators{TSelf, TOther}.op_LessThan(TSelf, TOther)" />
public static bool operator <(DateOnly left, DateOnly right) => left._dayNumber < right._dayNumber;

/// <summary>
Expand All @@ -187,6 +190,7 @@ public DateOnly AddDays(int value)
/// <param name="left">The first object to compare.</param>
/// <param name="right">The second object to compare.</param>
/// <returns>true if left is the same as or earlier than right; otherwise, false.</returns>
/// <inheritdoc cref="IComparisonOperators{TSelf, TOther}.op_LessThanOrEqual(TSelf, TOther)" />
public static bool operator <=(DateOnly left, DateOnly right) => left._dayNumber <= right._dayNumber;

/// <summary>
Expand Down Expand Up @@ -829,58 +833,24 @@ public string ToString(string? format, IFormatProvider? provider)
return DateTimeFormat.TryFormat(GetEquivalentDateTime(), destination, out charsWritten, format, provider);
}

//
// IComparisonOperators
//

static bool IComparisonOperators<DateOnly, DateOnly>.operator <(DateOnly left, DateOnly right)
=> left < right;

static bool IComparisonOperators<DateOnly, DateOnly>.operator <=(DateOnly left, DateOnly right)
=> left <= right;

static bool IComparisonOperators<DateOnly, DateOnly>.operator >(DateOnly left, DateOnly right)
=> left > right;

static bool IComparisonOperators<DateOnly, DateOnly>.operator >=(DateOnly left, DateOnly right)
=> left >= right;

//
// IEqualityOperators
//

static bool IEqualityOperators<DateOnly, DateOnly>.operator ==(DateOnly left, DateOnly right)
=> left == right;

static bool IEqualityOperators<DateOnly, DateOnly>.operator !=(DateOnly left, DateOnly right)
=> left != right;

//
// IMinMaxValue
//

static DateOnly IMinMaxValue<DateOnly>.MinValue => MinValue;

static DateOnly IMinMaxValue<DateOnly>.MaxValue => MaxValue;

//
// IParseable
//

static DateOnly IParseable<DateOnly>.Parse(string s, IFormatProvider? provider)
=> Parse(s, provider, DateTimeStyles.None);
/// <inheritdoc cref="IParseable{TSelf}.Parse(string, IFormatProvider?)" />
public static DateOnly Parse(string s, IFormatProvider? provider) => Parse(s, provider, DateTimeStyles.None);

static bool IParseable<DateOnly>.TryParse([NotNullWhen(true)] string? s, IFormatProvider? provider, out DateOnly result)
=> TryParse(s, provider, DateTimeStyles.None, out result);
/// <inheritdoc cref="IParseable{TSelf}.TryParse(string?, IFormatProvider?, out TSelf)" />
public static bool TryParse([NotNullWhen(true)] string? s, IFormatProvider? provider, out DateOnly result) => TryParse(s, provider, DateTimeStyles.None, out result);

//
// ISpanParseable
//

static DateOnly ISpanParseable<DateOnly>.Parse(ReadOnlySpan<char> s, IFormatProvider? provider)
=> Parse(s, provider, DateTimeStyles.None);
/// <inheritdoc cref="ISpanParseable{TSelf}.Parse(ReadOnlySpan{char}, IFormatProvider?)" />
public static DateOnly Parse(ReadOnlySpan<char> s, IFormatProvider? provider) => Parse(s, provider, DateTimeStyles.None);

static bool ISpanParseable<DateOnly>.TryParse(ReadOnlySpan<char> s, IFormatProvider? provider, out DateOnly result)
=> TryParse(s, provider, DateTimeStyles.None, out result);
/// <inheritdoc cref="ISpanParseable{TSelf}.TryParse(ReadOnlySpan{char}, IFormatProvider?, out TSelf)" />
public static bool TryParse(ReadOnlySpan<char> s, IFormatProvider? provider, out DateOnly result) => TryParse(s, provider, DateTimeStyles.None, out result);
}
}
72 changes: 19 additions & 53 deletions src/libraries/System.Private.CoreLib/src/System/DateTime.cs
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,7 @@ namespace System
//
[StructLayout(LayoutKind.Auto)]
[Serializable]
[System.Runtime.CompilerServices.TypeForwardedFrom("mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089")]
[TypeForwardedFrom("mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089")]
public readonly partial struct DateTime
: IComparable,
ISpanFormattable,
Expand Down Expand Up @@ -1391,12 +1391,16 @@ public static bool TryParseExact(ReadOnlySpan<char> s, [NotNullWhen(true), Strin

public static bool operator !=(DateTime d1, DateTime d2) => !(d1 == d2);

/// <inheritdoc cref="IComparisonOperators{TSelf, TOther}.op_LessThan(TSelf, TOther)" />
public static bool operator <(DateTime t1, DateTime t2) => t1.Ticks < t2.Ticks;

/// <inheritdoc cref="IComparisonOperators{TSelf, TOther}.op_LessThanOrEqual(TSelf, TOther)" />
public static bool operator <=(DateTime t1, DateTime t2) => t1.Ticks <= t2.Ticks;

/// <inheritdoc cref="IComparisonOperators{TSelf, TOther}.op_GreaterThan(TSelf, TOther)" />
public static bool operator >(DateTime t1, DateTime t2) => t1.Ticks > t2.Ticks;

/// <inheritdoc cref="IComparisonOperators{TSelf, TOther}.op_GreaterThanOrEqual(TSelf, TOther)" />
public static bool operator >=(DateTime t1, DateTime t2) => t1.Ticks >= t2.Ticks;

// Returns a string array containing all of the known date and time options for the
Expand Down Expand Up @@ -1506,44 +1510,15 @@ internal static bool TryCreate(int year, int month, int day, int hour, int minut
// IAdditionOperators
//

static DateTime IAdditionOperators<DateTime, TimeSpan, DateTime>.operator +(DateTime left, TimeSpan right)
=> left + right;

// static checked DateTime IAdditionOperators<DateTime, TimeSpan, DateTime>.operator +(DateTime left, TimeSpan right)
// => checked(left + right);
// /// <inheritdoc cref="IAdditionOperators{TSelf, TOther, TResult}.op_Addition(TSelf, TOther)" />
// static DateTime IAdditionOperators<DateTime, TimeSpan, DateTime>.operator checked +(DateTime left, TimeSpan right) => checked(left + right);

//
// IAdditiveIdentity
//

static TimeSpan IAdditiveIdentity<DateTime, TimeSpan>.AdditiveIdentity
=> default;

//
// IComparisonOperators
//

static bool IComparisonOperators<DateTime, DateTime>.operator <(DateTime left, DateTime right)
=> left < right;

static bool IComparisonOperators<DateTime, DateTime>.operator <=(DateTime left, DateTime right)
=> left <= right;

static bool IComparisonOperators<DateTime, DateTime>.operator >(DateTime left, DateTime right)
=> left > right;

static bool IComparisonOperators<DateTime, DateTime>.operator >=(DateTime left, DateTime right)
=> left >= right;

//
// IEqualityOperators
//

static bool IEqualityOperators<DateTime, DateTime>.operator ==(DateTime left, DateTime right)
=> left == right;

static bool IEqualityOperators<DateTime, DateTime>.operator !=(DateTime left, DateTime right)
=> left != right;
/// <inheritdoc cref="IAdditiveIdentity{TSelf, TResult}.AdditiveIdentity" />
public static TimeSpan AdditiveIdentity => default;

//
// IMinMaxValue
Expand All @@ -1557,36 +1532,27 @@ static TimeSpan IAdditiveIdentity<DateTime, TimeSpan>.AdditiveIdentity
// IParseable
//

static DateTime IParseable<DateTime>.Parse(string s, IFormatProvider? provider)
=> Parse(s, provider);

static bool IParseable<DateTime>.TryParse([NotNullWhen(true)] string? s, IFormatProvider? provider, out DateTime result)
=> TryParse(s, provider, DateTimeStyles.None, out result);
/// <inheritdoc cref="IParseable{TSelf}.TryParse(string?, IFormatProvider?, out TSelf)" />
public static bool TryParse([NotNullWhen(true)] string? s, IFormatProvider? provider, out DateTime result) => TryParse(s, provider, DateTimeStyles.None, out result);

//
// ISpanParseable
//

static DateTime ISpanParseable<DateTime>.Parse(ReadOnlySpan<char> s, IFormatProvider? provider)
=> Parse(s, provider, DateTimeStyles.None);
/// <inheritdoc cref="ISpanParseable{TSelf}.Parse(ReadOnlySpan{char}, IFormatProvider?)" />
public static DateTime Parse(ReadOnlySpan<char> s, IFormatProvider? provider) => Parse(s, provider, DateTimeStyles.None);

static bool ISpanParseable<DateTime>.TryParse(ReadOnlySpan<char> s, IFormatProvider? provider, out DateTime result)
=> TryParse(s, provider, DateTimeStyles.None, out result);
/// <inheritdoc cref="ISpanParseable{TSelf}.TryParse(ReadOnlySpan{char}, IFormatProvider?, out TSelf)" />
public static bool TryParse(ReadOnlySpan<char> s, IFormatProvider? provider, out DateTime result) => TryParse(s, provider, DateTimeStyles.None, out result);

//
// ISubtractionOperators
//

static DateTime ISubtractionOperators<DateTime, TimeSpan, DateTime>.operator -(DateTime left, TimeSpan right)
=> left - right;

// static checked DateTime ISubtractionOperators<DateTime, TimeSpan, DateTime>.operator -(DateTime left, TimeSpan right)
// => checked(left - right);

static TimeSpan ISubtractionOperators<DateTime, DateTime, TimeSpan>.operator -(DateTime left, DateTime right)
=> left - right;
// /// <inheritdoc cref="ISubtractionOperators{TSelf, TOther, TResult}.op_CheckedSubtraction(TSelf, TOther)" />
// static DateTime ISubtractionOperators<DateTime, TimeSpan, DateTime>.operator checked -(DateTime left, TimeSpan right) => checked(left - right);

// static checked TimeSpan ISubtractionOperators<DateTime, DateTime, TimeSpan>.operator -(DateTime left, DateTime right)
// => checked(left - right);
// /// <inheritdoc cref="ISubtractionOperators{TSelf, TOther, TResult}.op_CheckedSubtraction(TSelf, TOther)" />
// static TimeSpan ISubtractionOperators<DateTime, DateTime, TimeSpan>.operator checked -(DateTime left, DateTime right) => checked(left - right);
}
}
72 changes: 20 additions & 52 deletions src/libraries/System.Private.CoreLib/src/System/DateTimeOffset.cs
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
using System.Diagnostics;
using System.Diagnostics.CodeAnalysis;
using System.Globalization;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
using System.Runtime.Serialization;
using System.Runtime.Versioning;
Expand Down Expand Up @@ -31,7 +32,7 @@ namespace System

[StructLayout(LayoutKind.Auto)]
[Serializable]
[System.Runtime.CompilerServices.TypeForwardedFrom("mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089")]
[TypeForwardedFrom("mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089")]
public readonly struct DateTimeOffset
: IComparable,
ISpanFormattable,
Expand Down Expand Up @@ -845,59 +846,35 @@ public static implicit operator DateTimeOffset(DateTime dateTime) =>
public static bool operator !=(DateTimeOffset left, DateTimeOffset right) =>
left.UtcDateTime != right.UtcDateTime;

/// <inheritdoc cref="IComparisonOperators{TSelf, TOther}.op_LessThan(TSelf, TOther)" />
public static bool operator <(DateTimeOffset left, DateTimeOffset right) =>
left.UtcDateTime < right.UtcDateTime;

/// <inheritdoc cref="IComparisonOperators{TSelf, TOther}.op_LessThanOrEqual(TSelf, TOther)" />
public static bool operator <=(DateTimeOffset left, DateTimeOffset right) =>
left.UtcDateTime <= right.UtcDateTime;

/// <inheritdoc cref="IComparisonOperators{TSelf, TOther}.op_GreaterThan(TSelf, TOther)" />
public static bool operator >(DateTimeOffset left, DateTimeOffset right) =>
left.UtcDateTime > right.UtcDateTime;

/// <inheritdoc cref="IComparisonOperators{TSelf, TOther}.op_GreaterThanOrEqual(TSelf, TOther)" />
public static bool operator >=(DateTimeOffset left, DateTimeOffset right) =>
left.UtcDateTime >= right.UtcDateTime;

//
// IAdditionOperators
//

static DateTimeOffset IAdditionOperators<DateTimeOffset, TimeSpan, DateTimeOffset>.operator +(DateTimeOffset left, TimeSpan right)
=> left + right;

// static checked DateTimeOffset IAdditionOperators<DateTimeOffset, TimeSpan, DateTimeOffset>.operator +(DateTimeOffset left, TimeSpan right)
// => checked(left + right);
// /// <inheritdoc cref="IAdditionOperators{TSelf, TOther, TResult}.op_Addition(TSelf, TOther)" />
// static DateTimeOffset IAdditionOperators<DateTimeOffset, TimeSpan, DateTimeOffset>.operator checked +(DateTimeOffset left, TimeSpan right) => checked(left + right);

//
// IAdditiveIdentity
//

static TimeSpan IAdditiveIdentity<DateTimeOffset, TimeSpan>.AdditiveIdentity => default;

//
// IComparisonOperators
//

static bool IComparisonOperators<DateTimeOffset, DateTimeOffset>.operator <(DateTimeOffset left, DateTimeOffset right)
=> left < right;

static bool IComparisonOperators<DateTimeOffset, DateTimeOffset>.operator <=(DateTimeOffset left, DateTimeOffset right)
=> left <= right;

static bool IComparisonOperators<DateTimeOffset, DateTimeOffset>.operator >(DateTimeOffset left, DateTimeOffset right)
=> left > right;

static bool IComparisonOperators<DateTimeOffset, DateTimeOffset>.operator >=(DateTimeOffset left, DateTimeOffset right)
=> left >= right;

//
// IEqualityOperators
//

static bool IEqualityOperators<DateTimeOffset, DateTimeOffset>.operator ==(DateTimeOffset left, DateTimeOffset right)
=> left == right;

static bool IEqualityOperators<DateTimeOffset, DateTimeOffset>.operator !=(DateTimeOffset left, DateTimeOffset right)
=> left != right;
/// <inheritdoc cref="IAdditiveIdentity{TSelf, TResult}.AdditiveIdentity" />
public static TimeSpan AdditiveIdentity => default;

//
// IMinMaxValue
Expand All @@ -911,36 +888,27 @@ public static implicit operator DateTimeOffset(DateTime dateTime) =>
// IParseable
//

static DateTimeOffset IParseable<DateTimeOffset>.Parse(string s, IFormatProvider? provider)
=> Parse(s, provider);

static bool IParseable<DateTimeOffset>.TryParse([NotNullWhen(true)] string? s, IFormatProvider? provider, out DateTimeOffset result)
=> TryParse(s, provider, DateTimeStyles.None, out result);
/// <inheritdoc cref="IParseable{TSelf}.TryParse(string?, IFormatProvider?, out TSelf)" />
public static bool TryParse([NotNullWhen(true)] string? s, IFormatProvider? provider, out DateTimeOffset result) => TryParse(s, provider, DateTimeStyles.None, out result);

//
// ISpanParseable
//

static DateTimeOffset ISpanParseable<DateTimeOffset>.Parse(ReadOnlySpan<char> s, IFormatProvider? provider)
=> Parse(s, provider, DateTimeStyles.None);
/// <inheritdoc cref="ISpanParseable{TSelf}.Parse(ReadOnlySpan{char}, IFormatProvider?)" />
public static DateTimeOffset Parse(ReadOnlySpan<char> s, IFormatProvider? provider) => Parse(s, provider, DateTimeStyles.None);

static bool ISpanParseable<DateTimeOffset>.TryParse(ReadOnlySpan<char> s, IFormatProvider? provider, out DateTimeOffset result)
=> TryParse(s, provider, DateTimeStyles.None, out result);
/// <inheritdoc cref="ISpanParseable{TSelf}.TryParse(ReadOnlySpan{char}, IFormatProvider?, out TSelf)" />
public static bool TryParse(ReadOnlySpan<char> s, IFormatProvider? provider, out DateTimeOffset result) => TryParse(s, provider, DateTimeStyles.None, out result);

//
// ISubtractionOperators
//

static DateTimeOffset ISubtractionOperators<DateTimeOffset, TimeSpan, DateTimeOffset>.operator -(DateTimeOffset left, TimeSpan right)
=> left - right;

// static checked DateTimeOffset ISubtractionOperators<DateTimeOffset, TimeSpan, DateTimeOffset>.operator -(DateTimeOffset left, TimeSpan right)
// => checked(left - right);

static TimeSpan ISubtractionOperators<DateTimeOffset, DateTimeOffset, TimeSpan>.operator -(DateTimeOffset left, DateTimeOffset right)
=> left - right;
// /// <inheritdoc cref="ISubtractionOperators{TSelf, TOther, TResult}.op_CheckedSubtraction(TSelf, TOther)" />
// static DateTimeOffset ISubtractionOperators<DateTimeOffset, TimeSpan, DateTimeOffset>.operator checked -(DateTimeOffset left, TimeSpan right) => checked(left - right);

// static checked TimeSpan ISubtractionOperators<DateTimeOffset, DateTimeOffset, TimeSpan>.operator -(DateTimeOffset left, DateTimeOffset right)
// => checked(left - right);
// /// <inheritdoc cref="ISubtractionOperators{TSelf, TOther, TResult}.op_CheckedSubtraction(TSelf, TOther)" />
// static TimeSpan ISubtractionOperators<DateTimeOffset, DateTimeOffset, TimeSpan>.operator checked -(DateTimeOffset left, DateTimeOffset right) => checked(left - right);
}
}
Loading

0 comments on commit 7f2cdc5

Please sign in to comment.