++
This commit is contained in:
@@ -400,8 +400,8 @@ public static partial class CollectionsMinusExtensions
|
|||||||
if (units is null) return null!;
|
if (units is null) return null!;
|
||||||
int count = units.Count;
|
int count = units.Count;
|
||||||
if (count == 0) return [];
|
if (count == 0) return [];
|
||||||
if (units is T[] array) return array.Multiply(subtrahend);
|
if (units is T[] array) return array.Minus(subtrahend);
|
||||||
if (units is List<T> list) return list.Multiply(subtrahend);
|
if (units is List<T> list) return list.Minus(subtrahend);
|
||||||
|
|
||||||
T[] sharedArray = ArrayPool<T>.Shared.Rent(count);
|
T[] sharedArray = ArrayPool<T>.Shared.Rent(count);
|
||||||
var finalResult = new T[count];
|
var finalResult = new T[count];
|
||||||
@@ -423,8 +423,8 @@ public static partial class CollectionsMinusExtensions
|
|||||||
if (units is null) return null!;
|
if (units is null) return null!;
|
||||||
int count = units.Count;
|
int count = units.Count;
|
||||||
if (count == 0) return [];
|
if (count == 0) return [];
|
||||||
if (units is T?[] array) return array.Multiply(subtrahend);
|
if (units is T?[] array) return array.Minus(subtrahend);
|
||||||
if (units is List<T?> list) return list.Multiply(subtrahend);
|
if (units is List<T?> list) return list.Minus(subtrahend);
|
||||||
|
|
||||||
T?[] sharedNullableArray = ArrayPool<T?>.Shared.Rent(count);
|
T?[] sharedNullableArray = ArrayPool<T?>.Shared.Rent(count);
|
||||||
var resultArray = new T?[count];
|
var resultArray = new T?[count];
|
||||||
@@ -454,8 +454,8 @@ public static partial class CollectionsMinusExtensions
|
|||||||
if (units is null) return null!;
|
if (units is null) return null!;
|
||||||
int count = units.Count;
|
int count = units.Count;
|
||||||
if (count == 0) return [];
|
if (count == 0) return [];
|
||||||
if (units is T[] array) return array.Multiply(minuend);
|
if (units is T[] array) return array.Minus(minuend);
|
||||||
if (units is List<T> list) return list.Multiply(minuend);
|
if (units is List<T> list) return list.Minus(minuend);
|
||||||
|
|
||||||
T[] sharedArray = ArrayPool<T>.Shared.Rent(count);
|
T[] sharedArray = ArrayPool<T>.Shared.Rent(count);
|
||||||
var finalResult = new T[count];
|
var finalResult = new T[count];
|
||||||
@@ -477,8 +477,8 @@ public static partial class CollectionsMinusExtensions
|
|||||||
if (units is null) return null!;
|
if (units is null) return null!;
|
||||||
int count = units.Count;
|
int count = units.Count;
|
||||||
if (count == 0) return [];
|
if (count == 0) return [];
|
||||||
if (units is T?[] array) return array.Multiply(minuend);
|
if (units is T?[] array) return array.Minus(minuend);
|
||||||
if (units is List<T?> list) return list.Multiply(minuend);
|
if (units is List<T?> list) return list.Minus(minuend);
|
||||||
|
|
||||||
T?[] sharedNullableArray = ArrayPool<T?>.Shared.Rent(count);
|
T?[] sharedNullableArray = ArrayPool<T?>.Shared.Rent(count);
|
||||||
var resultArray = new T?[count];
|
var resultArray = new T?[count];
|
||||||
|
|||||||
@@ -211,83 +211,77 @@ public static partial class CollectionsPowExtensions
|
|||||||
}
|
}
|
||||||
|
|
||||||
// === ICollection<Length> ===
|
// === ICollection<Length> ===
|
||||||
internal static ICollection<R> Pow<T, R>(this ICollection<T> units, int power)
|
internal static void Pow<T, R>(this ICollection<T> units, int power, Span<R> destination)
|
||||||
where T : struct, IMensuraUnit, IEquatable<T>
|
where T : struct, IMensuraUnit, IEquatable<T>
|
||||||
where R : struct, IMensuraUnit, IEquatable<R>
|
where R : struct, IMensuraUnit, IEquatable<R>
|
||||||
{
|
{
|
||||||
if (units is null) return null!;
|
if (units is null) return;
|
||||||
if (units is T[] array) return array.Pow<T, R>(power);
|
int count = units.Count;
|
||||||
if (units is List<T> list) return list.Pow<T, R>(power);
|
if (count == 0) return;
|
||||||
|
if (destination.Length < count)
|
||||||
|
throw new ArgumentException("Destination too short");
|
||||||
|
|
||||||
ICollection<R> result = [];
|
if (units is T[] array) { array.AsSpan().Pow(power, destination); return; }
|
||||||
|
if (units is List<T> list) { CollectionsMarshal.AsSpan(list).Pow(power, destination); return; }
|
||||||
|
|
||||||
|
int i = 0;
|
||||||
foreach (var item in units)
|
foreach (var item in units)
|
||||||
result.Add(item.ToDouble().QuickPow(power).ToUnit<R>());
|
destination[i++] = item.ToDouble().QuickPow(power).ToUnit<R>();
|
||||||
return result;
|
|
||||||
}
|
}
|
||||||
internal static ICollection<R?> Pow<T, R>(this ICollection<T?> units, int power)
|
internal static void Pow<T, R>(this ICollection<T?> units, int power, Span<R?> destination)
|
||||||
where T : struct, IMensuraUnit, IEquatable<T>
|
where T : struct, IMensuraUnit, IEquatable<T>
|
||||||
where R : struct, IMensuraUnit, IEquatable<R>
|
where R : struct, IMensuraUnit, IEquatable<R>
|
||||||
{
|
{
|
||||||
if (units is null) return null!;
|
if (units is null) return;
|
||||||
if (units is T?[] array) return array.Pow<T, R>(power);
|
int count = units.Count;
|
||||||
if (units is List<T?> list) return list.Pow<T, R>(power);
|
if (count == 0) return;
|
||||||
|
if (destination.Length < count)
|
||||||
|
throw new ArgumentException("Destination too short");
|
||||||
|
|
||||||
ICollection<R?> result = [];
|
if (units is T?[] array) { array.AsSpan().Pow(power, destination); return; }
|
||||||
|
if (units is List<T?> list) { CollectionsMarshal.AsSpan(list).Pow(power, destination); return; }
|
||||||
|
|
||||||
|
int i = 0;
|
||||||
foreach (var item in units)
|
foreach (var item in units)
|
||||||
result.Add((item.HasValue ? item.Value.ToDouble().QuickPow(power) : 0d).ToUnit<R>());
|
destination[i++] = item.HasValue
|
||||||
return result;
|
? item.Value.ToDouble().QuickPow(power).ToUnit<R>() : null;
|
||||||
}
|
}
|
||||||
|
|
||||||
// === IReadOnlyCollection<Length> ===
|
// === IReadOnlyCollection<Length> ===
|
||||||
internal static IReadOnlyCollection<R> Pow<T, R>(this IReadOnlyCollection<T> units, int power)
|
internal static void Pow<T, R>(this IReadOnlyCollection<T> units, int power, Span<R> destination)
|
||||||
where T : struct, IMensuraUnit, IEquatable<T>
|
where T : struct, IMensuraUnit, IEquatable<T>
|
||||||
where R : struct, IMensuraUnit, IEquatable<R>
|
where R : struct, IMensuraUnit, IEquatable<R>
|
||||||
{
|
{
|
||||||
if (units is null) return null!;
|
if (units is null) return;
|
||||||
int count = units.Count;
|
int count = units.Count;
|
||||||
if (count == 0) return [];
|
if (count == 0) return;
|
||||||
if (units is T[] array) return array.Pow<T, R>(power);
|
if (destination.Length < count)
|
||||||
if (units is List<T> list) return list.Pow<T, R>(power);
|
throw new ArgumentException("Destination too short");
|
||||||
|
|
||||||
T[] sharedArray = ArrayPool<T>.Shared.Rent(count);
|
if (units is T[] array) { array.AsSpan().Pow(power, destination); return; }
|
||||||
var finalResult = new R[count];
|
if (units is List<T> list) { CollectionsMarshal.AsSpan(list).Pow(power, destination); return; }
|
||||||
|
|
||||||
try
|
int i = 0;
|
||||||
{
|
foreach (var item in units)
|
||||||
int index = 0;
|
destination[i++] = item.ToDouble().QuickPow(power).ToUnit<R>();
|
||||||
foreach (var item in units) sharedArray[index++] = item;
|
|
||||||
Pow(sharedArray, power, finalResult);
|
|
||||||
return finalResult;
|
|
||||||
}
|
|
||||||
finally
|
|
||||||
{
|
|
||||||
ArrayPool<T>.Shared.Return(sharedArray);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
internal static IReadOnlyCollection<R?> Pow<T, R>(this IReadOnlyCollection<T?> units, int power)
|
internal static void Pow<T, R>(this IReadOnlyCollection<T?> units, int power, Span<R?> destination)
|
||||||
where T : struct, IMensuraUnit, IEquatable<T>
|
where T : struct, IMensuraUnit, IEquatable<T>
|
||||||
where R : struct, IMensuraUnit, IEquatable<R>
|
where R : struct, IMensuraUnit, IEquatable<R>
|
||||||
{
|
{
|
||||||
if (units is null) return null!;
|
if (units is null) return;
|
||||||
int count = units.Count;
|
int count = units.Count;
|
||||||
if (count == 0) return [];
|
if (count == 0) return;
|
||||||
if (units is T?[] array) return array.Pow<T, R>(power);
|
if (destination.Length < count)
|
||||||
if (units is List<T?> list) return list.Pow<T, R>(power);
|
throw new ArgumentException("Destination too short");
|
||||||
|
|
||||||
T?[] sharedArray = ArrayPool<T?>.Shared.Rent(count);
|
if (units is T?[] array) { array.AsSpan().Pow(power, destination); return; }
|
||||||
var finalResult = new R?[count];
|
if (units is List<T?> list) { CollectionsMarshal.AsSpan(list).Pow(power, destination); return; }
|
||||||
|
|
||||||
try
|
int i = 0;
|
||||||
{
|
foreach (var item in units)
|
||||||
int index = 0;
|
destination[i++] = item.HasValue
|
||||||
foreach (var item in units) sharedArray[index++] = item;
|
? item.Value.ToDouble().QuickPow(power).ToUnit<R>() : null;
|
||||||
Pow(sharedArray, power, finalResult);
|
|
||||||
return finalResult;
|
|
||||||
}
|
|
||||||
finally
|
|
||||||
{
|
|
||||||
ArrayPool<T?>.Shared.Return(sharedArray);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// === IEnumerable<T, R> + yeild ===
|
// === IEnumerable<T, R> + yeild ===
|
||||||
|
|||||||
Reference in New Issue
Block a user