From b2381d75c92b81c239c7faf6fded782ac38e4c7a Mon Sep 17 00:00:00 2001 From: Andrei Sergeev Date: Thu, 24 Aug 2023 21:19:46 +0400 Subject: [PATCH] Add constructors / refactor --- .../FlatArray.Builder.Factory.Empty.cs | 2 +- ...s => FlatArray.AsSpanOrMemory.Explicit.cs} | 6 +- .../FlatArray.AsSpanOrMemory.Implicit.cs | 16 +++++ .../FlatArray/FlatArray.T/FlatArray.Clone.cs | 2 +- .../FlatArray.Factory.Constructor.cs | 69 ++++++++++++++++++- .../FlatArray.Factory.Explicit.From.Array.cs | 23 ++++--- ...atArray.Factory.Explicit.From.FlatArray.cs | 36 +++++----- ...Array.Factory.Explicit.From.IEnumerable.cs | 30 ++++---- ...ay.Factory.Explicit.From.ImmutableArray.cs | 43 +++++++----- .../FlatArray.Factory.Explicit.From.List.cs | 29 +++++--- .../FlatArray.Factory.Implicit.From.cs | 14 ++-- .../FlatArray.ToCollection.Implicit.cs | 4 ++ .../FlatArray.InnerFactory.FromArray.cs | 23 ------- .../FlatArray.InnerFactory.FromFlatArray.cs | 23 ------- ...atArray.InnerFactory.FromImmutableArray.cs | 41 ----------- .../FlatArray.InnerFactory.FromList.cs | 42 ----------- ...erFactoryHelper.FromICollection.Trusted.cs | 26 +++++++ ...ray.InnerFactoryHelper.FromICollection.cs} | 6 +- ...ray.InnerFactoryHelper.FromIEnumerable.cs} | 2 +- ...y.InnerFactoryHelper.FromIReadOnlyList.cs} | 2 +- ...ory.cs => FlatArray.InnerFactoryHelper.cs} | 2 +- .../FlatArray/FlatArray.Factory.From.Array.cs | 4 +- .../FlatArray.Factory.From.FlatArray.cs | 8 +-- .../FlatArray.Factory.From.ImmutableArray.cs | 8 +-- .../FlatArray/FlatArray.Factory.From.List.cs | 2 +- .../FlatArray/FlatArray.Factory.From.Span.cs | 4 +- .../Extensions.ToFlatArray.FromArray.cs | 4 +- .../Extensions.ToFlatArray.FromFlatArray.cs | 8 +-- ...tensions.ToFlatArray.FromImmutableArray.cs | 8 +-- .../Extensions.ToFlatArray.FromList.cs | 2 +- .../Extensions.ToFlatArray.FromSpan.cs | 4 +- 31 files changed, 258 insertions(+), 235 deletions(-) rename src/flatcollections-array/FlatArray/FlatArray.T/{FlatArray.AsSpanOrMemory.cs => FlatArray.AsSpanOrMemory.Explicit.cs} (51%) create mode 100644 src/flatcollections-array/FlatArray/FlatArray.T/FlatArray.AsSpanOrMemory.Implicit.cs delete mode 100644 src/flatcollections-array/FlatArray/FlatArray.T/InnerFactory/FlatArray.InnerFactory.FromArray.cs delete mode 100644 src/flatcollections-array/FlatArray/FlatArray.T/InnerFactory/FlatArray.InnerFactory.FromFlatArray.cs delete mode 100644 src/flatcollections-array/FlatArray/FlatArray.T/InnerFactory/FlatArray.InnerFactory.FromImmutableArray.cs delete mode 100644 src/flatcollections-array/FlatArray/FlatArray.T/InnerFactory/FlatArray.InnerFactory.FromList.cs create mode 100644 src/flatcollections-array/FlatArray/FlatArray.T/InnerFactory/FlatArray.InnerFactoryHelper.FromICollection.Trusted.cs rename src/flatcollections-array/FlatArray/FlatArray.T/InnerFactory/{FlatArray.InnerFactory.FromICollection.cs => FlatArray.InnerFactoryHelper.FromICollection.cs} (77%) rename src/flatcollections-array/FlatArray/FlatArray.T/InnerFactory/{FlatArray.InnerFactory.FromIEnumerable.cs => FlatArray.InnerFactoryHelper.FromIEnumerable.cs} (96%) rename src/flatcollections-array/FlatArray/FlatArray.T/InnerFactory/{FlatArray.InnerFactory.FromIReadOnlyList.cs => FlatArray.InnerFactoryHelper.FromIReadOnlyList.cs} (96%) rename src/flatcollections-array/FlatArray/FlatArray.T/InnerFactory/{FlatArray.InnerFactory.cs => FlatArray.InnerFactoryHelper.cs} (55%) diff --git a/src/flatcollections-array/FlatArray/FlatArray.Builder/FlatArray.Builder.Factory.Empty.cs b/src/flatcollections-array/FlatArray/FlatArray.Builder/FlatArray.Builder.Factory.Empty.cs index e238c42e..cfbf0c94 100644 --- a/src/flatcollections-array/FlatArray/FlatArray.Builder/FlatArray.Builder.Factory.Empty.cs +++ b/src/flatcollections-array/FlatArray/FlatArray.Builder/FlatArray.Builder.Factory.Empty.cs @@ -10,7 +10,7 @@ partial class Builder [MethodImpl(MethodImplOptions.AggressiveInlining)] internal static FlatArray.Builder Empty() => - new(); + FlatArray.Builder.Empty(); // TODO: Add the tests and make public [MethodImpl(MethodImplOptions.AggressiveInlining)] diff --git a/src/flatcollections-array/FlatArray/FlatArray.T/FlatArray.AsSpanOrMemory.cs b/src/flatcollections-array/FlatArray/FlatArray.T/FlatArray.AsSpanOrMemory.Explicit.cs similarity index 51% rename from src/flatcollections-array/FlatArray/FlatArray.T/FlatArray.AsSpanOrMemory.cs rename to src/flatcollections-array/FlatArray/FlatArray.T/FlatArray.AsSpanOrMemory.Explicit.cs index aceb7ec3..b0dcac52 100644 --- a/src/flatcollections-array/FlatArray/FlatArray.T/FlatArray.AsSpanOrMemory.cs +++ b/src/flatcollections-array/FlatArray/FlatArray.T/FlatArray.AsSpanOrMemory.Explicit.cs @@ -1,11 +1,15 @@ -namespace System; +using System.Runtime.CompilerServices; + +namespace System; partial struct FlatArray { + [MethodImpl(MethodImplOptions.AggressiveInlining)] public ReadOnlySpan AsSpan() => InnerAsSpan(); + [MethodImpl(MethodImplOptions.AggressiveInlining)] public ReadOnlyMemory AsMemory() => InnerAsMemory(); diff --git a/src/flatcollections-array/FlatArray/FlatArray.T/FlatArray.AsSpanOrMemory.Implicit.cs b/src/flatcollections-array/FlatArray/FlatArray.T/FlatArray.AsSpanOrMemory.Implicit.cs new file mode 100644 index 00000000..1e6507a0 --- /dev/null +++ b/src/flatcollections-array/FlatArray/FlatArray.T/FlatArray.AsSpanOrMemory.Implicit.cs @@ -0,0 +1,16 @@ +using System.Runtime.CompilerServices; + +namespace System; + +partial struct FlatArray +{ + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static implicit operator ReadOnlySpan(FlatArray flatArray) + => + flatArray.InnerAsSpan(); + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static implicit operator ReadOnlyMemory(FlatArray flatArray) + => + flatArray.InnerAsMemory(); +} diff --git a/src/flatcollections-array/FlatArray/FlatArray.T/FlatArray.Clone.cs b/src/flatcollections-array/FlatArray/FlatArray.T/FlatArray.Clone.cs index 6fd24102..7bcb0865 100644 --- a/src/flatcollections-array/FlatArray/FlatArray.T/FlatArray.Clone.cs +++ b/src/flatcollections-array/FlatArray/FlatArray.T/FlatArray.Clone.cs @@ -4,5 +4,5 @@ partial struct FlatArray { public FlatArray Clone() => - InnerFactory.FromFlatArray(this); + new(this); } diff --git a/src/flatcollections-array/FlatArray/FlatArray.T/FlatArray.Factory.Constructor.cs b/src/flatcollections-array/FlatArray/FlatArray.T/FlatArray.Factory.Constructor.cs index 2369da20..0ed24d2c 100644 --- a/src/flatcollections-array/FlatArray/FlatArray.T/FlatArray.Factory.Constructor.cs +++ b/src/flatcollections-array/FlatArray/FlatArray.T/FlatArray.Factory.Constructor.cs @@ -1,4 +1,5 @@ -using System.Diagnostics.CodeAnalysis; +using System.Collections.Immutable; +using System.Diagnostics.CodeAnalysis; using System.Runtime.CompilerServices; namespace System; @@ -18,6 +19,72 @@ public FlatArray([AllowNull] params T[] source) items = InnerArrayHelper.Copy(source); } + // TODO: Add the tests and make public + [MethodImpl(MethodImplOptions.AggressiveInlining)] + internal FlatArray(FlatArray source) + { + if (source.length == default) + { + this = default; + return; + } + + length = source.length; + items = InnerArrayHelper.Copy(source.items!, source.length); + } + + // TODO: Add the tests and make public + [MethodImpl(MethodImplOptions.AggressiveInlining)] + internal FlatArray(FlatArray? source) + { + var sourceValue = source.GetValueOrDefault(); + + if (sourceValue.length == default) + { + this = default; + return; + } + + length = sourceValue.length; + items = InnerArrayHelper.Copy(sourceValue.items!, sourceValue.length); + } + + // TODO: Add the tests and make public + [MethodImpl(MethodImplOptions.AggressiveInlining)] + internal FlatArray(ImmutableArray source) + { + if (source.IsDefaultOrEmpty) + { + this = default; + return; + } + + var items = new T[source.Length]; + source.CopyTo(items); + + length = source.Length; + this.items = items; + } + + // TODO: Add the tests and make public + [MethodImpl(MethodImplOptions.AggressiveInlining)] + internal FlatArray(ImmutableArray? source) + { + var sourceValue = source.GetValueOrDefault(); + + if (sourceValue.IsDefaultOrEmpty) + { + this = default; + return; + } + + var items = new T[sourceValue.Length]; + sourceValue.CopyTo(items); + + length = sourceValue.Length; + this.items = items; + } + // TODO: Add the tests and make public [MethodImpl(MethodImplOptions.AggressiveInlining)] internal FlatArray(ReadOnlySpan source) diff --git a/src/flatcollections-array/FlatArray/FlatArray.T/FlatArray.Factory.Explicit.From.Array.cs b/src/flatcollections-array/FlatArray/FlatArray.T/FlatArray.Factory.Explicit.From.Array.cs index d98b8334..15b194ab 100644 --- a/src/flatcollections-array/FlatArray/FlatArray.T/FlatArray.Factory.Explicit.From.Array.cs +++ b/src/flatcollections-array/FlatArray/FlatArray.T/FlatArray.Factory.Explicit.From.Array.cs @@ -7,23 +7,26 @@ partial struct FlatArray { public static FlatArray From([AllowNull] params T[] source) => - source is null ? default : InnerFactory.FromArray(source); + new(source); // TODO: Add the tests and make public internal static FlatArray From([AllowNull] T[] source, int start, int length) - => - InternalFromArrayChecked(source, start, length); - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - internal static FlatArray InternalFromArrayChecked([AllowNull] T[] source, int start, int length) { - var sourceLength = source?.Length ?? default; + InnerValidateRange(); - if (InnerAllocHelper.IsSegmentWithinLength(start, length, sourceLength) is not true) + return source is null || length == default + ? default + : new(InnerArrayHelper.CopySegment(source, start, length), default); + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + void InnerValidateRange() { + var sourceLength = source?.Length ?? default; + if (InnerAllocHelper.IsSegmentWithinLength(start, length, sourceLength)) + { + return; + } throw InnerExceptionFactory.SegmentIsNotWithinArray(start, length, sourceLength); } - - return source is null ? default : InnerFactory.FromArray(source, start, length); } } diff --git a/src/flatcollections-array/FlatArray/FlatArray.T/FlatArray.Factory.Explicit.From.FlatArray.cs b/src/flatcollections-array/FlatArray/FlatArray.T/FlatArray.Factory.Explicit.From.FlatArray.cs index bb3b195a..008ae253 100644 --- a/src/flatcollections-array/FlatArray/FlatArray.T/FlatArray.Factory.Explicit.From.FlatArray.cs +++ b/src/flatcollections-array/FlatArray/FlatArray.T/FlatArray.Factory.Explicit.From.FlatArray.cs @@ -6,30 +6,34 @@ partial struct FlatArray { public static FlatArray From(FlatArray source) => - InnerFactory.FromFlatArray(source); + new(source); // TODO: Add the tests and make public internal static FlatArray From(FlatArray source, int start, int length) - => - InternalFromFlatArrayChecked(source, start, length); + { + InnerValidateRange(); + + return length == default + ? default + : new(InnerArrayHelper.CopySegment(source.items!, start, length), default); + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + void InnerValidateRange() + { + if (InnerAllocHelper.IsSegmentWithinLength(start, length, source.length)) + { + return; + } + throw InnerExceptionFactory.SegmentIsNotWithinArray(start, length, source.length); + } + } public static FlatArray From(FlatArray? source) => - InnerFactory.FromFlatArray(source.GetValueOrDefault()); + new(source); // TODO: Add the tests and make public internal static FlatArray From(FlatArray? source, int start, int length) => - InternalFromFlatArrayChecked(source.GetValueOrDefault(), start, length); - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - internal static FlatArray InternalFromFlatArrayChecked(FlatArray source, int start, int length) - { - if (InnerAllocHelper.IsSegmentWithinLength(start, length, source.length) is not true) - { - throw InnerExceptionFactory.SegmentIsNotWithinArray(start, length, source.length); - } - - return InnerFactory.FromFlatArray(source, start, length); - } + From(source.GetValueOrDefault(), start, length); } diff --git a/src/flatcollections-array/FlatArray/FlatArray.T/FlatArray.Factory.Explicit.From.IEnumerable.cs b/src/flatcollections-array/FlatArray/FlatArray.T/FlatArray.Factory.Explicit.From.IEnumerable.cs index b5636c85..1dc6235c 100644 --- a/src/flatcollections-array/FlatArray/FlatArray.T/FlatArray.Factory.Explicit.From.IEnumerable.cs +++ b/src/flatcollections-array/FlatArray/FlatArray.T/FlatArray.Factory.Explicit.From.IEnumerable.cs @@ -12,31 +12,35 @@ public static FlatArray From([AllowNull] IEnumerable source) { null => default, - T[] array + T[] items => - InnerFactory.FromArray(array), + items.Length == default ? default : new(InnerArrayHelper.Copy(items), default), - List list + List items => - InnerFactory.FromList(list), + InnerFactoryHelper.FromICollectionTrusted(items), - ImmutableArray immutableArray + FlatList items => - InnerFactory.FromImmutableArray(immutableArray), + InnerFactoryHelper.FromICollectionTrusted(items), - ICollection coll + ImmutableArray items => - InnerFactory.FromICollection(coll), + new(items), - IReadOnlyList list + ICollection items => - InnerFactory.FromIReadOnlyList(list), + InnerFactoryHelper.FromICollection(items), - IReadOnlyCollection coll + IReadOnlyList items => - InnerFactory.FromIEnumerable(coll, coll.Count), + InnerFactoryHelper.FromIReadOnlyList(items), + + IReadOnlyCollection items + => + InnerFactoryHelper.FromIEnumerable(items, items.Count), _ => - InnerFactory.FromIEnumerable(source) + InnerFactoryHelper.FromIEnumerable(source) }; } diff --git a/src/flatcollections-array/FlatArray/FlatArray.T/FlatArray.Factory.Explicit.From.ImmutableArray.cs b/src/flatcollections-array/FlatArray/FlatArray.T/FlatArray.Factory.Explicit.From.ImmutableArray.cs index 6528c0f0..46de9475 100644 --- a/src/flatcollections-array/FlatArray/FlatArray.T/FlatArray.Factory.Explicit.From.ImmutableArray.cs +++ b/src/flatcollections-array/FlatArray/FlatArray.T/FlatArray.Factory.Explicit.From.ImmutableArray.cs @@ -7,32 +7,41 @@ partial struct FlatArray { public static FlatArray From(ImmutableArray source) => - InnerFactory.FromImmutableArray(source); + new(source); // TODO: Add the tests and make public internal static FlatArray From(ImmutableArray source, int start, int length) - => - InternalFromImmutableArrayChecked(source, start, length); + { + InnerValidateRange(); - public static FlatArray From(ImmutableArray? source) - => - InnerFactory.FromImmutableArray(source.GetValueOrDefault()); + if (length == default) + { + return default; + } - // TODO: Add the tests and make public - internal static FlatArray From(ImmutableArray? source, int start, int length) - => - InternalFromImmutableArrayChecked(source.GetValueOrDefault(), start, length); + var array = new T[length]; + source.CopyTo(start, array, 0, length); - [MethodImpl(MethodImplOptions.AggressiveInlining)] - internal static FlatArray InternalFromImmutableArrayChecked(ImmutableArray source, int start, int length) - { - var sourceLength = source.IsDefault ? default : source.Length; + return new(array, default); - if (InnerAllocHelper.IsSegmentWithinLength(start, length, sourceLength) is not true) + [MethodImpl(MethodImplOptions.AggressiveInlining)] + void InnerValidateRange() { + var sourceLength = source.IsDefault ? default : source.Length; + if (InnerAllocHelper.IsSegmentWithinLength(start, length, sourceLength)) + { + return; + } throw InnerExceptionFactory.SegmentIsNotWithinArray(start, length, sourceLength); } - - return InnerFactory.FromImmutableArray(source, start, length); } + + public static FlatArray From(ImmutableArray? source) + => + new(source); + + // TODO: Add the tests and make public + internal static FlatArray From(ImmutableArray? source, int start, int length) + => + From(source.GetValueOrDefault(), start, length); } diff --git a/src/flatcollections-array/FlatArray/FlatArray.T/FlatArray.Factory.Explicit.From.List.cs b/src/flatcollections-array/FlatArray/FlatArray.T/FlatArray.Factory.Explicit.From.List.cs index 2da540b2..af9736e2 100644 --- a/src/flatcollections-array/FlatArray/FlatArray.T/FlatArray.Factory.Explicit.From.List.cs +++ b/src/flatcollections-array/FlatArray/FlatArray.T/FlatArray.Factory.Explicit.From.List.cs @@ -8,23 +8,32 @@ partial struct FlatArray { public static FlatArray From([AllowNull] List source) => - source is null ? default : InnerFactory.FromList(source); + source is null ? default : InnerFactoryHelper.FromICollectionTrusted(source); // TODO: Add the tests and make public internal static FlatArray From([AllowNull] List source, int start, int length) - => - InternalFromListChecked(source, start, length); - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - internal static FlatArray InternalFromListChecked([AllowNull] List source, int start, int length) { - var sourceLength = source?.Count ?? default; + InnerValidateRange(); - if (InnerAllocHelper.IsSegmentWithinLength(start, length, sourceLength) is not true) + if (source is null || length == default) { - throw InnerExceptionFactory.SegmentIsNotWithinArray(start, length, sourceLength); + return default; } - return source is null ? default : InnerFactory.FromList(source, start, length); + var array = new T[length]; + source.CopyTo(start, array, 0, length); + + return new(array, default); + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + void InnerValidateRange() + { + var sourceLength = source?.Count ?? default; + if (InnerAllocHelper.IsSegmentWithinLength(start, length, sourceLength)) + { + return; + } + throw InnerExceptionFactory.SegmentIsNotWithinArray(start, length, sourceLength); + } } } diff --git a/src/flatcollections-array/FlatArray/FlatArray.T/FlatArray.Factory.Implicit.From.cs b/src/flatcollections-array/FlatArray/FlatArray.T/FlatArray.Factory.Implicit.From.cs index 6849148f..084dd9f8 100644 --- a/src/flatcollections-array/FlatArray/FlatArray.T/FlatArray.Factory.Implicit.From.cs +++ b/src/flatcollections-array/FlatArray/FlatArray.T/FlatArray.Factory.Implicit.From.cs @@ -1,28 +1,34 @@ using System.Collections.Generic; using System.Collections.Immutable; using System.Diagnostics.CodeAnalysis; +using System.Runtime.CompilerServices; namespace System; partial struct FlatArray { + [MethodImpl(MethodImplOptions.AggressiveInlining)] public static implicit operator FlatArray([AllowNull] T[] source) => - From(source); + new(source); + [MethodImpl(MethodImplOptions.AggressiveInlining)] public static implicit operator FlatArray([AllowNull] List source) => From(source); + [MethodImpl(MethodImplOptions.AggressiveInlining)] public static implicit operator FlatArray(ImmutableArray source) => - From(source); + new(source); + [MethodImpl(MethodImplOptions.AggressiveInlining)] public static implicit operator FlatArray(ReadOnlySpan source) => - From(source); + new(source); + [MethodImpl(MethodImplOptions.AggressiveInlining)] public static implicit operator FlatArray(Span source) => - From(source); + new(source); } diff --git a/src/flatcollections-array/FlatArray/FlatArray.T/FlatArray.ToCollection.Implicit.cs b/src/flatcollections-array/FlatArray/FlatArray.T/FlatArray.ToCollection.Implicit.cs index 9c9759d6..7eb86048 100644 --- a/src/flatcollections-array/FlatArray/FlatArray.T/FlatArray.ToCollection.Implicit.cs +++ b/src/flatcollections-array/FlatArray/FlatArray.T/FlatArray.ToCollection.Implicit.cs @@ -1,18 +1,22 @@ using System.Collections.Generic; using System.Collections.Immutable; +using System.Runtime.CompilerServices; namespace System; partial struct FlatArray { + [MethodImpl(MethodImplOptions.AggressiveInlining)] public static implicit operator T[](FlatArray flatArray) => flatArray.ToArray(); + [MethodImpl(MethodImplOptions.AggressiveInlining)] public static implicit operator List(FlatArray flatArray) => flatArray.ToList(); + [MethodImpl(MethodImplOptions.AggressiveInlining)] public static implicit operator ImmutableArray(FlatArray flatArray) => flatArray.ToImmutableArray(); diff --git a/src/flatcollections-array/FlatArray/FlatArray.T/InnerFactory/FlatArray.InnerFactory.FromArray.cs b/src/flatcollections-array/FlatArray/FlatArray.T/InnerFactory/FlatArray.InnerFactory.FromArray.cs deleted file mode 100644 index bc450f5a..00000000 --- a/src/flatcollections-array/FlatArray/FlatArray.T/InnerFactory/FlatArray.InnerFactory.FromArray.cs +++ /dev/null @@ -1,23 +0,0 @@ -using System.Diagnostics; -using System.Runtime.CompilerServices; - -namespace System; - -partial struct FlatArray -{ - partial class InnerFactory - { - [MethodImpl(MethodImplOptions.AggressiveInlining)] - internal static FlatArray FromArray(T[] source) - => - source.Length == default ? default : new(InnerArrayHelper.Copy(source), default); - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - internal static FlatArray FromArray(T[] source, int start, int length) - { - Debug.Assert(InnerAllocHelper.IsSegmentWithinLength(start, length, source.Length)); - - return length == default ? default : new(InnerArrayHelper.CopySegment(source, start, length), default); - } - } -} diff --git a/src/flatcollections-array/FlatArray/FlatArray.T/InnerFactory/FlatArray.InnerFactory.FromFlatArray.cs b/src/flatcollections-array/FlatArray/FlatArray.T/InnerFactory/FlatArray.InnerFactory.FromFlatArray.cs deleted file mode 100644 index b0bbf75e..00000000 --- a/src/flatcollections-array/FlatArray/FlatArray.T/InnerFactory/FlatArray.InnerFactory.FromFlatArray.cs +++ /dev/null @@ -1,23 +0,0 @@ -using System.Diagnostics; -using System.Runtime.CompilerServices; - -namespace System; - -partial struct FlatArray -{ - partial class InnerFactory - { - [MethodImpl(MethodImplOptions.AggressiveInlining)] - internal static FlatArray FromFlatArray(FlatArray source) - => - source.length == default ? default : new(InnerArrayHelper.Copy(source.items!, source.length), default); - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - internal static FlatArray FromFlatArray(FlatArray source, int start, int length) - { - Debug.Assert(InnerAllocHelper.IsSegmentWithinLength(start, length, source.length)); - - return length == default ? default : new(InnerArrayHelper.CopySegment(source.items!, start, length), default); - } - } -} diff --git a/src/flatcollections-array/FlatArray/FlatArray.T/InnerFactory/FlatArray.InnerFactory.FromImmutableArray.cs b/src/flatcollections-array/FlatArray/FlatArray.T/InnerFactory/FlatArray.InnerFactory.FromImmutableArray.cs deleted file mode 100644 index 955f11c1..00000000 --- a/src/flatcollections-array/FlatArray/FlatArray.T/InnerFactory/FlatArray.InnerFactory.FromImmutableArray.cs +++ /dev/null @@ -1,41 +0,0 @@ -using System.Collections.Immutable; -using System.Diagnostics; -using System.Runtime.CompilerServices; - -namespace System; - -partial struct FlatArray -{ - partial class InnerFactory - { - [MethodImpl(MethodImplOptions.AggressiveInlining)] - internal static FlatArray FromImmutableArray(ImmutableArray source) - { - if (source.IsDefaultOrEmpty) - { - return default; - } - - var array = new T[source.Length]; - source.CopyTo(array); - - return new(array, default); - } - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - internal static FlatArray FromImmutableArray(ImmutableArray source, int start, int length) - { - Debug.Assert(InnerAllocHelper.IsSegmentWithinLength(start, length, source.IsDefault ? default : source.Length)); - - if (length == default) - { - return default; - } - - var array = new T[length]; - source.CopyTo(start, array, 0, length); - - return new(array, default); - } - } -} diff --git a/src/flatcollections-array/FlatArray/FlatArray.T/InnerFactory/FlatArray.InnerFactory.FromList.cs b/src/flatcollections-array/FlatArray/FlatArray.T/InnerFactory/FlatArray.InnerFactory.FromList.cs deleted file mode 100644 index de809d1c..00000000 --- a/src/flatcollections-array/FlatArray/FlatArray.T/InnerFactory/FlatArray.InnerFactory.FromList.cs +++ /dev/null @@ -1,42 +0,0 @@ -using System.Collections.Generic; -using System.Diagnostics; -using System.Runtime.CompilerServices; - -namespace System; - -partial struct FlatArray -{ - partial class InnerFactory - { - [MethodImpl(MethodImplOptions.AggressiveInlining)] - internal static FlatArray FromList(List source) - { - var count = source.Count; - if (count == default) - { - return default; - } - - var array = new T[count]; - source.CopyTo(array); - - return new(array, default); - } - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - internal static FlatArray FromList(List source, int start, int length) - { - Debug.Assert(InnerAllocHelper.IsSegmentWithinLength(start, length, source.Count)); - - if (length == default) - { - return default; - } - - var array = new T[length]; - source.CopyTo(start, array, 0, length); - - return new(array, default); - } - } -} diff --git a/src/flatcollections-array/FlatArray/FlatArray.T/InnerFactory/FlatArray.InnerFactoryHelper.FromICollection.Trusted.cs b/src/flatcollections-array/FlatArray/FlatArray.T/InnerFactory/FlatArray.InnerFactoryHelper.FromICollection.Trusted.cs new file mode 100644 index 00000000..fb74903a --- /dev/null +++ b/src/flatcollections-array/FlatArray/FlatArray.T/InnerFactory/FlatArray.InnerFactoryHelper.FromICollection.Trusted.cs @@ -0,0 +1,26 @@ +using System.Collections.Generic; +using System.Runtime.CompilerServices; + +namespace System; + +partial struct FlatArray +{ + partial class InnerFactoryHelper + { + [MethodImpl(MethodImplOptions.AggressiveInlining)] + internal static FlatArray FromICollectionTrusted(ICollection source) + { + var count = source.Count; + + if (count == default) + { + return default; + } + + var array = new T[count]; + source.CopyTo(array, 0); + + return new(array, default); + } + } +} diff --git a/src/flatcollections-array/FlatArray/FlatArray.T/InnerFactory/FlatArray.InnerFactory.FromICollection.cs b/src/flatcollections-array/FlatArray/FlatArray.T/InnerFactory/FlatArray.InnerFactoryHelper.FromICollection.cs similarity index 77% rename from src/flatcollections-array/FlatArray/FlatArray.T/InnerFactory/FlatArray.InnerFactory.FromICollection.cs rename to src/flatcollections-array/FlatArray/FlatArray.T/InnerFactory/FlatArray.InnerFactoryHelper.FromICollection.cs index 8090473c..cb62986c 100644 --- a/src/flatcollections-array/FlatArray/FlatArray.T/InnerFactory/FlatArray.InnerFactory.FromICollection.cs +++ b/src/flatcollections-array/FlatArray/FlatArray.T/InnerFactory/FlatArray.InnerFactoryHelper.FromICollection.cs @@ -5,12 +5,13 @@ namespace System; partial struct FlatArray { - partial class InnerFactory + partial class InnerFactoryHelper { [MethodImpl(MethodImplOptions.AggressiveInlining)] internal static FlatArray FromICollection(ICollection source) { var count = source.Count; + if (count is not > 0) { return default; @@ -19,8 +20,7 @@ internal static FlatArray FromICollection(ICollection source) var array = new T[count]; source.CopyTo(array, 0); - // Create a defensive copy for an arbitrary ICollection implementation - // that is not as trusted as List or ImmutableArray + // Create a defensive copy for the case of an arbitrary collection implementation var arrayCopy = InnerArrayHelper.Copy(array); return new(arrayCopy, default); diff --git a/src/flatcollections-array/FlatArray/FlatArray.T/InnerFactory/FlatArray.InnerFactory.FromIEnumerable.cs b/src/flatcollections-array/FlatArray/FlatArray.T/InnerFactory/FlatArray.InnerFactoryHelper.FromIEnumerable.cs similarity index 96% rename from src/flatcollections-array/FlatArray/FlatArray.T/InnerFactory/FlatArray.InnerFactory.FromIEnumerable.cs rename to src/flatcollections-array/FlatArray/FlatArray.T/InnerFactory/FlatArray.InnerFactoryHelper.FromIEnumerable.cs index fedffe91..fc8f42ed 100644 --- a/src/flatcollections-array/FlatArray/FlatArray.T/InnerFactory/FlatArray.InnerFactory.FromIEnumerable.cs +++ b/src/flatcollections-array/FlatArray/FlatArray.T/InnerFactory/FlatArray.InnerFactoryHelper.FromIEnumerable.cs @@ -5,7 +5,7 @@ namespace System; partial struct FlatArray { - partial class InnerFactory + partial class InnerFactoryHelper { [MethodImpl(MethodImplOptions.AggressiveInlining)] internal static FlatArray FromIEnumerable(IEnumerable source, int estimatedCapacity = default) diff --git a/src/flatcollections-array/FlatArray/FlatArray.T/InnerFactory/FlatArray.InnerFactory.FromIReadOnlyList.cs b/src/flatcollections-array/FlatArray/FlatArray.T/InnerFactory/FlatArray.InnerFactoryHelper.FromIReadOnlyList.cs similarity index 96% rename from src/flatcollections-array/FlatArray/FlatArray.T/InnerFactory/FlatArray.InnerFactory.FromIReadOnlyList.cs rename to src/flatcollections-array/FlatArray/FlatArray.T/InnerFactory/FlatArray.InnerFactoryHelper.FromIReadOnlyList.cs index 08591b5d..9c567937 100644 --- a/src/flatcollections-array/FlatArray/FlatArray.T/InnerFactory/FlatArray.InnerFactory.FromIReadOnlyList.cs +++ b/src/flatcollections-array/FlatArray/FlatArray.T/InnerFactory/FlatArray.InnerFactoryHelper.FromIReadOnlyList.cs @@ -5,7 +5,7 @@ namespace System; partial struct FlatArray { - partial class InnerFactory + partial class InnerFactoryHelper { [MethodImpl(MethodImplOptions.AggressiveInlining)] internal static FlatArray FromIReadOnlyList(IReadOnlyList source) diff --git a/src/flatcollections-array/FlatArray/FlatArray.T/InnerFactory/FlatArray.InnerFactory.cs b/src/flatcollections-array/FlatArray/FlatArray.T/InnerFactory/FlatArray.InnerFactoryHelper.cs similarity index 55% rename from src/flatcollections-array/FlatArray/FlatArray.T/InnerFactory/FlatArray.InnerFactory.cs rename to src/flatcollections-array/FlatArray/FlatArray.T/InnerFactory/FlatArray.InnerFactoryHelper.cs index e72277a9..84d30fc7 100644 --- a/src/flatcollections-array/FlatArray/FlatArray.T/InnerFactory/FlatArray.InnerFactory.cs +++ b/src/flatcollections-array/FlatArray/FlatArray.T/InnerFactory/FlatArray.InnerFactoryHelper.cs @@ -2,7 +2,7 @@ partial struct FlatArray { - private static partial class InnerFactory + private static partial class InnerFactoryHelper { } } diff --git a/src/flatcollections-array/FlatArray/FlatArray/FlatArray.Factory.From.Array.cs b/src/flatcollections-array/FlatArray/FlatArray/FlatArray.Factory.From.Array.cs index 9131e6c1..9621d699 100644 --- a/src/flatcollections-array/FlatArray/FlatArray/FlatArray.Factory.From.Array.cs +++ b/src/flatcollections-array/FlatArray/FlatArray/FlatArray.Factory.From.Array.cs @@ -6,10 +6,10 @@ partial class FlatArray { public static FlatArray From([AllowNull] params T[] source) => - FlatArray.From(source); + new(source); // TODO: Add the tests and make public internal static FlatArray From([AllowNull] T[] source, int start, int length) => - FlatArray.InternalFromArrayChecked(source, start, length); + FlatArray.From(source, start, length); } diff --git a/src/flatcollections-array/FlatArray/FlatArray/FlatArray.Factory.From.FlatArray.cs b/src/flatcollections-array/FlatArray/FlatArray/FlatArray.Factory.From.FlatArray.cs index db5fbd72..eafbec1a 100644 --- a/src/flatcollections-array/FlatArray/FlatArray/FlatArray.Factory.From.FlatArray.cs +++ b/src/flatcollections-array/FlatArray/FlatArray/FlatArray.Factory.From.FlatArray.cs @@ -4,19 +4,19 @@ partial class FlatArray { public static FlatArray From(FlatArray source) => - FlatArray.From(source); + new(source); // TODO: Add the tests and make public internal static FlatArray From(FlatArray source, int start, int length) => - FlatArray.InternalFromFlatArrayChecked(source, start, length); + FlatArray.From(source, start, length); public static FlatArray From(FlatArray? source) => - FlatArray.From(source); + new(source); // TODO: Add the tests and make public internal static FlatArray From(FlatArray? source, int start, int length) => - FlatArray.InternalFromFlatArrayChecked(source.GetValueOrDefault(), start, length); + FlatArray.From(source, start, length); } diff --git a/src/flatcollections-array/FlatArray/FlatArray/FlatArray.Factory.From.ImmutableArray.cs b/src/flatcollections-array/FlatArray/FlatArray/FlatArray.Factory.From.ImmutableArray.cs index 9ee4f1cf..94003f9c 100644 --- a/src/flatcollections-array/FlatArray/FlatArray/FlatArray.Factory.From.ImmutableArray.cs +++ b/src/flatcollections-array/FlatArray/FlatArray/FlatArray.Factory.From.ImmutableArray.cs @@ -6,19 +6,19 @@ partial class FlatArray { public static FlatArray From(ImmutableArray source) => - FlatArray.From(source); + new(source); // TODO: Add the tests and make public internal static FlatArray From(ImmutableArray source, int start, int length) => - FlatArray.InternalFromImmutableArrayChecked(source, start, length); + FlatArray.From(source, start, length); public static FlatArray From(ImmutableArray? source) => - FlatArray.From(source); + new(source); // TODO: Add the tests and make public internal static FlatArray From(ImmutableArray? source, int start, int length) => - FlatArray.InternalFromImmutableArrayChecked(source.GetValueOrDefault(), start, length); + FlatArray.From(source, start, length); } diff --git a/src/flatcollections-array/FlatArray/FlatArray/FlatArray.Factory.From.List.cs b/src/flatcollections-array/FlatArray/FlatArray/FlatArray.Factory.From.List.cs index 903c5b20..5a0bdc22 100644 --- a/src/flatcollections-array/FlatArray/FlatArray/FlatArray.Factory.From.List.cs +++ b/src/flatcollections-array/FlatArray/FlatArray/FlatArray.Factory.From.List.cs @@ -12,5 +12,5 @@ public static FlatArray From([AllowNull] List source) // TODO: Add the tests and make public internal static FlatArray From([AllowNull] List source, int start, int length) => - FlatArray.InternalFromListChecked(source, start, length); + FlatArray.From(source, start, length); } diff --git a/src/flatcollections-array/FlatArray/FlatArray/FlatArray.Factory.From.Span.cs b/src/flatcollections-array/FlatArray/FlatArray/FlatArray.Factory.From.Span.cs index 451e363d..17793147 100644 --- a/src/flatcollections-array/FlatArray/FlatArray/FlatArray.Factory.From.Span.cs +++ b/src/flatcollections-array/FlatArray/FlatArray/FlatArray.Factory.From.Span.cs @@ -4,9 +4,9 @@ partial class FlatArray { public static FlatArray From(ReadOnlySpan source) => - FlatArray.From(source); + new(source); public static FlatArray From(Span source) => - FlatArray.From(source); + new(source); } diff --git a/src/flatcollections-array/FlatArray/FlatArrayExtensions/Extensions.ToFlatArray.FromArray.cs b/src/flatcollections-array/FlatArray/FlatArrayExtensions/Extensions.ToFlatArray.FromArray.cs index 1e323670..78e17cb3 100644 --- a/src/flatcollections-array/FlatArray/FlatArrayExtensions/Extensions.ToFlatArray.FromArray.cs +++ b/src/flatcollections-array/FlatArray/FlatArrayExtensions/Extensions.ToFlatArray.FromArray.cs @@ -6,10 +6,10 @@ partial class FlatArrayExtensions { public static FlatArray ToFlatArray([AllowNull] this T[] source) => - FlatArray.From(source); + new(source); // TODO: Add the tests and make public internal static FlatArray ToFlatArray([AllowNull] this T[] source, int start, int length) => - FlatArray.InternalFromArrayChecked(source, start, length); + FlatArray.From(source, start, length); } diff --git a/src/flatcollections-array/FlatArray/FlatArrayExtensions/Extensions.ToFlatArray.FromFlatArray.cs b/src/flatcollections-array/FlatArray/FlatArrayExtensions/Extensions.ToFlatArray.FromFlatArray.cs index ce668b80..8fe70c19 100644 --- a/src/flatcollections-array/FlatArray/FlatArrayExtensions/Extensions.ToFlatArray.FromFlatArray.cs +++ b/src/flatcollections-array/FlatArray/FlatArrayExtensions/Extensions.ToFlatArray.FromFlatArray.cs @@ -4,19 +4,19 @@ partial class FlatArrayExtensions { public static FlatArray ToFlatArray(this FlatArray source) => - FlatArray.From(source); + new(source); // TODO: Add the tests and make public internal static FlatArray ToFlatArray(this FlatArray source, int start, int length) => - FlatArray.InternalFromFlatArrayChecked(source, start, length); + FlatArray.From(source, start, length); public static FlatArray ToFlatArray(this FlatArray? source) => - FlatArray.From(source); + new(source); // TODO: Add the tests and make public internal static FlatArray ToFlatArray(this FlatArray? source, int start, int length) => - FlatArray.InternalFromFlatArrayChecked(source.GetValueOrDefault(), start, length); + FlatArray.From(source, start, length); } diff --git a/src/flatcollections-array/FlatArray/FlatArrayExtensions/Extensions.ToFlatArray.FromImmutableArray.cs b/src/flatcollections-array/FlatArray/FlatArrayExtensions/Extensions.ToFlatArray.FromImmutableArray.cs index f6c5c853..0d1bd0a5 100644 --- a/src/flatcollections-array/FlatArray/FlatArrayExtensions/Extensions.ToFlatArray.FromImmutableArray.cs +++ b/src/flatcollections-array/FlatArray/FlatArrayExtensions/Extensions.ToFlatArray.FromImmutableArray.cs @@ -6,19 +6,19 @@ partial class FlatArrayExtensions { public static FlatArray ToFlatArray(this ImmutableArray source) => - FlatArray.From(source); + new(source); // TODO: Add the tests and make public internal static FlatArray ToFlatArray(this ImmutableArray source, int start, int length) => - FlatArray.InternalFromImmutableArrayChecked(source, start, length); + FlatArray.From(source, start, length); public static FlatArray ToFlatArray(this ImmutableArray? source) => - FlatArray.From(source); + new(source); // TODO: Add the tests and make public internal static FlatArray ToFlatArray(this ImmutableArray? source, int start, int length) => - FlatArray.InternalFromImmutableArrayChecked(source.GetValueOrDefault(), start, length); + FlatArray.From(source, start, length); } diff --git a/src/flatcollections-array/FlatArray/FlatArrayExtensions/Extensions.ToFlatArray.FromList.cs b/src/flatcollections-array/FlatArray/FlatArrayExtensions/Extensions.ToFlatArray.FromList.cs index b695d7e6..c1c6130d 100644 --- a/src/flatcollections-array/FlatArray/FlatArrayExtensions/Extensions.ToFlatArray.FromList.cs +++ b/src/flatcollections-array/FlatArray/FlatArrayExtensions/Extensions.ToFlatArray.FromList.cs @@ -12,5 +12,5 @@ public static FlatArray ToFlatArray([AllowNull] this List source) // TODO: Add the tests and make public internal static FlatArray ToFlatArray([AllowNull] this List source, int start, int length) => - FlatArray.InternalFromListChecked(source, start, length); + FlatArray.From(source, start, length); } diff --git a/src/flatcollections-array/FlatArray/FlatArrayExtensions/Extensions.ToFlatArray.FromSpan.cs b/src/flatcollections-array/FlatArray/FlatArrayExtensions/Extensions.ToFlatArray.FromSpan.cs index 6d925d8e..3cc91e7e 100644 --- a/src/flatcollections-array/FlatArray/FlatArrayExtensions/Extensions.ToFlatArray.FromSpan.cs +++ b/src/flatcollections-array/FlatArray/FlatArrayExtensions/Extensions.ToFlatArray.FromSpan.cs @@ -4,9 +4,9 @@ partial class FlatArrayExtensions { public static FlatArray ToFlatArray(this ReadOnlySpan source) => - FlatArray.From(source); + new(source); public static FlatArray ToFlatArray(this Span source) => - FlatArray.From(source); + new(source); }