WrapAsList debug
This commit is contained in:
@@ -6,7 +6,7 @@ namespace QWERTYkez.Mensura.Extensions;
|
||||
|
||||
internal static partial class AggregateUnitExtensions
|
||||
{
|
||||
// Sum Average Max Min (не nullable) ==========================================
|
||||
// Sum Avg Max Min (не nullable) ==========================================
|
||||
|
||||
|
||||
// === ReadOnlySpan === SIMD
|
||||
@@ -73,7 +73,7 @@ internal static partial class AggregateUnitExtensions
|
||||
|
||||
return Unsafe.As<double, T>(ref sum);
|
||||
}
|
||||
internal static T Average<T>(this ReadOnlySpan<T> units)
|
||||
internal static T Avg<T>(this ReadOnlySpan<T> units)
|
||||
where T : struct, IMensuraUnit, IEquatable<T>
|
||||
{
|
||||
// Если коллекция пустая, возвращаем структуру, содержащую double.NaN
|
||||
@@ -140,10 +140,10 @@ internal static partial class AggregateUnitExtensions
|
||||
}
|
||||
|
||||
// Находим среднее значение
|
||||
double average = sum / values.Length;
|
||||
double Avg = sum / values.Length;
|
||||
|
||||
// Упаковываем double обратно в структуру T (zero-cost)
|
||||
return Unsafe.As<double, T>(ref average);
|
||||
return Unsafe.As<double, T>(ref Avg);
|
||||
}
|
||||
internal static T Max<T>(this ReadOnlySpan<T> units)
|
||||
where T : struct, IMensuraUnit, IEquatable<T>
|
||||
@@ -280,10 +280,10 @@ internal static partial class AggregateUnitExtensions
|
||||
{
|
||||
return CollectionsMarshal.AsSpan(list).Sum();
|
||||
}
|
||||
internal static T Average<T>(this List<T> list)
|
||||
internal static T Avg<T>(this List<T> list)
|
||||
where T : struct, IMensuraUnit, IEquatable<T>
|
||||
{
|
||||
return CollectionsMarshal.AsSpan(list).Average();
|
||||
return CollectionsMarshal.AsSpan(list).Avg();
|
||||
}
|
||||
internal static T Max<T>(this List<T> list)
|
||||
where T : struct, IMensuraUnit, IEquatable<T>
|
||||
@@ -315,18 +315,18 @@ internal static partial class AggregateUnitExtensions
|
||||
ArrayPool<T>.Shared.Return(sharedArray);
|
||||
}
|
||||
}
|
||||
internal static T Average<T>(this ICollection<T> collection)
|
||||
internal static T Avg<T>(this ICollection<T> collection)
|
||||
where T : struct, IMensuraUnit, IEquatable<T>
|
||||
{
|
||||
if (collection == null || collection.Count == 0) return double.NaN.ToUnit<T>();
|
||||
if (collection is T[] array) return array.Average();
|
||||
if (collection is List<T> list) return list.Average();
|
||||
if (collection is T[] array) return array.Avg();
|
||||
if (collection is List<T> list) return list.Avg();
|
||||
|
||||
T[] sharedArray = ArrayPool<T>.Shared.Rent(collection.Count);
|
||||
try
|
||||
{
|
||||
collection.CopyTo(sharedArray, 0);
|
||||
return new ReadOnlySpan<T>(sharedArray, 0, collection.Count).Average();
|
||||
return new ReadOnlySpan<T>(sharedArray, 0, collection.Count).Avg();
|
||||
}
|
||||
finally
|
||||
{
|
||||
@@ -387,19 +387,19 @@ internal static partial class AggregateUnitExtensions
|
||||
}
|
||||
finally { ArrayPool<T>.Shared.Return(sharedArray); }
|
||||
}
|
||||
internal static T Average<T>(this IReadOnlyCollection<T> collection)
|
||||
internal static T Avg<T>(this IReadOnlyCollection<T> collection)
|
||||
where T : struct, IMensuraUnit, IEquatable<T>
|
||||
{
|
||||
if (collection == null || collection.Count == 0) return double.NaN.ToUnit<T>();
|
||||
if (collection is T[] array) return array.Average();
|
||||
if (collection is List<T> list) return list.Average();
|
||||
if (collection is T[] array) return array.Avg();
|
||||
if (collection is List<T> list) return list.Avg();
|
||||
|
||||
T[] sharedArray = ArrayPool<T>.Shared.Rent(collection.Count);
|
||||
int index = 0;
|
||||
try
|
||||
{
|
||||
foreach (var item in collection) sharedArray[index++] = item;
|
||||
return new ReadOnlySpan<T>(sharedArray, 0, collection.Count).Average();
|
||||
return new ReadOnlySpan<T>(sharedArray, 0, collection.Count).Avg();
|
||||
}
|
||||
finally { ArrayPool<T>.Shared.Return(sharedArray); }
|
||||
}
|
||||
@@ -461,15 +461,15 @@ internal static partial class AggregateUnitExtensions
|
||||
|
||||
return hasElements ? sum.ToUnit<T>() : default;
|
||||
}
|
||||
internal static T Average<T>(this IEnumerable<T> collection)
|
||||
internal static T Avg<T>(this IEnumerable<T> collection)
|
||||
where T : struct, IMensuraUnit, IEquatable<T>
|
||||
{
|
||||
if (collection == null) return double.NaN.ToUnit<T>();
|
||||
|
||||
if (collection is T[] array) return array.Average();
|
||||
if (collection is List<T> list) return list.Average();
|
||||
if (collection is ICollection<T> col) return col.Average();
|
||||
if (collection is IReadOnlyCollection<T> roc) return roc.Average();
|
||||
if (collection is T[] array) return array.Avg();
|
||||
if (collection is List<T> list) return list.Avg();
|
||||
if (collection is ICollection<T> col) return col.Avg();
|
||||
if (collection is IReadOnlyCollection<T> roc) return roc.Avg();
|
||||
|
||||
double sum = 0;
|
||||
long count = 0;
|
||||
@@ -532,7 +532,7 @@ internal static partial class AggregateUnitExtensions
|
||||
|
||||
|
||||
|
||||
// Sum Average Max Min (nullable) ==========================================
|
||||
// Sum Avg Max Min (nullable) ==========================================
|
||||
|
||||
|
||||
// === ReadOnlySpan ===
|
||||
@@ -568,7 +568,7 @@ internal static partial class AggregateUnitExtensions
|
||||
ArrayPool<double>.Shared.Return(sharedArray);
|
||||
}
|
||||
}
|
||||
internal static T Average<T>(this ReadOnlySpan<T?> units)
|
||||
internal static T Avg<T>(this ReadOnlySpan<T?> units)
|
||||
where T : struct, IMensuraUnit, IEquatable<T>
|
||||
{
|
||||
if (units.IsEmpty)
|
||||
@@ -600,7 +600,7 @@ internal static partial class AggregateUnitExtensions
|
||||
var validValues = new ReadOnlySpan<double>(sharedArray, 0, validCount);
|
||||
ReadOnlySpan<T> validStructs = MemoryMarshal.Cast<double, T>(validValues);
|
||||
|
||||
return validStructs.Average(); // Наш SIMD метод
|
||||
return validStructs.Avg(); // Наш SIMD метод
|
||||
}
|
||||
finally
|
||||
{
|
||||
@@ -692,10 +692,10 @@ internal static partial class AggregateUnitExtensions
|
||||
{
|
||||
return CollectionsMarshal.AsSpan(list).Sum();
|
||||
}
|
||||
internal static T Average<T>(this List<T?> list)
|
||||
internal static T Avg<T>(this List<T?> list)
|
||||
where T : struct, IMensuraUnit, IEquatable<T>
|
||||
{
|
||||
return CollectionsMarshal.AsSpan(list).Average();
|
||||
return CollectionsMarshal.AsSpan(list).Avg();
|
||||
}
|
||||
internal static T Max<T>(this List<T?> list)
|
||||
where T : struct, IMensuraUnit, IEquatable<T>
|
||||
@@ -727,18 +727,18 @@ internal static partial class AggregateUnitExtensions
|
||||
ArrayPool<T?>.Shared.Return(sharedArray);
|
||||
}
|
||||
}
|
||||
internal static T Average<T>(this ICollection<T?> collection)
|
||||
internal static T Avg<T>(this ICollection<T?> collection)
|
||||
where T : struct, IMensuraUnit, IEquatable<T>
|
||||
{
|
||||
if (collection == null || collection.Count == 0) return double.NaN.ToUnit<T>();
|
||||
if (collection is T?[] array) return array.Average();
|
||||
if (collection is List<T?> list) return list.Average();
|
||||
if (collection is T?[] array) return array.Avg();
|
||||
if (collection is List<T?> list) return list.Avg();
|
||||
|
||||
T?[] sharedArray = ArrayPool<T?>.Shared.Rent(collection.Count);
|
||||
try
|
||||
{
|
||||
collection.CopyTo(sharedArray, 0);
|
||||
return new ReadOnlySpan<T?>(sharedArray, 0, collection.Count).Average();
|
||||
return new ReadOnlySpan<T?>(sharedArray, 0, collection.Count).Avg();
|
||||
}
|
||||
finally
|
||||
{
|
||||
@@ -799,19 +799,19 @@ internal static partial class AggregateUnitExtensions
|
||||
}
|
||||
finally { ArrayPool<T?>.Shared.Return(sharedArray); }
|
||||
}
|
||||
internal static T Average<T>(this IReadOnlyCollection<T?> collection)
|
||||
internal static T Avg<T>(this IReadOnlyCollection<T?> collection)
|
||||
where T : struct, IMensuraUnit, IEquatable<T>
|
||||
{
|
||||
if (collection == null || collection.Count == 0) return double.NaN.ToUnit<T>();
|
||||
if (collection is T?[] array) return array.Average();
|
||||
if (collection is List<T?> list) return list.Average();
|
||||
if (collection is T?[] array) return array.Avg();
|
||||
if (collection is List<T?> list) return list.Avg();
|
||||
|
||||
T?[] sharedArray = ArrayPool<T?>.Shared.Rent(collection.Count);
|
||||
int index = 0;
|
||||
try
|
||||
{
|
||||
foreach (var item in collection) sharedArray[index++] = item;
|
||||
return new ReadOnlySpan<T?>(sharedArray, 0, collection.Count).Average();
|
||||
return new ReadOnlySpan<T?>(sharedArray, 0, collection.Count).Avg();
|
||||
}
|
||||
finally { ArrayPool<T?>.Shared.Return(sharedArray); }
|
||||
}
|
||||
@@ -875,15 +875,15 @@ internal static partial class AggregateUnitExtensions
|
||||
|
||||
return hasElements ? sum.ToUnit<T>() : default;
|
||||
}
|
||||
internal static T Average<T>(this IEnumerable<T?> collection)
|
||||
internal static T Avg<T>(this IEnumerable<T?> collection)
|
||||
where T : struct, IMensuraUnit, IEquatable<T>
|
||||
{
|
||||
if (collection == null) return double.NaN.ToUnit<T>();
|
||||
|
||||
if (collection is T?[] array) return array.Average();
|
||||
if (collection is List<T?> list) return list.Average();
|
||||
if (collection is ICollection<T?> col) return col.Average();
|
||||
if (collection is IReadOnlyCollection<T?> roc) return roc.Average();
|
||||
if (collection is T?[] array) return array.Avg();
|
||||
if (collection is List<T?> list) return list.Avg();
|
||||
if (collection is ICollection<T?> col) return col.Avg();
|
||||
if (collection is IReadOnlyCollection<T?> roc) return roc.Avg();
|
||||
|
||||
double sum = 0;
|
||||
long count = 0;
|
||||
|
||||
@@ -12,6 +12,7 @@ public static partial class DoubleExtensions
|
||||
internal static double ToDouble(this nuint number) => Convert.ToDouble(number);
|
||||
internal static double ToDouble(this long number) => Convert.ToDouble(number);
|
||||
internal static double ToDouble(this ulong number) => Convert.ToDouble(number);
|
||||
internal static double ToDouble(this Half number) => Convert.ToDouble(number);
|
||||
internal static double ToDouble(this float number) => Convert.ToDouble(number);
|
||||
internal static double ToDouble(this decimal number) => Convert.ToDouble(number);
|
||||
|
||||
@@ -25,6 +26,7 @@ public static partial class DoubleExtensions
|
||||
internal static double ToDouble(this nuint? number) => number is null ? 0d : Convert.ToDouble(number);
|
||||
internal static double ToDouble(this long? number) => number is null ? 0d : Convert.ToDouble(number);
|
||||
internal static double ToDouble(this ulong? number) => number is null ? 0d : Convert.ToDouble(number);
|
||||
internal static double ToDouble(this Half? number) => number is null ? 0d : Convert.ToDouble(number);
|
||||
internal static double ToDouble(this float? number) => number is null ? 0d : Convert.ToDouble(number);
|
||||
internal static double ToDouble(this decimal? number) => number is null ? 0d : Convert.ToDouble(number);
|
||||
|
||||
@@ -59,6 +61,8 @@ public static partial class DoubleExtensions
|
||||
{ foreach (var number in numbers) yield return number; }
|
||||
internal static IEnumerable<double> ToDoubleIterator(this IEnumerable<ulong> numbers)
|
||||
{ foreach (var number in numbers) yield return number; }
|
||||
internal static IEnumerable<double> ToDoubleIterator(this IEnumerable<Half> numbers)
|
||||
{ foreach (var number in numbers) yield return (double)number; }
|
||||
internal static IEnumerable<double> ToDoubleIterator(this IEnumerable<float> numbers)
|
||||
{ foreach (var number in numbers) yield return number; }
|
||||
internal static IEnumerable<double> ToDoubleIterator(this IEnumerable<decimal> numbers)
|
||||
@@ -287,6 +291,37 @@ public static partial class DoubleExtensions
|
||||
for (; i < len; i++) Unsafe.Add(ref dstRef, i) = Unsafe.Add(ref srcRef, i);
|
||||
}
|
||||
|
||||
[MethodImpl(MethodImplOptions.AggressiveInlining)]
|
||||
internal static void ToDoubleCore(this ReadOnlySpan<Half> source, int len, Span<double> destination)
|
||||
{
|
||||
if (len <= 0) return;
|
||||
|
||||
ref Half srcRef = ref MemoryMarshal.GetReference(source);
|
||||
ref double dstRef = ref MemoryMarshal.GetReference(destination);
|
||||
|
||||
int i = 0;
|
||||
int unrollEnd = len & ~7; // Шаг по 8 элементов (8 * 8 байт double = 64 байта строки кэша)
|
||||
|
||||
// Основной конвейер
|
||||
for (; i < unrollEnd; i += 8)
|
||||
{
|
||||
Unsafe.Add(ref dstRef, i) = (double)Unsafe.Add(ref srcRef, i);
|
||||
Unsafe.Add(ref dstRef, i + 1) = (double)Unsafe.Add(ref srcRef, i + 1);
|
||||
Unsafe.Add(ref dstRef, i + 2) = (double)Unsafe.Add(ref srcRef, i + 2);
|
||||
Unsafe.Add(ref dstRef, i + 3) = (double)Unsafe.Add(ref srcRef, i + 3);
|
||||
Unsafe.Add(ref dstRef, i + 4) = (double)Unsafe.Add(ref srcRef, i + 4);
|
||||
Unsafe.Add(ref dstRef, i + 5) = (double)Unsafe.Add(ref srcRef, i + 5);
|
||||
Unsafe.Add(ref dstRef, i + 6) = (double)Unsafe.Add(ref srcRef, i + 6);
|
||||
Unsafe.Add(ref dstRef, i + 7) = (double)Unsafe.Add(ref srcRef, i + 7);
|
||||
}
|
||||
|
||||
// Остаток цикла
|
||||
for (; i < len; i++)
|
||||
{
|
||||
Unsafe.Add(ref dstRef, i) = (double)Unsafe.Add(ref srcRef, i);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// ========================================================================
|
||||
// ГРУППА 4: Типы без SIMD и новые типы .NET 7 (decimal, nint, Int128, UInt128).
|
||||
@@ -1224,6 +1259,89 @@ public static partial class DoubleExtensions
|
||||
}
|
||||
|
||||
|
||||
[MethodImpl(MethodImplOptions.AggressiveInlining)]
|
||||
private static double[] ToDouble(this IEnumerable<Half> source, int count)
|
||||
{
|
||||
if (count == 0) return [];
|
||||
int i = 0;
|
||||
double[] destination = new double[count];
|
||||
ref double dstRef = ref MemoryMarshal.GetArrayDataReference(destination);
|
||||
foreach (var item in source)
|
||||
{
|
||||
if ((uint)i >= (uint)count) break;
|
||||
Unsafe.Add(ref dstRef, i++) = (double)item;
|
||||
}
|
||||
return destination;
|
||||
}
|
||||
public static double[] ToDouble(this Half[] numbers)
|
||||
{
|
||||
if (numbers is null) return null!;
|
||||
int len = numbers.Length;
|
||||
if (len == 0) return [];
|
||||
|
||||
var result = new double[len];
|
||||
numbers.ToDoubleCore(len, result);
|
||||
return result;
|
||||
}
|
||||
public static List<double> ToDouble(this List<Half> numbers)
|
||||
{
|
||||
if (numbers is null) return null!;
|
||||
int len = numbers.Count;
|
||||
if (len == 0) return [];
|
||||
|
||||
var result = new double[len];
|
||||
CollectionsMarshal.AsSpan(numbers).ToDoubleCore(len, result);
|
||||
return result.WrapAsList();
|
||||
}
|
||||
public static void ToDouble(this ICollection<Half> numbers, Span<double> destination)
|
||||
{
|
||||
if (numbers is null) return;
|
||||
int count = numbers.Count;
|
||||
if (count == 0) return;
|
||||
if (destination.Length < count)
|
||||
throw new ArgumentException("Destination too short");
|
||||
|
||||
if (numbers is Half[] array) { array.ToDoubleCore(count, destination); return; }
|
||||
if (numbers is List<Half> list) { CollectionsMarshal.AsSpan(list).ToDoubleCore(count, destination); return; }
|
||||
|
||||
int i = 0;
|
||||
ref double dstRef = ref MemoryMarshal.GetReference(destination);
|
||||
foreach (var item in numbers)
|
||||
{
|
||||
if ((uint)i >= (uint)count) break;
|
||||
Unsafe.Add(ref dstRef, i++) = (double)item;
|
||||
}
|
||||
}
|
||||
public static void ToDouble(this IReadOnlyCollection<Half> numbers, Span<double> destination)
|
||||
{
|
||||
if (numbers is null) return;
|
||||
int count = numbers.Count;
|
||||
if (count == 0) return;
|
||||
if (destination.Length < count)
|
||||
throw new ArgumentException("Destination too short");
|
||||
|
||||
if (numbers is Half[] array) { array.ToDoubleCore(count, destination); return; }
|
||||
if (numbers is List<Half> list) { CollectionsMarshal.AsSpan(list).ToDoubleCore(count, destination); return; }
|
||||
|
||||
int i = 0;
|
||||
ref double dstRef = ref MemoryMarshal.GetReference(destination);
|
||||
foreach (var item in numbers)
|
||||
{
|
||||
if ((uint)i >= (uint)count) break;
|
||||
Unsafe.Add(ref dstRef, i++) = (double)item;
|
||||
}
|
||||
}
|
||||
public static IEnumerable<double> ToDouble(this IEnumerable<Half> numbers)
|
||||
{
|
||||
if (numbers is null) return null!;
|
||||
if (numbers is Half[] array) return array.ToDouble();
|
||||
if (numbers is List<Half> list) return list.ToDouble();
|
||||
if (numbers is ICollection<Half> col) return col.ToDouble(col.Count);
|
||||
if (numbers is IReadOnlyCollection<Half> roc) return roc.ToDouble(roc.Count);
|
||||
return numbers.ToDoubleIterator();
|
||||
}
|
||||
|
||||
|
||||
[MethodImpl(MethodImplOptions.AggressiveInlining)]
|
||||
private static double[] ToDouble(this IEnumerable<float> source, int count)
|
||||
{
|
||||
@@ -1580,6 +1698,8 @@ public static partial class DoubleExtensions
|
||||
{ foreach (var number in numbers) yield return number; }
|
||||
internal static IEnumerable<double?> ToDoubleIterator(this IEnumerable<ulong?> numbers)
|
||||
{ foreach (var number in numbers) yield return number; }
|
||||
internal static IEnumerable<double?> ToDoubleIterator(this IEnumerable<Half?> numbers)
|
||||
{ foreach (var number in numbers) yield return (double?)number; }
|
||||
internal static IEnumerable<double?> ToDoubleIterator(this IEnumerable<float?> numbers)
|
||||
{ foreach (var number in numbers) yield return number; }
|
||||
internal static IEnumerable<double?> ToDoubleIterator(this IEnumerable<decimal?> numbers)
|
||||
@@ -2722,6 +2842,89 @@ public static partial class DoubleExtensions
|
||||
}
|
||||
|
||||
|
||||
[MethodImpl(MethodImplOptions.AggressiveInlining)]
|
||||
private static double?[] ToDouble(this IEnumerable<Half?> source, int count)
|
||||
{
|
||||
if (count == 0) return [];
|
||||
int i = 0;
|
||||
double?[] destination = new double?[count];
|
||||
ref double? dstRef = ref MemoryMarshal.GetArrayDataReference(destination);
|
||||
foreach (var item in source)
|
||||
{
|
||||
if ((uint)i >= (uint)count) break;
|
||||
Unsafe.Add(ref dstRef, i++) = (double?)item;
|
||||
}
|
||||
return destination;
|
||||
}
|
||||
public static double?[] ToDouble(this Half?[] numbers)
|
||||
{
|
||||
if (numbers is null) return null!;
|
||||
int len = numbers.Length;
|
||||
if (len == 0) return [];
|
||||
|
||||
var result = new double?[len];
|
||||
numbers.ToDoubleCore(len, result);
|
||||
return result;
|
||||
}
|
||||
public static List<double?> ToDouble(this List<Half?> numbers)
|
||||
{
|
||||
if (numbers is null) return null!;
|
||||
int len = numbers.Count;
|
||||
if (len == 0) return [];
|
||||
|
||||
var result = new double?[len];
|
||||
CollectionsMarshal.AsSpan(numbers).ToDoubleCore(len, result);
|
||||
return result.WrapAsList();
|
||||
}
|
||||
public static void ToDouble(this ICollection<Half?> numbers, Span<double?> destination)
|
||||
{
|
||||
if (numbers is null) return;
|
||||
int count = numbers.Count;
|
||||
if (count == 0) return;
|
||||
if (destination.Length < count)
|
||||
throw new ArgumentException("Destination too short");
|
||||
|
||||
if (numbers is Half?[] array) { array.ToDoubleCore(count, destination); return; }
|
||||
if (numbers is List<Half?> list) { CollectionsMarshal.AsSpan(list).ToDoubleCore(count, destination); return; }
|
||||
|
||||
int i = 0;
|
||||
ref double? dstRef = ref MemoryMarshal.GetReference(destination);
|
||||
foreach (var item in numbers)
|
||||
{
|
||||
if ((uint)i >= (uint)count) break;
|
||||
Unsafe.Add(ref dstRef, i++) = (double?)item;
|
||||
}
|
||||
}
|
||||
public static void ToDouble(this IReadOnlyCollection<Half?> numbers, Span<double?> destination)
|
||||
{
|
||||
if (numbers is null) return;
|
||||
int count = numbers.Count;
|
||||
if (count == 0) return;
|
||||
if (destination.Length < count)
|
||||
throw new ArgumentException("Destination too short");
|
||||
|
||||
if (numbers is Half?[] array) { array.ToDoubleCore(count, destination); return; }
|
||||
if (numbers is List<Half?> list) { CollectionsMarshal.AsSpan(list).ToDoubleCore(count, destination); return; }
|
||||
|
||||
int i = 0;
|
||||
ref double? dstRef = ref MemoryMarshal.GetReference(destination);
|
||||
foreach (var item in numbers)
|
||||
{
|
||||
if ((uint)i >= (uint)count) break;
|
||||
Unsafe.Add(ref dstRef, i++) = (double?)item;
|
||||
}
|
||||
}
|
||||
public static IEnumerable<double?> ToDouble(this IEnumerable<Half?> numbers)
|
||||
{
|
||||
if (numbers is null) return null!;
|
||||
if (numbers is Half?[] array) return array.ToDouble();
|
||||
if (numbers is List<Half?> list) return list.ToDouble();
|
||||
if (numbers is ICollection<Half?> col) return col.ToDouble(col.Count);
|
||||
if (numbers is IReadOnlyCollection<Half?> roc) return roc.ToDouble(roc.Count);
|
||||
return numbers.ToDoubleIterator();
|
||||
}
|
||||
|
||||
|
||||
[MethodImpl(MethodImplOptions.AggressiveInlining)]
|
||||
private static double?[] ToDouble(this IEnumerable<float?> source, int count)
|
||||
{
|
||||
|
||||
@@ -1,9 +1,9 @@
|
||||
namespace QWERTYkez.Mensura;
|
||||
|
||||
[StructLayout(LayoutKind.Sequential)]
|
||||
internal unsafe struct ListLayoutMimic<T>
|
||||
internal class ListLayoutMimic<T>
|
||||
{
|
||||
public T[] Items;
|
||||
public T[] Items = null!;
|
||||
public int Size;
|
||||
public int Version;
|
||||
}
|
||||
File diff suppressed because it is too large
Load Diff
Reference in New Issue
Block a user