diff --git a/src/flatcollections-array/FlatArray.Tests/Internal.Helper/FlatArray/FlatArray.Verify.cs b/src/flatcollections-array/FlatArray.Tests/Internal.Helper/FlatArray/FlatArray.Verify.cs index 676a274e..f38e32dc 100644 --- a/src/flatcollections-array/FlatArray.Tests/Internal.Helper/FlatArray/FlatArray.Verify.cs +++ b/src/flatcollections-array/FlatArray.Tests/Internal.Helper/FlatArray/FlatArray.Verify.cs @@ -1,4 +1,6 @@ using System; +using System.Collections.Generic; +using System.Linq; using Xunit; namespace PrimeFuncPack.Core.Tests; @@ -11,6 +13,22 @@ internal static void VerifyInnerState(this FlatArray actual, T[]? expected Assert.StrictEqual(expectedLength, actualLength); var actualItems = actual.GetFieldValue("items"); - Assert.Equal(expectedItems, actualItems); + var effectiveItems = actualItems is null + ? null + : new ReadOnlySpan(actualItems, 0, actualLength).ToArray(); + + Assert.Equal(expectedItems, effectiveItems); + + if (actualItems is not null) + { + var effectiveRest = new ReadOnlySpan( + actualItems, + actualLength, + actualItems.Length - effectiveItems!.Length) + .ToArray(); + + var actualRestIsDefault = effectiveRest.All(item => EqualityComparer.Default.Equals(item, default)); + Assert.True(actualRestIsDefault); + } } } \ No newline at end of file diff --git a/src/flatcollections-array/FlatArray.Tests/Tests.FlatArray.T.Builder/Builder/Builder.MoveToFlatArray.cs b/src/flatcollections-array/FlatArray.Tests/Tests.FlatArray.T.Builder/Builder/Builder.MoveToFlatArray.cs index fe0472d5..5caad14b 100644 --- a/src/flatcollections-array/FlatArray.Tests/Tests.FlatArray.T.Builder/Builder/Builder.MoveToFlatArray.cs +++ b/src/flatcollections-array/FlatArray.Tests/Tests.FlatArray.T.Builder/Builder/Builder.MoveToFlatArray.cs @@ -30,11 +30,11 @@ public void MoveToFlatArray_SourceIsNotDefault_ExpectArrayItemsAreBuilderItems() { const int length = 3; - var sourceItems = new[] { PlusFifteenIdRefType, null, MinusFifteenIdRefType, ZeroIdRefType }; + var sourceItems = new[] { PlusFifteenIdRefType, null, MinusFifteenIdRefType, null }; var source = sourceItems.InitializeFlatArrayBuilder(length); var actual = source.MoveToFlatArray(); - var expectedItems = new[] { PlusFifteenIdRefType, null, MinusFifteenIdRefType, ZeroIdRefType }; + var expectedItems = new[] { PlusFifteenIdRefType, null, MinusFifteenIdRefType }; actual.VerifyInnerState(expectedItems, length); } diff --git a/src/flatcollections-array/FlatArray/FlatArray.T.Builder/FlatArray.Builder.TrimExcess.cs b/src/flatcollections-array/FlatArray/FlatArray.T.Builder/FlatArray.Builder.TrimExcess.cs index fcf39dd0..3c0795c6 100644 --- a/src/flatcollections-array/FlatArray/FlatArray.T.Builder/FlatArray.Builder.TrimExcess.cs +++ b/src/flatcollections-array/FlatArray/FlatArray.T.Builder/FlatArray.Builder.TrimExcess.cs @@ -1,6 +1,4 @@ -using System.Runtime.CompilerServices; - -namespace System; +namespace System; partial struct FlatArray { @@ -14,7 +12,7 @@ internal void TrimExcess() var length = this.length; var items = this.items; - if (length == items.Length) + if (items.Length == length) { return; } diff --git a/src/flatcollections-array/FlatArray/FlatArray.T.JsonConverter/FlatArray.JsonConverter.Read.cs b/src/flatcollections-array/FlatArray/FlatArray.T.JsonConverter/FlatArray.JsonConverter.Read.cs index 654f1612..1a56b18f 100644 --- a/src/flatcollections-array/FlatArray/FlatArray.T.JsonConverter/FlatArray.JsonConverter.Read.cs +++ b/src/flatcollections-array/FlatArray/FlatArray.T.JsonConverter/FlatArray.JsonConverter.Read.cs @@ -42,12 +42,7 @@ public override FlatArray Read(ref Utf8JsonReader reader, Type typeToConvert, array[actualCount++] = InnerReadItem(ref reader, options); } - if (actualCount < array.Length) - { - InnerArrayHelper.TruncateUnchecked(ref array, actualCount); - } - - return new(array, default); + return new(actualCount, array); } [MethodImpl(MethodImplOptions.AggressiveInlining)] diff --git a/src/flatcollections-array/FlatArray/FlatArray.T/FlatArray.TrimExcess.cs b/src/flatcollections-array/FlatArray/FlatArray.T/FlatArray.TrimExcess.cs new file mode 100644 index 00000000..4ea9ff60 --- /dev/null +++ b/src/flatcollections-array/FlatArray/FlatArray.T/FlatArray.TrimExcess.cs @@ -0,0 +1,9 @@ +namespace System; + +partial struct FlatArray +{ + // TODO: Add the tests and make public + internal FlatArray TrimExcess() + => + items is null || items.Length == length ? this : new(InnerArrayHelper.Copy(items, length), default); +} diff --git a/src/flatcollections-array/FlatArray/FlatArray.T/InnerFactory/FlatArray.InnerFactory.FromIEnumerable.cs b/src/flatcollections-array/FlatArray/FlatArray.T/InnerFactory/FlatArray.InnerFactory.FromIEnumerable.cs index 25e8422e..0023e7b4 100644 --- a/src/flatcollections-array/FlatArray/FlatArray.T/InnerFactory/FlatArray.InnerFactory.FromIEnumerable.cs +++ b/src/flatcollections-array/FlatArray/FlatArray.T/InnerFactory/FlatArray.InnerFactory.FromIEnumerable.cs @@ -31,12 +31,7 @@ internal static FlatArray FromIEnumerable(IEnumerable source, int estimate array[actualCount++] = enumerator.Current; } - if (actualCount < array.Length) - { - InnerArrayHelper.TruncateUnchecked(ref array, actualCount); - } - - return new(array, default); + return new(actualCount, array); } } } diff --git a/src/flatcollections-array/FlatArray/FlatArray.T/InnerFactory/FlatArray.InnerFactory.FromIReadOnlyList.cs b/src/flatcollections-array/FlatArray/FlatArray.T/InnerFactory/FlatArray.InnerFactory.FromIReadOnlyList.cs index 1451ebf4..6491c9cb 100644 --- a/src/flatcollections-array/FlatArray/FlatArray.T/InnerFactory/FlatArray.InnerFactory.FromIReadOnlyList.cs +++ b/src/flatcollections-array/FlatArray/FlatArray.T/InnerFactory/FlatArray.InnerFactory.FromIReadOnlyList.cs @@ -31,12 +31,7 @@ internal static FlatArray FromIReadOnlyList(IReadOnlyList source) actualCount++; } - if (actualCount < array.Length) - { - InnerArrayHelper.TruncateUnchecked(ref array, actualCount); - } - - return new(array, default); + return new(actualCount, array); } } }