From 69f529c4fc1d69660c31adcabdb8190a81fb6527 Mon Sep 17 00:00:00 2001 From: Fantom TM Date: Wed, 3 Jun 2026 01:03:08 +0700 Subject: [PATCH] ++ --- .../Extensions/CollectionsMinusExtensions.cs | 16 ++-- .../Extensions/CollectionsPowExtensions.cs | 94 +++++++++---------- 2 files changed, 52 insertions(+), 58 deletions(-) diff --git a/QWERTYkez.Mensura/Extensions/CollectionsMinusExtensions.cs b/QWERTYkez.Mensura/Extensions/CollectionsMinusExtensions.cs index fca263e..9751e7b 100644 --- a/QWERTYkez.Mensura/Extensions/CollectionsMinusExtensions.cs +++ b/QWERTYkez.Mensura/Extensions/CollectionsMinusExtensions.cs @@ -400,8 +400,8 @@ public static partial class CollectionsMinusExtensions if (units is null) return null!; int count = units.Count; if (count == 0) return []; - if (units is T[] array) return array.Multiply(subtrahend); - if (units is List list) return list.Multiply(subtrahend); + if (units is T[] array) return array.Minus(subtrahend); + if (units is List list) return list.Minus(subtrahend); T[] sharedArray = ArrayPool.Shared.Rent(count); var finalResult = new T[count]; @@ -423,8 +423,8 @@ public static partial class CollectionsMinusExtensions if (units is null) return null!; int count = units.Count; if (count == 0) return []; - if (units is T?[] array) return array.Multiply(subtrahend); - if (units is List list) return list.Multiply(subtrahend); + if (units is T?[] array) return array.Minus(subtrahend); + if (units is List list) return list.Minus(subtrahend); T?[] sharedNullableArray = ArrayPool.Shared.Rent(count); var resultArray = new T?[count]; @@ -454,8 +454,8 @@ public static partial class CollectionsMinusExtensions if (units is null) return null!; int count = units.Count; if (count == 0) return []; - if (units is T[] array) return array.Multiply(minuend); - if (units is List list) return list.Multiply(minuend); + if (units is T[] array) return array.Minus(minuend); + if (units is List list) return list.Minus(minuend); T[] sharedArray = ArrayPool.Shared.Rent(count); var finalResult = new T[count]; @@ -477,8 +477,8 @@ public static partial class CollectionsMinusExtensions if (units is null) return null!; int count = units.Count; if (count == 0) return []; - if (units is T?[] array) return array.Multiply(minuend); - if (units is List list) return list.Multiply(minuend); + if (units is T?[] array) return array.Minus(minuend); + if (units is List list) return list.Minus(minuend); T?[] sharedNullableArray = ArrayPool.Shared.Rent(count); var resultArray = new T?[count]; diff --git a/QWERTYkez.Mensura/Extensions/CollectionsPowExtensions.cs b/QWERTYkez.Mensura/Extensions/CollectionsPowExtensions.cs index 5e48e66..aa279fb 100644 --- a/QWERTYkez.Mensura/Extensions/CollectionsPowExtensions.cs +++ b/QWERTYkez.Mensura/Extensions/CollectionsPowExtensions.cs @@ -211,83 +211,77 @@ public static partial class CollectionsPowExtensions } // === ICollection === - internal static ICollection Pow(this ICollection units, int power) + internal static void Pow(this ICollection units, int power, Span destination) where T : struct, IMensuraUnit, IEquatable where R : struct, IMensuraUnit, IEquatable { - if (units is null) return null!; - if (units is T[] array) return array.Pow(power); - if (units is List list) return list.Pow(power); + if (units is null) return; + int count = units.Count; + if (count == 0) return; + if (destination.Length < count) + throw new ArgumentException("Destination too short"); - ICollection result = []; + if (units is T[] array) { array.AsSpan().Pow(power, destination); return; } + if (units is List list) { CollectionsMarshal.AsSpan(list).Pow(power, destination); return; } + + int i = 0; foreach (var item in units) - result.Add(item.ToDouble().QuickPow(power).ToUnit()); - return result; + destination[i++] = item.ToDouble().QuickPow(power).ToUnit(); } - internal static ICollection Pow(this ICollection units, int power) + internal static void Pow(this ICollection units, int power, Span destination) where T : struct, IMensuraUnit, IEquatable where R : struct, IMensuraUnit, IEquatable { - if (units is null) return null!; - if (units is T?[] array) return array.Pow(power); - if (units is List list) return list.Pow(power); + if (units is null) return; + int count = units.Count; + if (count == 0) return; + if (destination.Length < count) + throw new ArgumentException("Destination too short"); - ICollection result = []; + if (units is T?[] array) { array.AsSpan().Pow(power, destination); return; } + if (units is List list) { CollectionsMarshal.AsSpan(list).Pow(power, destination); return; } + + int i = 0; foreach (var item in units) - result.Add((item.HasValue ? item.Value.ToDouble().QuickPow(power) : 0d).ToUnit()); - return result; + destination[i++] = item.HasValue + ? item.Value.ToDouble().QuickPow(power).ToUnit() : null; } // === IReadOnlyCollection === - internal static IReadOnlyCollection Pow(this IReadOnlyCollection units, int power) + internal static void Pow(this IReadOnlyCollection units, int power, Span destination) where T : struct, IMensuraUnit, IEquatable where R : struct, IMensuraUnit, IEquatable { - if (units is null) return null!; + if (units is null) return; int count = units.Count; - if (count == 0) return []; - if (units is T[] array) return array.Pow(power); - if (units is List list) return list.Pow(power); + if (count == 0) return; + if (destination.Length < count) + throw new ArgumentException("Destination too short"); - T[] sharedArray = ArrayPool.Shared.Rent(count); - var finalResult = new R[count]; + if (units is T[] array) { array.AsSpan().Pow(power, destination); return; } + if (units is List list) { CollectionsMarshal.AsSpan(list).Pow(power, destination); return; } - try - { - int index = 0; - foreach (var item in units) sharedArray[index++] = item; - Pow(sharedArray, power, finalResult); - return finalResult; - } - finally - { - ArrayPool.Shared.Return(sharedArray); - } + int i = 0; + foreach (var item in units) + destination[i++] = item.ToDouble().QuickPow(power).ToUnit(); } - internal static IReadOnlyCollection Pow(this IReadOnlyCollection units, int power) + internal static void Pow(this IReadOnlyCollection units, int power, Span destination) where T : struct, IMensuraUnit, IEquatable where R : struct, IMensuraUnit, IEquatable { - if (units is null) return null!; + if (units is null) return; int count = units.Count; - if (count == 0) return []; - if (units is T?[] array) return array.Pow(power); - if (units is List list) return list.Pow(power); + if (count == 0) return; + if (destination.Length < count) + throw new ArgumentException("Destination too short"); - T?[] sharedArray = ArrayPool.Shared.Rent(count); - var finalResult = new R?[count]; + if (units is T?[] array) { array.AsSpan().Pow(power, destination); return; } + if (units is List list) { CollectionsMarshal.AsSpan(list).Pow(power, destination); return; } - try - { - int index = 0; - foreach (var item in units) sharedArray[index++] = item; - Pow(sharedArray, power, finalResult); - return finalResult; - } - finally - { - ArrayPool.Shared.Return(sharedArray); - } + int i = 0; + foreach (var item in units) + destination[i++] = item.HasValue + ? item.Value.ToDouble().QuickPow(power).ToUnit() : null; } // === IEnumerable + yeild ===