diff --git a/Changelog.md b/Changelog.md index afccc62..b82a780 100644 --- a/Changelog.md +++ b/Changelog.md @@ -5,6 +5,16 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/), and this project adheres not (yet) to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). +## [1.5] - 2024-11-12 + +### Added + +- implementations of the newly introduced Span.Split methods from .Net 9 for any version prior to .Net 9 to maintain backwards-compatibility across .Net versions. + +### Changed + +- Split extension methods to refer to new split implementations compatible to the ones in .Net 9 and made .Net 9 split methods the default from that version onwards. The original split methods are still accessible as static methods. +- original Split methods are no longer available without passing span as a parameter. ## [1.4.2] - 2024-10-29 diff --git a/src/Enumerators/System/SpanSplitEnumerator.cs b/src/Enumerators/System/SpanSplitEnumerator.cs new file mode 100644 index 0000000..e07af58 --- /dev/null +++ b/src/Enumerators/System/SpanSplitEnumerator.cs @@ -0,0 +1,133 @@ +using System.Buffers; +using System.Diagnostics; +using System.Runtime.CompilerServices; + +#if !NET9_0_OR_GREATER + +namespace System +{ +#pragma warning disable CS1591 // Missing XML comment for publicly visible type or member + public static partial class MemoryExtensions +#pragma warning restore CS1591 // Missing XML comment for publicly visible type or member + { + /// + /// Enables enumerating each split within a that has been divided using one or more separators. + /// + public ref struct SpanSplitEnumerator where T : IEquatable + { + readonly ReadOnlySpan Span; + readonly T Delimiter; + readonly ReadOnlySpan DelimiterSpan; + SpanSplitEnumeratorMode mode; +#if NET8_0 + readonly SearchValues SearchValues = null!; +#endif + + /// + /// Gets the current element of the enumeration. + /// + /// Returns a instance that indicates the bounds of the current element withing the source span. + public Range Current { get; internal set; } + + internal SpanSplitEnumerator(ReadOnlySpan source, T delimiter) + { + Span = source; + Delimiter = delimiter; + Current = new Range(0, 0); + DelimiterSpan = default; + mode = SpanSplitEnumeratorMode.Delimiter; + } + internal SpanSplitEnumerator(ReadOnlySpan source, ReadOnlySpan delimiter, SpanSplitEnumeratorMode mode) + { + Span = source; + DelimiterSpan = delimiter; + Current = new Range(0, 0); + Delimiter = default!; + this.mode = mode; + } + +#if NET8_0 + internal SpanSplitEnumerator(ReadOnlySpan source, SearchValues searchValues) + { + Span = source; + Delimiter = default!; + SearchValues = searchValues; + Current = new Range(0, 0); + DelimiterSpan = default; + mode = SpanSplitEnumeratorMode.Delimiter; + } +#endif + /// + /// Returns an enumerator that iterates through a collection. + /// + public readonly SpanSplitEnumerator GetEnumerator() + { + return this; + } + + /// + /// Advances the enumerator to the next element of the collection. + /// + /// if the enumerator was successfully advanced to the next element; if the enumerator has passed the end of the collection. + public bool MoveNext() + { + int index; + int length; + + switch(mode) + { + case SpanSplitEnumeratorMode.Delimiter: + index = Span[Current.Start..].IndexOf(Delimiter); + length = 1; + break; + + case SpanSplitEnumeratorMode.Any: + index = Span[Current.Start..].IndexOfAny(DelimiterSpan); + length = 1; + break; + + case SpanSplitEnumeratorMode.Sequence: + index = Span[Current.Start..].IndexOf(DelimiterSpan); + length = DelimiterSpan.Length; + break; + + case SpanSplitEnumeratorMode.EmptySequence: + index = -1; + length = 1; + break; + +#if NET8_0 + case SpanSplitEnumeratorMode.SearchValues: + index = Span[Current.Start..].IndexOfAny(SearchValues); + length = 1; + break; +#endif + default: + return false; + } + + if(index < 0) + { + Current = new Range(Span.Length, Span.Length); + mode = (SpanSplitEnumeratorMode)(-1); + return true; + } + + Current = new Range(Current.End.Value + length, Current.Start.Value + index); + + return true; + } + } + + internal enum SpanSplitEnumeratorMode + { + Delimiter, + Any, + Sequence, + EmptySequence, + SearchValues + } + } +} + +#endif \ No newline at end of file diff --git a/src/ExceptionHelpers.cs b/src/ExceptionHelpers.cs index 79ef3e3..a484ee5 100644 --- a/src/ExceptionHelpers.cs +++ b/src/ExceptionHelpers.cs @@ -23,7 +23,7 @@ static ExceptionHelpers() combination |= flag; } - NegatedCombinationOfAllValidStringSplitOptions = (StringSplitOptions) ~combination; + NegatedCombinationOfAllValidStringSplitOptions = (StringSplitOptions)~combination; } internal static void ThrowIfGreaterThanOrEqual(T value, T other, diff --git a/src/Extensions/ReadOnlySpan/Span/Split.cs b/src/Extensions/ReadOnlySpan/Span/Split.cs new file mode 100644 index 0000000..3807256 --- /dev/null +++ b/src/Extensions/ReadOnlySpan/Span/Split.cs @@ -0,0 +1,74 @@ +using System.Buffers; +using System.Diagnostics; +using System.Runtime.CompilerServices; + +#if !NET9_0_OR_GREATER + +namespace System +{ +#pragma warning disable CS1591 // Missing XML comment for publicly visible type or member + public static partial class MemoryExtensions +#pragma warning restore CS1591 // Missing XML comment for publicly visible type or member + { + /// + /// Returns a type that allows for enumeration of each element within a split span + /// using the provided separator character. + /// + /// The type of the elements. + /// The source span to be enumerated. + /// The separator character to be used to split the provided span. + /// Returns a . + public static SpanSplitEnumerator Split(this ReadOnlySpan source, T separator) where T : IEquatable + { + return new SpanSplitEnumerator(source, separator); + } + + /// + /// Returns a type that allows for enumeration of each element within a split span + /// using the provided separator span. + /// + /// The type of the elements. + /// The source span to be enumerated. + /// The separator span to be used to split the provided span. + /// Returns a . + public static SpanSplitEnumerator Split(this ReadOnlySpan source, ReadOnlySpan separator) where T : IEquatable + { + return new SpanSplitEnumerator(source, separator, SpanSplitEnumeratorMode.Sequence); + } + + /// + /// Returns a type that allows for enumeration of each element within a split span + /// using any of the provided elements. + /// + /// The type of the elements. + /// The source span to be enumerated. + /// The separators to be used to split the provided span. + /// Returns a . + public static SpanSplitEnumerator SplitAny(this ReadOnlySpan source, ReadOnlySpan separators) where T : IEquatable + { + return new SpanSplitEnumerator(source, separators, SpanSplitEnumeratorMode.Any); + } + +#if NET8_0 + /// + /// Returns a type that allows for enumeration of each element within a split span + /// using the provided . + /// + /// The type of the elements. + /// The source span to be enumerated. + /// The to be used to split the provided span. + /// Returns a . + /// + /// Unlike , the is not checked for being empty. + /// An empty will result in no separators being found, regardless of the type of , whereas will use all Unicode whitespace characters as separators if is empty and is . + /// + public static SpanSplitEnumerator SplitAny(this ReadOnlySpan source, SearchValues separators) where T : IEquatable + { + return new SpanSplitEnumerator(source, separators); + } +#endif + + } +} + +#endif \ No newline at end of file diff --git a/src/Extensions/ReadOnlySpan/String/Split.cs b/src/Extensions/ReadOnlySpan/String/Split.cs index 6827464..4707d94 100644 --- a/src/Extensions/ReadOnlySpan/String/Split.cs +++ b/src/Extensions/ReadOnlySpan/String/Split.cs @@ -13,7 +13,7 @@ public static partial class ReadOnlySpanExtensions /// The to be split. /// An instance of that delimits the various sub-ReadOnlySpans in . /// An instance of the ref struct , which works the same way as every does and can be used in a foreach construct. - public static SpanSplitEnumerator Split(this ReadOnlySpan source, T delimiter) where T : IEquatable + public static SpanSplitEnumerator Split(ReadOnlySpan source, T delimiter) where T : IEquatable { return new SpanSplitEnumerator(source, delimiter); } @@ -27,7 +27,7 @@ public static SpanSplitEnumerator Split(this ReadOnlySpan source, T del /// The maximum number of sub-ReadOnlySpans to split into. /// The handling of the instances more than count. /// An instance of the ref struct , which works the same way as every does and can be used in a foreach construct. - public static SpanSplitWithCountEnumerator Split(this ReadOnlySpan source, T delimiter, int count, CountExceedingBehaviour countExceedingBehaviour = CountExceedingBehaviour.AppendRemainingElements) where T : IEquatable + public static SpanSplitWithCountEnumerator Split(ReadOnlySpan source, T delimiter, int count, CountExceedingBehaviour countExceedingBehaviour = CountExceedingBehaviour.AppendRemainingElements) where T : IEquatable { return new SpanSplitWithCountEnumerator(source, delimiter, count, countExceedingBehaviour); } @@ -39,7 +39,7 @@ public static SpanSplitWithCountEnumerator Split(this ReadOnlySpan sour /// A that delimits the various sub-ReadOnlySpans in . /// A bitwise combination of the enumeration values that specifies whether to trim results and include empty results. /// An instance of the ref struct , which works the same way as every does and can be used in a foreach construct. - public static SpanSplitStringSplitOptionsEnumerator Split(this ReadOnlySpan source, char delimiter, StringSplitOptions options) + public static SpanSplitStringSplitOptionsEnumerator Split(ReadOnlySpan source, char delimiter, StringSplitOptions options) { return new SpanSplitStringSplitOptionsEnumerator(source, delimiter, options); } @@ -53,7 +53,7 @@ public static SpanSplitStringSplitOptionsEnumerator Split(this ReadOnlySpanA bitwise combination of the enumeration values that specifies whether to trim results and include empty results. /// The handling of the instances more than count. /// An instance of the ref struct , which works the same way as every does and can be used in a foreach construct. - public static SpanSplitStringSplitOptionsWithCountEnumerator Split(this ReadOnlySpan source, char delimiter, int count, StringSplitOptions options, CountExceedingBehaviour countExceedingBehaviour = CountExceedingBehaviour.AppendRemainingElements) + public static SpanSplitStringSplitOptionsWithCountEnumerator Split(ReadOnlySpan source, char delimiter, int count, StringSplitOptions options, CountExceedingBehaviour countExceedingBehaviour = CountExceedingBehaviour.AppendRemainingElements) { return new SpanSplitStringSplitOptionsWithCountEnumerator(source, delimiter, count, options, countExceedingBehaviour); } diff --git a/src/Extensions/ReadOnlySpan/String/SplitAny.cs b/src/Extensions/ReadOnlySpan/String/SplitAny.cs index 3e52626..e35319f 100644 --- a/src/Extensions/ReadOnlySpan/String/SplitAny.cs +++ b/src/Extensions/ReadOnlySpan/String/SplitAny.cs @@ -13,7 +13,7 @@ public static partial class ReadOnlySpanExtensions /// The to be split. /// A with the instances of that delimit the various sub-ReadOnlySpans in . /// An instance of the ref struct , which works the same way as every does and can be used in a foreach construct. - public static SpanSplitAnyEnumerator SplitAny(this ReadOnlySpan source, ReadOnlySpan delimiters) where T : IEquatable + public static SpanSplitAnyEnumerator SplitAny(ReadOnlySpan source, ReadOnlySpan delimiters) where T : IEquatable { return new SpanSplitAnyEnumerator(source, delimiters); } @@ -27,7 +27,7 @@ public static SpanSplitAnyEnumerator SplitAny(this ReadOnlySpan source, /// The maximum number of sub-ReadOnlySpans to split into. /// The handling of the instances more than count. /// An instance of the ref struct , which works the same way as every does and can be used in a foreach construct. - public static SpanSplitAnyWithCountEnumerator SplitAny(this ReadOnlySpan source, ReadOnlySpan delimiters, int count, CountExceedingBehaviour countExceedingBehaviour = CountExceedingBehaviour.AppendRemainingElements) where T : IEquatable + public static SpanSplitAnyWithCountEnumerator SplitAny(ReadOnlySpan source, ReadOnlySpan delimiters, int count, CountExceedingBehaviour countExceedingBehaviour = CountExceedingBehaviour.AppendRemainingElements) where T : IEquatable { return new SpanSplitAnyWithCountEnumerator(source, delimiters, count, countExceedingBehaviour); } @@ -39,7 +39,7 @@ public static SpanSplitAnyWithCountEnumerator SplitAny(this ReadOnlySpanA , that delimit the various sub-ReadOnlySpans in . /// A bitwise combination of the enumeration values that specifies whether to trim results and include empty results. /// An instance of the ref struct , which works the same way as every does and can be used in a foreach construct. - public static SpanSplitAnyStringSplitOptionsEnumerator SplitAny(this ReadOnlySpan source, ReadOnlySpan delimiters, StringSplitOptions options) + public static SpanSplitAnyStringSplitOptionsEnumerator SplitAny(ReadOnlySpan source, ReadOnlySpan delimiters, StringSplitOptions options) { return new SpanSplitAnyStringSplitOptionsEnumerator(source, delimiters, options); } @@ -53,7 +53,7 @@ public static SpanSplitAnyStringSplitOptionsEnumerator SplitAny(this ReadOnlySpa /// A bitwise combination of the enumeration values that specifies whether to trim results and include empty results. /// The handling of the instances more than count. /// An instance of the ref struct , which works the same way as every does and can be used in a foreach construct. - public static SpanSplitAnyStringSplitOptionsWithCountEnumerator SplitAny(this ReadOnlySpan source, ReadOnlySpan delimiters, int count, StringSplitOptions options, CountExceedingBehaviour countExceedingBehaviour = CountExceedingBehaviour.AppendRemainingElements) + public static SpanSplitAnyStringSplitOptionsWithCountEnumerator SplitAny(ReadOnlySpan source, ReadOnlySpan delimiters, int count, StringSplitOptions options, CountExceedingBehaviour countExceedingBehaviour = CountExceedingBehaviour.AppendRemainingElements) { return new SpanSplitAnyStringSplitOptionsWithCountEnumerator(source, delimiters, count, options, countExceedingBehaviour); } diff --git a/src/Extensions/ReadOnlySpan/String/SplitSequence.cs b/src/Extensions/ReadOnlySpan/String/SplitSequence.cs index 83decef..6852a48 100644 --- a/src/Extensions/ReadOnlySpan/String/SplitSequence.cs +++ b/src/Extensions/ReadOnlySpan/String/SplitSequence.cs @@ -13,7 +13,7 @@ public static partial class ReadOnlySpanExtensions /// The to be split. /// An instance of that delimits the various sub-ReadOnlySpans in . /// An instance of the ref struct , which works the same way as every does and can be used in a foreach construct. - public static SpanSplitSequenceEnumerator Split(this ReadOnlySpan source, ReadOnlySpan delimiter) where T : IEquatable + public static SpanSplitSequenceEnumerator Split(ReadOnlySpan source, ReadOnlySpan delimiter) where T : IEquatable { return new SpanSplitSequenceEnumerator(source, delimiter); } @@ -27,7 +27,7 @@ public static SpanSplitSequenceEnumerator Split(this ReadOnlySpan sourc /// The maximum number of sub-ReadOnlySpans to split into. /// The handling of the instances more than count. /// An instance of the ref struct , which works the same way as every does and can be used in a foreach construct. - public static SpanSplitSequenceWithCountEnumerator Split(this ReadOnlySpan source, ReadOnlySpan delimiter, int count, CountExceedingBehaviour countExceedingBehaviour = CountExceedingBehaviour.AppendRemainingElements) where T : IEquatable + public static SpanSplitSequenceWithCountEnumerator Split(ReadOnlySpan source, ReadOnlySpan delimiter, int count, CountExceedingBehaviour countExceedingBehaviour = CountExceedingBehaviour.AppendRemainingElements) where T : IEquatable { return new SpanSplitSequenceWithCountEnumerator(source, delimiter, count, countExceedingBehaviour); } @@ -39,7 +39,7 @@ public static SpanSplitSequenceWithCountEnumerator Split(this ReadOnlySpan /// An instance of that delimits the various sub-ReadOnlySpans in . /// A bitwise combination of the enumeration values that specifies whether to trim results and include empty results. /// An instance of the ref struct , which works the same way as every does and can be used in a foreach construct. - public static SpanSplitSequenceStringSplitOptionsEnumerator Split(this ReadOnlySpan source, ReadOnlySpan delimiter, StringSplitOptions options) + public static SpanSplitSequenceStringSplitOptionsEnumerator Split(ReadOnlySpan source, ReadOnlySpan delimiter, StringSplitOptions options) { return new SpanSplitSequenceStringSplitOptionsEnumerator(source, delimiter, options); } @@ -53,7 +53,7 @@ public static SpanSplitSequenceStringSplitOptionsEnumerator Split(this ReadOnlyS /// A bitwise combination of the enumeration values that specifies whether to trim results and include empty results. /// The handling of the instances more than count. /// An instance of the ref struct , which works the same way as every does and can be used in a foreach construct. - public static SpanSplitSequenceStringSplitOptionsWithCountEnumerator Split(this ReadOnlySpan source, ReadOnlySpan delimiter, int count, StringSplitOptions options, CountExceedingBehaviour countExceedingBehaviour = CountExceedingBehaviour.AppendRemainingElements) + public static SpanSplitSequenceStringSplitOptionsWithCountEnumerator Split(ReadOnlySpan source, ReadOnlySpan delimiter, int count, StringSplitOptions options, CountExceedingBehaviour countExceedingBehaviour = CountExceedingBehaviour.AppendRemainingElements) { return new SpanSplitSequenceStringSplitOptionsWithCountEnumerator(source, delimiter, count, options, countExceedingBehaviour); } diff --git a/src/Extensions/Span/Span/Split.cs b/src/Extensions/Span/Span/Split.cs new file mode 100644 index 0000000..7ae44a8 --- /dev/null +++ b/src/Extensions/Span/Span/Split.cs @@ -0,0 +1,74 @@ +using System.Buffers; +using System.Diagnostics; +using System.Runtime.CompilerServices; + +#if !NET9_0_OR_GREATER + +namespace System +{ +#pragma warning disable CS1591 // Missing XML comment for publicly visible type or member + public static partial class MemoryExtensions +#pragma warning restore CS1591 // Missing XML comment for publicly visible type or member + { + /// + /// Returns a type that allows for enumeration of each element within a split span + /// using the provided separator character. + /// + /// The type of the elements. + /// The source span to be enumerated. + /// The separator character to be used to split the provided span. + /// Returns a . + public static SpanSplitEnumerator Split(this Span source, T separator) where T : IEquatable + { + return new SpanSplitEnumerator(source, separator); + } + + /// + /// Returns a type that allows for enumeration of each element within a split span + /// using the provided separator span. + /// + /// The type of the elements. + /// The source span to be enumerated. + /// The separator span to be used to split the provided span. + /// Returns a . + public static SpanSplitEnumerator Split(this Span source, ReadOnlySpan separator) where T : IEquatable + { + return new SpanSplitEnumerator(source, separator, SpanSplitEnumeratorMode.Sequence); + } + + /// + /// Returns a type that allows for enumeration of each element within a split span + /// using any of the provided elements. + /// + /// The type of the elements. + /// The source span to be enumerated. + /// The separators to be used to split the provided span. + /// Returns a . + public static SpanSplitEnumerator SplitAny(this Span source, ReadOnlySpan separators) where T : IEquatable + { + return new SpanSplitEnumerator(source, separators, SpanSplitEnumeratorMode.Any); + } + +#if NET8_0 + /// + /// Returns a type that allows for enumeration of each element within a split span + /// using the provided . + /// + /// The type of the elements. + /// The source span to be enumerated. + /// The to be used to split the provided span. + /// Returns a . + /// + /// Unlike , the is not checked for being empty. + /// An empty will result in no separators being found, regardless of the type of , whereas will use all Unicode whitespace characters as separators if is empty and is . + /// + public static SpanSplitEnumerator SplitAny(this Span source, SearchValues separators) where T : IEquatable + { + return new SpanSplitEnumerator(source, separators); + } +#endif + + } +} + +#endif \ No newline at end of file diff --git a/src/Extensions/Span/String/Split.cs b/src/Extensions/Span/String/Split.cs index bbe827c..9eeaa13 100644 --- a/src/Extensions/Span/String/Split.cs +++ b/src/Extensions/Span/String/Split.cs @@ -6,7 +6,6 @@ namespace SpanExtensions { public static partial class SpanExtensions { - /// /// Splits a into multiple ReadOnlySpans based on the specified . /// @@ -14,7 +13,7 @@ public static partial class SpanExtensions /// The to be split. /// An instance of that delimits the various sub-ReadOnlySpans in . /// An instance of the ref struct , which works the same way as every does and can be used in a foreach construct. - public static SpanSplitEnumerator Split(this Span source, T delimiter) where T : IEquatable + public static SpanSplitEnumerator Split(Span source, T delimiter) where T : IEquatable { return new SpanSplitEnumerator(source, delimiter); } @@ -28,7 +27,7 @@ public static SpanSplitEnumerator Split(this Span source, T delimiter) /// The maximum number of sub-ReadOnlySpans to split into. /// The handling of the instances more than count. /// An instance of the ref struct , which works the same way as every does and can be used in a foreach construct. - public static SpanSplitWithCountEnumerator Split(this Span source, T delimiter, int count, CountExceedingBehaviour countExceedingBehaviour = CountExceedingBehaviour.AppendRemainingElements) where T : IEquatable + public static SpanSplitWithCountEnumerator Split(Span source, T delimiter, int count, CountExceedingBehaviour countExceedingBehaviour = CountExceedingBehaviour.AppendRemainingElements) where T : IEquatable { return new SpanSplitWithCountEnumerator(source, delimiter, count, countExceedingBehaviour); } @@ -40,7 +39,7 @@ public static SpanSplitWithCountEnumerator Split(this Span source, T de /// A that delimits the various sub-ReadOnlySpans in . /// A bitwise combination of the enumeration values that specifies whether to trim results and include empty results. /// An instance of the ref struct , which works the same way as every does and can be used in a foreach construct. - public static SpanSplitStringSplitOptionsEnumerator Split(this Span source, char delimiter, StringSplitOptions options) + public static SpanSplitStringSplitOptionsEnumerator Split(Span source, char delimiter, StringSplitOptions options) { return new SpanSplitStringSplitOptionsEnumerator(source, delimiter, options); } @@ -54,7 +53,7 @@ public static SpanSplitStringSplitOptionsEnumerator Split(this Span source /// A bitwise combination of the enumeration values that specifies whether to trim results and include empty results. /// The handling of the instances more than count. /// An instance of the ref struct , which works the same way as every does and can be used in a foreach construct. - public static SpanSplitStringSplitOptionsWithCountEnumerator Split(this Span source, char delimiter, int count, StringSplitOptions options, CountExceedingBehaviour countExceedingBehaviour = CountExceedingBehaviour.AppendRemainingElements) + public static SpanSplitStringSplitOptionsWithCountEnumerator Split(Span source, char delimiter, int count, StringSplitOptions options, CountExceedingBehaviour countExceedingBehaviour = CountExceedingBehaviour.AppendRemainingElements) { return new SpanSplitStringSplitOptionsWithCountEnumerator(source, delimiter, count, options, countExceedingBehaviour); } diff --git a/src/Extensions/Span/String/SplitAny.cs b/src/Extensions/Span/String/SplitAny.cs index 8cdc665..31a9c15 100644 --- a/src/Extensions/Span/String/SplitAny.cs +++ b/src/Extensions/Span/String/SplitAny.cs @@ -13,7 +13,7 @@ public static partial class SpanExtensions /// The to be split. /// A , that delimit the various sub-ReadOnlySpans in . /// An instance of the ref struct , which works the same way as every does and can be used in a foreach construct. - public static SpanSplitAnyEnumerator SplitAny(this Span source, ReadOnlySpan delimiters) where T : IEquatable + public static SpanSplitAnyEnumerator SplitAny(Span source, ReadOnlySpan delimiters) where T : IEquatable { return new SpanSplitAnyEnumerator(source, delimiters); } @@ -27,7 +27,7 @@ public static SpanSplitAnyEnumerator SplitAny(this Span source, ReadOnl /// A , that delimit the various sub-ReadOnlySpans in . /// The handling of the instances more than count. /// An instance of the ref struct , which works the same way as every does and can be used in a foreach construct. - public static SpanSplitAnyWithCountEnumerator SplitAny(this Span source, ReadOnlySpan delimiters, int count, CountExceedingBehaviour countExceedingBehaviour = CountExceedingBehaviour.AppendRemainingElements) where T : IEquatable + public static SpanSplitAnyWithCountEnumerator SplitAny(Span source, ReadOnlySpan delimiters, int count, CountExceedingBehaviour countExceedingBehaviour = CountExceedingBehaviour.AppendRemainingElements) where T : IEquatable { return new SpanSplitAnyWithCountEnumerator(source, delimiters, count, countExceedingBehaviour); } @@ -39,7 +39,7 @@ public static SpanSplitAnyWithCountEnumerator SplitAny(this Span source /// A , that delimit the various sub-ReadOnlySpans in . /// A bitwise combination of the enumeration values that specifies whether to trim results and include empty results. /// An instance of the ref struct , which works the same way as every does and can be used in a foreach construct. - public static SpanSplitAnyStringSplitOptionsEnumerator SplitAny(this Span source, ReadOnlySpan delimiters, StringSplitOptions options) + public static SpanSplitAnyStringSplitOptionsEnumerator SplitAny(Span source, ReadOnlySpan delimiters, StringSplitOptions options) { return new SpanSplitAnyStringSplitOptionsEnumerator(source, delimiters, options); } @@ -53,7 +53,7 @@ public static SpanSplitAnyStringSplitOptionsEnumerator SplitAny(this Span /// The maximum number of sub-ReadOnlySpans to split into. /// The handling of the instances more than count. /// An instance of the ref struct , which works the same way as every does and can be used in a foreach construct. - public static SpanSplitAnyStringSplitOptionsWithCountEnumerator SplitAny(this Span source, ReadOnlySpan delimiters, int count, StringSplitOptions options, CountExceedingBehaviour countExceedingBehaviour = CountExceedingBehaviour.AppendRemainingElements) + public static SpanSplitAnyStringSplitOptionsWithCountEnumerator SplitAny(Span source, ReadOnlySpan delimiters, int count, StringSplitOptions options, CountExceedingBehaviour countExceedingBehaviour = CountExceedingBehaviour.AppendRemainingElements) { return new SpanSplitAnyStringSplitOptionsWithCountEnumerator(source, delimiters, count, options, countExceedingBehaviour); } diff --git a/src/Extensions/Span/String/SplitSequence.cs b/src/Extensions/Span/String/SplitSequence.cs index d2c10ff..14c609b 100644 --- a/src/Extensions/Span/String/SplitSequence.cs +++ b/src/Extensions/Span/String/SplitSequence.cs @@ -16,7 +16,7 @@ public static partial class SpanExtensions /// The to be split. /// An instance of that delimits the various sub-ReadOnlySpans in . /// An instance of the ref struct , which works the same way as every does and can be used in a foreach construct. - public static SpanSplitSequenceEnumerator Split(this Span source, ReadOnlySpan delimiter) where T : IEquatable + public static SpanSplitSequenceEnumerator Split(Span source, ReadOnlySpan delimiter) where T : IEquatable { return new SpanSplitSequenceEnumerator(source, delimiter); } @@ -30,7 +30,7 @@ public static SpanSplitSequenceEnumerator Split(this Span source, ReadO /// The maximum number of sub-ReadOnlySpans to split into. /// The handling of the instances more than count. /// An instance of the ref struct , which works the same way as every does and can be used in a foreach construct. - public static SpanSplitSequenceWithCountEnumerator Split(this Span source, ReadOnlySpan delimiter, int count, CountExceedingBehaviour countExceedingBehaviour = CountExceedingBehaviour.AppendRemainingElements) where T : IEquatable + public static SpanSplitSequenceWithCountEnumerator Split(Span source, ReadOnlySpan delimiter, int count, CountExceedingBehaviour countExceedingBehaviour = CountExceedingBehaviour.AppendRemainingElements) where T : IEquatable { return new SpanSplitSequenceWithCountEnumerator(source, delimiter, count, countExceedingBehaviour); } @@ -42,7 +42,7 @@ public static SpanSplitSequenceWithCountEnumerator Split(this Span sour /// An instance of that delimits the various sub-ReadOnlySpans in . /// A bitwise combination of the enumeration values that specifies whether to trim results and include empty results. /// An instance of the ref struct , which works the same way as every does and can be used in a foreach construct. - public static SpanSplitSequenceStringSplitOptionsEnumerator Split(this Span source, ReadOnlySpan delimiter, StringSplitOptions options) + public static SpanSplitSequenceStringSplitOptionsEnumerator Split(Span source, ReadOnlySpan delimiter, StringSplitOptions options) { return new SpanSplitSequenceStringSplitOptionsEnumerator(source, delimiter, options); } @@ -56,7 +56,7 @@ public static SpanSplitSequenceStringSplitOptionsEnumerator Split(this SpanA bitwise combination of the enumeration values that specifies whether to trim results and include empty results. /// The handling of the instances more than count. /// An instance of the ref struct , which works the same way as every does and can be used in a foreach construct. - public static SpanSplitSequenceStringSplitOptionsWithCountEnumerator Split(this Span source, ReadOnlySpan delimiter, int count, StringSplitOptions options, CountExceedingBehaviour countExceedingBehaviour = CountExceedingBehaviour.AppendRemainingElements) + public static SpanSplitSequenceStringSplitOptionsWithCountEnumerator Split(Span source, ReadOnlySpan delimiter, int count, StringSplitOptions options, CountExceedingBehaviour countExceedingBehaviour = CountExceedingBehaviour.AppendRemainingElements) { return new SpanSplitSequenceStringSplitOptionsWithCountEnumerator(source, delimiter, count, options, countExceedingBehaviour); } diff --git a/src/SpanExtensions.csproj b/src/SpanExtensions.csproj index 370531d..2ada243 100644 --- a/src/SpanExtensions.csproj +++ b/src/SpanExtensions.csproj @@ -1,7 +1,7 @@  - net8.0;net7.0;net6.0;net5.0;netstandard2.1 + net9.0;net8.0;net7.0;net6.0;net5.0;netstandard2.1 disable enable True @@ -22,15 +22,11 @@ Span;Performance;Extension;String https://github.com/draconware-dev/SpanExtensions.Net/blob/main/Changelog.md LICENSE - 1.4.2 + 1.5 SpanExtensions.Net README.md icon.png - - - - portable diff --git a/tests/Performance/Tests/ReadOnlySpan/Split/ReadOnlySpan_Split_Benchmark.cs b/tests/Performance/Tests/ReadOnlySpan/Split/ReadOnlySpan_Split_Benchmark.cs index 49fddb9..fb18696 100644 --- a/tests/Performance/Tests/ReadOnlySpan/Split/ReadOnlySpan_Split_Benchmark.cs +++ b/tests/Performance/Tests/ReadOnlySpan/Split/ReadOnlySpan_Split_Benchmark.cs @@ -11,7 +11,7 @@ public int Split_ReadOnlySpan(ReadOnlySpan value, char delimiter) { int iterations = 0; - foreach(ReadOnlySpan part in value.Split(delimiter)) + foreach(ReadOnlySpan part in ReadOnlySpanExtensions.Split(value, delimiter)) { iterations++; } diff --git a/tests/Performance/Tests/ReadOnlySpan/Split/ReadOnlySpan_Split_Count_Benchmark.cs b/tests/Performance/Tests/ReadOnlySpan/Split/ReadOnlySpan_Split_Count_Benchmark.cs index e24fa4c..ae4e7d6 100644 --- a/tests/Performance/Tests/ReadOnlySpan/Split/ReadOnlySpan_Split_Count_Benchmark.cs +++ b/tests/Performance/Tests/ReadOnlySpan/Split/ReadOnlySpan_Split_Count_Benchmark.cs @@ -11,7 +11,7 @@ public int Split_ReadOnlySpan(ReadOnlySpan value, char delimiter, int coun { int iterations = 0; - foreach(ReadOnlySpan part in value.Split(delimiter, count)) + foreach(ReadOnlySpan part in ReadOnlySpanExtensions.Split(value, delimiter, count)) { iterations++; } @@ -39,7 +39,7 @@ public int Split_CutLastElements_ReadOnlySpan(ReadOnlySpan value, char del { int iterations = 0; - foreach(ReadOnlySpan part in value.Split(delimiter, count, CountExceedingBehaviour.CutRemainingElements)) + foreach(ReadOnlySpan part in ReadOnlySpanExtensions.Split(value, delimiter, count, CountExceedingBehaviour.CutRemainingElements)) { iterations++; } diff --git a/tests/Performance/Tests/ReadOnlySpan/Split/ReadOnlySpan_Split_Count_StringSplitOptions_Benchmark.cs b/tests/Performance/Tests/ReadOnlySpan/Split/ReadOnlySpan_Split_Count_StringSplitOptions_Benchmark.cs index aa98039..b8d2542 100644 --- a/tests/Performance/Tests/ReadOnlySpan/Split/ReadOnlySpan_Split_Count_StringSplitOptions_Benchmark.cs +++ b/tests/Performance/Tests/ReadOnlySpan/Split/ReadOnlySpan_Split_Count_StringSplitOptions_Benchmark.cs @@ -11,7 +11,7 @@ public int Split_Count_StringSplitOptions_ReadOnlySpan(ReadOnlySpan value, { int iterations = 0; - foreach(ReadOnlySpan part in value.Split(delimiter, count, options)) + foreach(ReadOnlySpan part in ReadOnlySpanExtensions.Split(value, delimiter, count, options)) { iterations++; } @@ -39,7 +39,7 @@ public int Split_Count_StringSplitOptions_CountExceedingBehaviour_CutLastElement { int iterations = 0; - foreach(ReadOnlySpan part in value.Split(delimiter, count, options, CountExceedingBehaviour.CutRemainingElements)) + foreach(ReadOnlySpan part in ReadOnlySpanExtensions.Split(value, delimiter, count, options, CountExceedingBehaviour.CutRemainingElements)) { iterations++; } diff --git a/tests/Performance/Tests/ReadOnlySpan/Split/ReadOnlySpan_Split_StringSplitOptions_Benchmark.cs b/tests/Performance/Tests/ReadOnlySpan/Split/ReadOnlySpan_Split_StringSplitOptions_Benchmark.cs index cd07103..c46febe 100644 --- a/tests/Performance/Tests/ReadOnlySpan/Split/ReadOnlySpan_Split_StringSplitOptions_Benchmark.cs +++ b/tests/Performance/Tests/ReadOnlySpan/Split/ReadOnlySpan_Split_StringSplitOptions_Benchmark.cs @@ -11,7 +11,7 @@ public int Split_StringSplitOptions_ReadOnlySpan(ReadOnlySpan value, char { int iterations = 0; - foreach(ReadOnlySpan part in value.Split(delimiter, options)) + foreach(ReadOnlySpan part in ReadOnlySpanExtensions.Split(value, delimiter, options)) { iterations++; } diff --git a/tests/Performance/Tests/ReadOnlySpan/SplitAny/ReadOnlySpan_Split_Any_Benchmark.cs b/tests/Performance/Tests/ReadOnlySpan/SplitAny/ReadOnlySpan_Split_Any_Benchmark.cs index d5e71f8..37cf2ee 100644 --- a/tests/Performance/Tests/ReadOnlySpan/SplitAny/ReadOnlySpan_Split_Any_Benchmark.cs +++ b/tests/Performance/Tests/ReadOnlySpan/SplitAny/ReadOnlySpan_Split_Any_Benchmark.cs @@ -11,7 +11,7 @@ public int Split_Any_ReadOnlySpan(ReadOnlySpan value, char[] delimiters) { int iterations = 0; - foreach(ReadOnlySpan part in value.SplitAny(delimiters)) + foreach(ReadOnlySpan part in ReadOnlySpanExtensions.SplitAny(value, delimiters)) { iterations++; } diff --git a/tests/Performance/Tests/ReadOnlySpan/SplitAny/ReadOnlySpan_Split_Any_Count_Benchmark.cs b/tests/Performance/Tests/ReadOnlySpan/SplitAny/ReadOnlySpan_Split_Any_Count_Benchmark.cs index 98470d5..dfe9e3b 100644 --- a/tests/Performance/Tests/ReadOnlySpan/SplitAny/ReadOnlySpan_Split_Any_Count_Benchmark.cs +++ b/tests/Performance/Tests/ReadOnlySpan/SplitAny/ReadOnlySpan_Split_Any_Count_Benchmark.cs @@ -11,7 +11,7 @@ public int Split_Any_Count_ReadOnlySpan(ReadOnlySpan value, char[] delimit { int iterations = 0; - foreach(ReadOnlySpan part in value.SplitAny(delimiters, count)) + foreach(ReadOnlySpan part in ReadOnlySpanExtensions.SplitAny(value, delimiters, count)) { iterations++; } diff --git a/tests/Performance/Tests/ReadOnlySpan/SplitAny/ReadOnlySpan_Split_Any_Count_StringSplitOptions_Benchmark.cs b/tests/Performance/Tests/ReadOnlySpan/SplitAny/ReadOnlySpan_Split_Any_Count_StringSplitOptions_Benchmark.cs index da67517..9348217 100644 --- a/tests/Performance/Tests/ReadOnlySpan/SplitAny/ReadOnlySpan_Split_Any_Count_StringSplitOptions_Benchmark.cs +++ b/tests/Performance/Tests/ReadOnlySpan/SplitAny/ReadOnlySpan_Split_Any_Count_StringSplitOptions_Benchmark.cs @@ -11,7 +11,7 @@ public int Split_Any_Count_ReadOnlySpan(ReadOnlySpan value, char[] delimit { int iterations = 0; - foreach(ReadOnlySpan part in value.SplitAny(delimiters, count, options)) + foreach(ReadOnlySpan part in ReadOnlySpanExtensions.SplitAny(value, delimiters, count, options)) { iterations++; } diff --git a/tests/Performance/Tests/ReadOnlySpan/SplitAny/ReadOnlySpan_Split_Any_StringSplitOptions_Benchmark.cs b/tests/Performance/Tests/ReadOnlySpan/SplitAny/ReadOnlySpan_Split_Any_StringSplitOptions_Benchmark.cs index e3e6caa..37cadb7 100644 --- a/tests/Performance/Tests/ReadOnlySpan/SplitAny/ReadOnlySpan_Split_Any_StringSplitOptions_Benchmark.cs +++ b/tests/Performance/Tests/ReadOnlySpan/SplitAny/ReadOnlySpan_Split_Any_StringSplitOptions_Benchmark.cs @@ -11,7 +11,7 @@ public int Split_Any_Count_ReadOnlySpan(ReadOnlySpan value, char[] delimit { int iterations = 0; - foreach(ReadOnlySpan part in value.SplitAny(delimiters, options)) + foreach(ReadOnlySpan part in ReadOnlySpanExtensions.SplitAny(value, delimiters, options)) { iterations++; } diff --git a/tests/Performance/Tests/ReadOnlySpan/SplitSequence/ReadOnlySpan_SplitSequence_Benchmark.cs b/tests/Performance/Tests/ReadOnlySpan/SplitSequence/ReadOnlySpan_SplitSequence_Benchmark.cs index e9cceda..15a1b5b 100644 --- a/tests/Performance/Tests/ReadOnlySpan/SplitSequence/ReadOnlySpan_SplitSequence_Benchmark.cs +++ b/tests/Performance/Tests/ReadOnlySpan/SplitSequence/ReadOnlySpan_SplitSequence_Benchmark.cs @@ -11,7 +11,7 @@ public int Split_ReadOnlySpan(ReadOnlySpan value, ReadOnlySpan delim { int iterations = 0; - foreach(ReadOnlySpan part in value.Split(delimiter)) + foreach(ReadOnlySpan part in ReadOnlySpanExtensions.Split(value, delimiter)) { iterations++; } diff --git a/tests/Performance/Tests/ReadOnlySpan/SplitSequence/ReadOnlySpan_SplitSequence_Count_Benchmark.cs b/tests/Performance/Tests/ReadOnlySpan/SplitSequence/ReadOnlySpan_SplitSequence_Count_Benchmark.cs index f95b3a4..5191c25 100644 --- a/tests/Performance/Tests/ReadOnlySpan/SplitSequence/ReadOnlySpan_SplitSequence_Count_Benchmark.cs +++ b/tests/Performance/Tests/ReadOnlySpan/SplitSequence/ReadOnlySpan_SplitSequence_Count_Benchmark.cs @@ -11,7 +11,7 @@ public int Split_ReadOnlySpan(ReadOnlySpan value, ReadOnlySpan delim { int iterations = 0; - foreach(ReadOnlySpan part in value.Split(delimiter, count)) + foreach(ReadOnlySpan part in ReadOnlySpanExtensions.Split(value, delimiter, count)) { iterations++; } @@ -39,7 +39,7 @@ public int Split_CutLastElements_ReadOnlySpan(ReadOnlySpan value, ReadOnly { int iterations = 0; - foreach(ReadOnlySpan part in value.Split(delimiter, count, CountExceedingBehaviour.CutRemainingElements)) + foreach(ReadOnlySpan part in ReadOnlySpanExtensions.Split(value, delimiter, count, CountExceedingBehaviour.CutRemainingElements)) { iterations++; } diff --git a/tests/Performance/Tests/ReadOnlySpan/SplitSequence/ReadOnlySpan_SplitSequence_Count_StringSplitOptions_Benchmark.cs b/tests/Performance/Tests/ReadOnlySpan/SplitSequence/ReadOnlySpan_SplitSequence_Count_StringSplitOptions_Benchmark.cs index bfa7205..24a422e 100644 --- a/tests/Performance/Tests/ReadOnlySpan/SplitSequence/ReadOnlySpan_SplitSequence_Count_StringSplitOptions_Benchmark.cs +++ b/tests/Performance/Tests/ReadOnlySpan/SplitSequence/ReadOnlySpan_SplitSequence_Count_StringSplitOptions_Benchmark.cs @@ -11,7 +11,7 @@ public int Split_Count_StringSplitOptions_ReadOnlySpan(ReadOnlySpan value, { int iterations = 0; - foreach(ReadOnlySpan part in value.Split(delimiter, count, options)) + foreach(ReadOnlySpan part in ReadOnlySpanExtensions.Split(value, delimiter, count, options)) { iterations++; } @@ -39,7 +39,7 @@ public int Split_Count_StringSplitOptions_CountExceedingBehaviour_CutLastElement { int iterations = 0; - foreach(ReadOnlySpan part in value.Split(delimiter, count, options, CountExceedingBehaviour.CutRemainingElements)) + foreach(ReadOnlySpan part in ReadOnlySpanExtensions.Split(value, delimiter, count, options, CountExceedingBehaviour.CutRemainingElements)) { iterations++; } diff --git a/tests/Performance/Tests/ReadOnlySpan/SplitSequence/ReadOnlySpan_SplitSequence_StringSplitOptions_Benchmark.cs b/tests/Performance/Tests/ReadOnlySpan/SplitSequence/ReadOnlySpan_SplitSequence_StringSplitOptions_Benchmark.cs index 2d07e1c..68370bd 100644 --- a/tests/Performance/Tests/ReadOnlySpan/SplitSequence/ReadOnlySpan_SplitSequence_StringSplitOptions_Benchmark.cs +++ b/tests/Performance/Tests/ReadOnlySpan/SplitSequence/ReadOnlySpan_SplitSequence_StringSplitOptions_Benchmark.cs @@ -11,7 +11,7 @@ public int Split_StringSplitOptions_ReadOnlySpan(ReadOnlySpan value, ReadO { int iterations = 0; - foreach(ReadOnlySpan part in value.Split(delimiter, options)) + foreach(ReadOnlySpan part in ReadOnlySpanExtensions.Split(value, delimiter, options)) { iterations++; } diff --git a/tests/unit-tests/Tests/ReadOnlySpan/Split/Split/Tests.cs b/tests/unit-tests/Tests/ReadOnlySpan/Split/Split/Tests.cs index fee4cb1..a79284a 100644 --- a/tests/unit-tests/Tests/ReadOnlySpan/Split/Split/Tests.cs +++ b/tests/unit-tests/Tests/ReadOnlySpan/Split/Split/Tests.cs @@ -13,7 +13,7 @@ public void EmptySourceResultInEmptySpan() var expected = EmptyNestedCharArray; - var actual = emptySpan.Split('a').ToSystemEnumerable(); + var actual = ReadOnlySpanExtensions.Split(emptySpan, 'a').ToSystemEnumerable(); AssertEqual(expected, actual); } @@ -25,7 +25,7 @@ public void NoDelimiterOccurenceResultsInNoChange() var expected = NestedABBAArray; - var actual = source.Split('c').ToSystemEnumerable(); + var actual = ReadOnlySpanExtensions.Split(source, 'c').ToSystemEnumerable(); AssertEqual(expected, actual); } @@ -39,7 +39,7 @@ public void CountEqualZeroResultsInNothing(CountExceedingBehaviour countExceedin char[][] expected = []; - var actual = source.Split('a', 0, countExceedingBehaviour).ToSystemEnumerable(); + var actual = ReadOnlySpanExtensions.Split(source, 'a', 0, countExceedingBehaviour).ToSystemEnumerable(); AssertEqual(expected, actual); } @@ -51,7 +51,7 @@ public void CountEqualOneResultsInNoChange() var expected = NestedABBAArray; - var actual = source.Split('a', 1).ToSystemEnumerable(); + var actual = ReadOnlySpanExtensions.Split(source, 'a', 1).ToSystemEnumerable(); AssertEqual(expected, actual); } @@ -63,7 +63,7 @@ public void ConsecutiveDelimitersResultInEmptySpan() char[][] expected = [['a'], [], ['a']]; - var actual = source.Split('b').ToSystemEnumerable(); + var actual = ReadOnlySpanExtensions.Split(source, 'b').ToSystemEnumerable(); AssertEqual(expected, actual); } @@ -75,7 +75,7 @@ public void DelimiterAtTheStartResultInEmptySpan() char[][] expected = [[], ['a', 'a']]; - var actual = source.Split('b').ToSystemEnumerable(); + var actual = ReadOnlySpanExtensions.Split(source, 'b').ToSystemEnumerable(); AssertEqual(expected, actual); } @@ -87,7 +87,7 @@ public void DelimiterAtTheEndResultInEmptySpan() char[][] expected = [['a', 'a'], []]; - var actual = source.Split('b').ToSystemEnumerable(); + var actual = ReadOnlySpanExtensions.Split(source, 'b').ToSystemEnumerable(); AssertEqual(expected, actual); } @@ -98,7 +98,7 @@ public void CountEqualDelimiterCountResultsInSpanWithEverythingAfterAndIncluding { ReadOnlySpan source = sourceString; - var actual = source.Split(delimiter, count).ToSystemEnumerable(); + var actual = ReadOnlySpanExtensions.Split(source, delimiter, count).ToSystemEnumerable(); AssertEqual(expected, actual); } @@ -109,7 +109,7 @@ public void DelimiterAtTheEndWithCountEqualDelimiterCountResultsInSpanWithDelimi { ReadOnlySpan source = sourceString; - var actual = source.Split(delimiter, count).ToSystemEnumerable(); + var actual = ReadOnlySpanExtensions.Split(source, delimiter, count).ToSystemEnumerable(); AssertEqual(expected, actual); } @@ -120,7 +120,7 @@ public void CountEqualDelimiterCountResultsInEverythingAfterAndIncludingLastDeli { ReadOnlySpan source = sourceString; - var actual = source.Split(delimiter, count, CountExceedingBehaviour.CutRemainingElements).ToSystemEnumerable(); + var actual = ReadOnlySpanExtensions.Split(source, delimiter, count, CountExceedingBehaviour.CutRemainingElements).ToSystemEnumerable(); AssertEqual(expected, actual); } @@ -128,13 +128,13 @@ public void CountEqualDelimiterCountResultsInEverythingAfterAndIncludingLastDeli [Fact] public void NegativeCountThrowsArgumentOutOfRangeException() { - Assert.Throws(() => "aabb".AsSpan().Split('b', -1)); + Assert.Throws(() => ReadOnlySpanExtensions.Split("aabb", 'b', -1)); } [Fact] public void UndefinedCountExceedingBehaviourOptionThrowsArgumentException() { - Assert.Throws(() => "aabb".AsSpan().Split('b', 1, InvalidCountExceedingBehaviour)); + Assert.Throws(() => ReadOnlySpanExtensions.Split("aabb", 'b', 1, InvalidCountExceedingBehaviour)); } } } diff --git a/tests/unit-tests/Tests/ReadOnlySpan/Split/SplitAny/Tests.cs b/tests/unit-tests/Tests/ReadOnlySpan/Split/SplitAny/Tests.cs index 4e1f450..4a14766 100644 --- a/tests/unit-tests/Tests/ReadOnlySpan/Split/SplitAny/Tests.cs +++ b/tests/unit-tests/Tests/ReadOnlySpan/Split/SplitAny/Tests.cs @@ -13,7 +13,7 @@ public void EmptySourceResultInEmptySpan() var expected = EmptyNestedCharArray; - var actual = emptySpan.SplitAny(['a', 'b']).ToSystemEnumerable(); + var actual = ReadOnlySpanExtensions.SplitAny(emptySpan, ['a', 'b']).ToSystemEnumerable(); AssertEqual(expected, actual); } @@ -25,7 +25,7 @@ public void NoDelimiterOccurenceResultsInNoChange() var expected = NestedABBAArray; - var actual = source.SplitAny(['c', 'd']).ToSystemEnumerable(); + var actual = ReadOnlySpanExtensions.SplitAny(source, ['c', 'd']).ToSystemEnumerable(); AssertEqual(expected, actual); } @@ -37,7 +37,7 @@ public void EmptyDelimiterSpanResultsInNoChange() var expected = NestedABBAArray; - var actual = source.SplitAny([]).ToSystemEnumerable(); + var actual = ReadOnlySpanExtensions.SplitAny(source, []).ToSystemEnumerable(); AssertEqual(expected, actual); } @@ -51,7 +51,7 @@ public void CountEqualZeroResultsInNothing(CountExceedingBehaviour countExceedin char[][] expected = []; - var actual = source.SplitAny(['a', 'b'], 0, countExceedingBehaviour).ToSystemEnumerable(); + var actual = ReadOnlySpanExtensions.SplitAny(source, ['a', 'b'], 0, countExceedingBehaviour).ToSystemEnumerable(); AssertEqual(expected, actual); } @@ -63,7 +63,7 @@ public void CountEqualOneResultsInNoChange() var expected = NestedABBAArray; - var actual = source.SplitAny(['a', 'b'], 1).ToSystemEnumerable(); + var actual = ReadOnlySpanExtensions.SplitAny(source, ['a', 'b'], 1).ToSystemEnumerable(); AssertEqual(expected, actual); } @@ -75,7 +75,7 @@ public void ConsecutiveDelimitersResultInEmptySpan() char[][] expected = [['a'], [], ['a']]; - var actual = source.SplitAny(['b', 'c']).ToSystemEnumerable(); + var actual = ReadOnlySpanExtensions.SplitAny(source, ['b', 'c']).ToSystemEnumerable(); AssertEqual(expected, actual); } @@ -87,7 +87,7 @@ public void DelimiterAtTheStartResultInEmptySpan() char[][] expected = [[], ['a', 'a']]; - var actual = source.SplitAny(['b', 'c']).ToSystemEnumerable(); + var actual = ReadOnlySpanExtensions.SplitAny(source, ['b', 'c']).ToSystemEnumerable(); AssertEqual(expected, actual); } @@ -99,7 +99,7 @@ public void DelimiterAtTheEndResultInEmptySpan() char[][] expected = [['a', 'a'], []]; - var actual = source.SplitAny(['b', 'c']).ToSystemEnumerable(); + var actual = ReadOnlySpanExtensions.SplitAny(source, ['b', 'c']).ToSystemEnumerable(); AssertEqual(expected, actual); } @@ -110,7 +110,7 @@ public void CountEqualDelimiterCountResultsInSpanWithEverythingAfterAndIncluding { ReadOnlySpan source = sourceString; - var actual = source.SplitAny(delimiters, count).ToSystemEnumerable(); + var actual = ReadOnlySpanExtensions.SplitAny(source, delimiters, count).ToSystemEnumerable(); AssertEqual(expected, actual); } @@ -121,7 +121,7 @@ public void DelimiterAtTheEndWithCountEqualDelimiterCountResultsInSpanWithDelimi { ReadOnlySpan source = sourceString; - var actual = source.SplitAny(delimiters, count).ToSystemEnumerable(); + var actual = ReadOnlySpanExtensions.SplitAny(source, delimiters, count).ToSystemEnumerable(); AssertEqual(expected, actual); } @@ -132,7 +132,7 @@ public void CountEqualDelimiterCountResultsInEverythingAfterAndIncludingLastDeli { ReadOnlySpan source = sourceString; - var actual = source.SplitAny(delimiters, count, CountExceedingBehaviour.CutRemainingElements).ToSystemEnumerable(); + var actual = ReadOnlySpanExtensions.SplitAny(source, delimiters, count, CountExceedingBehaviour.CutRemainingElements).ToSystemEnumerable(); AssertEqual(expected, actual); } @@ -140,13 +140,13 @@ public void CountEqualDelimiterCountResultsInEverythingAfterAndIncludingLastDeli [Fact] public void NegativeCountThrowsArgumentOutOfRangeException() { - Assert.Throws(() => "aabc".AsSpan().SplitAny(['b', 'c'], -1)); + Assert.Throws(() => ReadOnlySpanExtensions.SplitAny("aabc".AsSpan(), ['b', 'c'], -1)); } [Fact] public void UndefinedCountExceedingBehaviourOptionThrowsArgumentException() { - Assert.Throws(() => "aabb".AsSpan().SplitAny(['b', 'c'], 1, InvalidCountExceedingBehaviour)); + Assert.Throws(() => ReadOnlySpanExtensions.SplitAny("aabb".AsSpan(), ['b', 'c'], 1, InvalidCountExceedingBehaviour)); } } } diff --git a/tests/unit-tests/Tests/ReadOnlySpan/Split/SplitAny_StringSplitOptions/Tests.cs b/tests/unit-tests/Tests/ReadOnlySpan/Split/SplitAny_StringSplitOptions/Tests.cs index b2a9a32..c9aba5a 100644 --- a/tests/unit-tests/Tests/ReadOnlySpan/Split/SplitAny_StringSplitOptions/Tests.cs +++ b/tests/unit-tests/Tests/ReadOnlySpan/Split/SplitAny_StringSplitOptions/Tests.cs @@ -14,7 +14,7 @@ public void EmptySourceResultInEmptySpanUnless_StringSplitOptions_RemoveEmptyEnt var expected = EmptyNestedCharArray; - var actual = emptySpan.SplitAny(['a', 'b'], options).ToSystemEnumerable(); + var actual = ReadOnlySpanExtensions.SplitAny(emptySpan, ['a', 'b'], options).ToSystemEnumerable(); AssertEqual(expected, actual); } @@ -27,7 +27,7 @@ public void NoDelimiterOccurenceResultsInNoChange(StringSplitOptions options) var expected = NestedABBAArray; - var actual = source.SplitAny(['c', 'd'], options).ToSystemEnumerable(); + var actual = ReadOnlySpanExtensions.SplitAny(source, ['c', 'd'], options).ToSystemEnumerable(); AssertEqual(expected, actual); } @@ -40,7 +40,7 @@ public void CountEqualZeroResultsInNothing(StringSplitOptions options, CountExce char[][] expected = []; - var actual = source.SplitAny(delimiters, 0, options, countExceedingBehaviour).ToSystemEnumerable(); + var actual = ReadOnlySpanExtensions.SplitAny(source, delimiters, 0, options, countExceedingBehaviour).ToSystemEnumerable(); AssertEqual(expected, actual); } @@ -52,7 +52,7 @@ public void CountEqualOneResultsInNoChange() var expected = NestedABBAArray; - var actual = source.SplitAny(['a', 'b'], 1, StringSplitOptions.None).ToSystemEnumerable(); + var actual = ReadOnlySpanExtensions.SplitAny(source, ['a', 'b'], 1, StringSplitOptions.None).ToSystemEnumerable(); AssertEqual(expected, actual); } @@ -64,7 +64,7 @@ public void ConsecutiveDelimitersResultInEmptySpan() char[][] expected = [['a'], [], ['a']]; - var actual = source.SplitAny(['b', 'c'], StringSplitOptions.None).ToSystemEnumerable(); + var actual = ReadOnlySpanExtensions.SplitAny(source, ['b', 'c'], StringSplitOptions.None).ToSystemEnumerable(); AssertEqual(expected, actual); } @@ -77,7 +77,7 @@ public void ConsecutiveDelimitersWithRemoveEmptyEntriesOptionResultInNoEmptySpan char[][] expected = [['a'], ['a']]; - var actual = source.SplitAny(['b', 'c'], options).ToSystemEnumerable(); + var actual = ReadOnlySpanExtensions.SplitAny(source, ['b', 'c'], options).ToSystemEnumerable(); AssertEqual(expected, actual); } @@ -89,7 +89,7 @@ public void DelimiterAtStartResultInEmptySpan() char[][] expected = [[], ['a', 'a']]; - var actual = source.SplitAny(['b', 'c'], StringSplitOptions.None).ToSystemEnumerable(); + var actual = ReadOnlySpanExtensions.SplitAny(source, ['b', 'c'], StringSplitOptions.None).ToSystemEnumerable(); AssertEqual(expected, actual); } @@ -102,7 +102,7 @@ public void DelimiterAtTheStartWithRemoveEmptyEntriesOptionResultInNoEmptySpan(S char[][] expected = [['a', 'a']]; - var actual = source.SplitAny(['b', 'c'], options).ToSystemEnumerable(); + var actual = ReadOnlySpanExtensions.SplitAny(source, ['b', 'c'], options).ToSystemEnumerable(); AssertEqual(expected, actual); } @@ -114,7 +114,7 @@ public void DelimiterAtTheEndResultInEmptySpan() char[][] expected = [['a', 'a'], []]; - var actual = source.SplitAny(['b', 'c'], StringSplitOptions.None).ToSystemEnumerable(); + var actual = ReadOnlySpanExtensions.SplitAny(source, ['b', 'c'], StringSplitOptions.None).ToSystemEnumerable(); AssertEqual(expected, actual); } @@ -127,7 +127,7 @@ public void DelimiterAtTheEndWithRemoveEmptyEntriesOptionResultInNoEmptySpan(Str char[][] expected = [['a', 'a']]; - var actual = source.SplitAny(['b', 'c'], options).ToSystemEnumerable(); + var actual = ReadOnlySpanExtensions.SplitAny(source, ['b', 'c'], options).ToSystemEnumerable(); AssertEqual(expected, actual); } @@ -138,7 +138,7 @@ public void CountEqualDelimiterCountResultsInSpanWithDelimiter(string input, cha { ReadOnlySpan source = input; - var actual = source.SplitAny(delimiters, count, StringSplitOptions.None, countExceedingBehaviour).ToSystemEnumerable(); + var actual = ReadOnlySpanExtensions.SplitAny(source, delimiters, count, StringSplitOptions.None, countExceedingBehaviour).ToSystemEnumerable(); AssertEqual(expected, actual); } @@ -149,7 +149,7 @@ public void DelimiterAtTheEndWithCountEqualDelimiterCountResultsInSpanWithDelimi { ReadOnlySpan source = input; - var actual = source.SplitAny(delimiters, count, StringSplitOptions.None).ToSystemEnumerable(); + var actual = ReadOnlySpanExtensions.SplitAny(source, delimiters, count, StringSplitOptions.None).ToSystemEnumerable(); AssertEqual(expected, actual); } @@ -160,7 +160,7 @@ public void CountEqualDelimiterCountResultsInEverythingAfterAndIncludingLastDeli { ReadOnlySpan source = input; - var actual = source.SplitAny(delimiters, count, StringSplitOptions.None, CountExceedingBehaviour.CutRemainingElements).ToSystemEnumerable(); + var actual = ReadOnlySpanExtensions.SplitAny(source, delimiters, count, StringSplitOptions.None, CountExceedingBehaviour.CutRemainingElements).ToSystemEnumerable(); AssertEqual(expected, actual); } @@ -173,7 +173,7 @@ public void ConsecutiveDelimitersAtTheEndWithCountEqualDelimiterCountWithRemoveE char[][] expected = [['a', 'a']]; - var actual = source.SplitAny(['b', 'c'], 2, options).ToSystemEnumerable(); + var actual = ReadOnlySpanExtensions.SplitAny(source, ['b', 'c'], 2, options).ToSystemEnumerable(); AssertEqual(expected, actual); } @@ -185,7 +185,7 @@ public void TrimEntriesOptionTrimsLastSpan() char[][] expected = [['a'], [], ['a']]; - var actual = source.SplitAny(['b', 'c'], StringSplitOptions.TrimEntries).ToSystemEnumerable(); + var actual = ReadOnlySpanExtensions.SplitAny(source, ['b', 'c'], StringSplitOptions.TrimEntries).ToSystemEnumerable(); AssertEqual(expected, actual); } @@ -197,7 +197,7 @@ public void WhiteSpaceSpanWithTrimEntriesAndRemoveEmptyEntriesOptionsReturnsNoth char[][] expected = []; - var actual = source.SplitAny(['_', '!'], StringSplitOptions.TrimEntries | StringSplitOptions.RemoveEmptyEntries).ToSystemEnumerable(); + var actual = ReadOnlySpanExtensions.SplitAny(source, ['_', '!'], StringSplitOptions.TrimEntries | StringSplitOptions.RemoveEmptyEntries).ToSystemEnumerable(); AssertEqual(expected, actual); } @@ -209,7 +209,7 @@ public void ConsecutiveDelimitersAtTheEndWithRemoveEmptyEntriesOptionResultInNoE char[][] expected = [['a', 'a']]; - var actual = source.SplitAny(['b', 'c'], StringSplitOptions.RemoveEmptyEntries).ToSystemEnumerable(); + var actual = ReadOnlySpanExtensions.SplitAny(source, ['b', 'c'], StringSplitOptions.RemoveEmptyEntries).ToSystemEnumerable(); AssertEqual(expected, actual); } @@ -221,7 +221,7 @@ public void CountEqualOneWithRemoveEmptyEntriesOptionResultsInNothingIfSourceEmp char[][] expected = []; - var actual = source.SplitAny(['b', 'c'], 1, StringSplitOptions.RemoveEmptyEntries).ToSystemEnumerable(); + var actual = ReadOnlySpanExtensions.SplitAny(source, ['b', 'c'], 1, StringSplitOptions.RemoveEmptyEntries).ToSystemEnumerable(); AssertEqual(expected, actual); } @@ -233,7 +233,7 @@ public void CountEqualOneWithRemoveEmptyEntriesOptionDoesNotRecursivelyRemoveEmp char[][] expected = [['b', 'c', 'a', 'a']]; - var actual = source.SplitAny(['b', 'c'], 1, StringSplitOptions.RemoveEmptyEntries).ToSystemEnumerable(); + var actual = ReadOnlySpanExtensions.SplitAny(source, ['b', 'c'], 1, StringSplitOptions.RemoveEmptyEntries).ToSystemEnumerable(); AssertEqual(expected, actual); } @@ -245,7 +245,7 @@ public void CountGreaterThanOneWithRemoveEmptyEntriesOptionRecursivelyRemovesEmp char[][] expected = [['a', 'a']]; - var actual = source.SplitAny(['b', 'c'], 2, StringSplitOptions.RemoveEmptyEntries).ToSystemEnumerable(); + var actual = ReadOnlySpanExtensions.SplitAny(source, ['b', 'c'], 2, StringSplitOptions.RemoveEmptyEntries).ToSystemEnumerable(); AssertEqual(expected, actual); } @@ -257,7 +257,7 @@ public void CountEqualOneWithRemoveEmptyEntriesAndTrimEntriesOptionsResultsInNot char[][] expected = []; - var actual = source.SplitAny(['b', 'c'], 1, StringSplitOptions.RemoveEmptyEntries | StringSplitOptions.TrimEntries).ToSystemEnumerable(); + var actual = ReadOnlySpanExtensions.SplitAny(source, ['b', 'c'], 1, StringSplitOptions.RemoveEmptyEntries | StringSplitOptions.TrimEntries).ToSystemEnumerable(); AssertEqual(expected, actual); } @@ -269,7 +269,7 @@ public void CountEqualOneWithRemoveEmptyEntriesAndTrimEntriesOptionsDoesNotRecur char[][] expected = [['b', '\t', 'a', 'a']]; - var actual = source.SplitAny(['b', 'c'], 1, StringSplitOptions.RemoveEmptyEntries | StringSplitOptions.TrimEntries).ToSystemEnumerable(); + var actual = ReadOnlySpanExtensions.SplitAny(source, ['b', 'c'], 1, StringSplitOptions.RemoveEmptyEntries | StringSplitOptions.TrimEntries).ToSystemEnumerable(); AssertEqual(expected, actual); } @@ -281,7 +281,7 @@ public void CountGreaterThanOneWithRemoveEmptyEntriesAndTrimEntriesOptionsRecurs char[][] expected = [['a', 'a']]; - var actual = source.SplitAny(['b', 'c'], 2, StringSplitOptions.RemoveEmptyEntries | StringSplitOptions.TrimEntries).ToSystemEnumerable(); + var actual = ReadOnlySpanExtensions.SplitAny(source, ['b', 'c'], 2, StringSplitOptions.RemoveEmptyEntries | StringSplitOptions.TrimEntries).ToSystemEnumerable(); AssertEqual(expected, actual); } @@ -292,9 +292,9 @@ public void EmptyDelimiterSpanResultsSameAsCountEqualOne(StringSplitOptions opti { ReadOnlySpan source = " "; - var expected = source.SplitAny([], 1, options).ToSystemEnumerable(); + var expected = ReadOnlySpanExtensions.SplitAny(source, [], 1, options).ToSystemEnumerable(); - var actual = source.SplitAny([], options).ToSystemEnumerable(); + var actual = ReadOnlySpanExtensions.SplitAny(source, [], options).ToSystemEnumerable(); AssertEqual(expected, actual); } @@ -302,19 +302,19 @@ public void EmptyDelimiterSpanResultsSameAsCountEqualOne(StringSplitOptions opti [Fact] public void NegativeCountThrowsArgumentOutOfRangeException() { - Assert.Throws(() => "aabc".AsSpan().SplitAny(['b', 'c'], -1, StringSplitOptions.None)); + Assert.Throws(() => ReadOnlySpanExtensions.SplitAny("aabc".AsSpan(), ['b', 'c'], -1, StringSplitOptions.None)); } [Fact] public void UndefinedCountExceedingBehaviourOptionThrowsArgumentException() { - Assert.Throws(() => "aabc".AsSpan().SplitAny(['b', 'c'], 1, StringSplitOptions.None, InvalidCountExceedingBehaviour)); + Assert.Throws(() => ReadOnlySpanExtensions.SplitAny("aabc".AsSpan(), ['b', 'c'], 1, StringSplitOptions.None, InvalidCountExceedingBehaviour)); } [Fact] public void UndefinedStringSplitOptionsThrowsArgumentException() { - Assert.Throws(() => "aabc".AsSpan().SplitAny(['b', 'c'], InvalidStringSplitOptions)); + Assert.Throws(() => ReadOnlySpanExtensions.SplitAny("aabc".AsSpan(), ['b', 'c'], InvalidStringSplitOptions)); } } } diff --git a/tests/unit-tests/Tests/ReadOnlySpan/Split/SplitSequence/Tests.cs b/tests/unit-tests/Tests/ReadOnlySpan/Split/SplitSequence/Tests.cs index 3323146..b47bdb2 100644 --- a/tests/unit-tests/Tests/ReadOnlySpan/Split/SplitSequence/Tests.cs +++ b/tests/unit-tests/Tests/ReadOnlySpan/Split/SplitSequence/Tests.cs @@ -13,7 +13,7 @@ public void EmptySourceResultInEmptySpan() var expected = EmptyNestedCharArray; - var actual = emptySpan.Split(['a', 'b']).ToSystemEnumerable(); + var actual = ReadOnlySpanExtensions.Split(emptySpan, ['a', 'b']).ToSystemEnumerable(); AssertEqual(expected, actual); } @@ -25,7 +25,7 @@ public void NoDelimiterOccurenceResultsInNoChange() var expected = NestedABBAArray; - var actual = source.Split(['c', 'd']).ToSystemEnumerable(); + var actual = ReadOnlySpanExtensions.Split(source, ['c', 'd']).ToSystemEnumerable(); AssertEqual(expected, actual); } @@ -37,7 +37,7 @@ public void EmptyDelimiterSpanResultsInNoChange() var expected = NestedABBAArray; - var actual = source.Split([]).ToSystemEnumerable(); + var actual = ReadOnlySpanExtensions.Split(source, []).ToSystemEnumerable(); AssertEqual(expected, actual); } @@ -51,7 +51,7 @@ public void CountEqualZeroResultsInNothing(CountExceedingBehaviour countExceedin char[][] expected = []; - var actual = source.Split(['a', 'b'], 0, countExceedingBehaviour).ToSystemEnumerable(); + var actual = ReadOnlySpanExtensions.Split(source, ['a', 'b'], 0, countExceedingBehaviour).ToSystemEnumerable(); AssertEqual(expected, actual); } @@ -63,7 +63,7 @@ public void CountEqualOneResultsInNoChange() var expected = NestedABBAArray; - var actual = source.Split(['a', 'b'], 1).ToSystemEnumerable(); + var actual = ReadOnlySpanExtensions.Split(source, ['a', 'b'], 1).ToSystemEnumerable(); AssertEqual(expected, actual); } @@ -75,7 +75,7 @@ public void ConsecutiveDelimitersResultInEmptySpan() char[][] expected = [['a'], [], ['a']]; - var actual = source.Split(['b', 'c']).ToSystemEnumerable(); + var actual = ReadOnlySpanExtensions.Split(source, ['b', 'c']).ToSystemEnumerable(); AssertEqual(expected, actual); } @@ -87,7 +87,7 @@ public void DelimiterAtTheStartResultInEmptySpan() char[][] expected = [[], ['a', 'a']]; - var actual = source.Split(['b', 'c']).ToSystemEnumerable(); + var actual = ReadOnlySpanExtensions.Split(source, ['b', 'c']).ToSystemEnumerable(); AssertEqual(expected, actual); } @@ -99,7 +99,7 @@ public void DelimiterAtTheEndResultInEmptySpan() char[][] expected = [['a', 'a'], []]; - var actual = source.Split(['b', 'c']).ToSystemEnumerable(); + var actual = ReadOnlySpanExtensions.Split(source, ['b', 'c']).ToSystemEnumerable(); AssertEqual(expected, actual); } @@ -110,7 +110,7 @@ public void CountEqualDelimiterCountResultsInSpanWithEverythingAfterAndIncluding { ReadOnlySpan source = sourceString; - var actual = source.Split(delimiter, count).ToSystemEnumerable(); + var actual = ReadOnlySpanExtensions.Split(source, delimiter, count).ToSystemEnumerable(); AssertEqual(expected, actual); } @@ -121,7 +121,7 @@ public void DelimiterAtTheEndWithCountEqualDelimiterCountResultsInSpanWithDelimi { ReadOnlySpan source = sourceString; - var actual = source.Split(delimiter, count).ToSystemEnumerable(); + var actual = ReadOnlySpanExtensions.Split(source, delimiter, count).ToSystemEnumerable(); AssertEqual(expected, actual); } @@ -132,7 +132,7 @@ public void CountEqualDelimiterCountResultsInEverythingAfterAndIncludingLastDeli { ReadOnlySpan source = sourceString; - var actual = source.Split(delimiter, count, CountExceedingBehaviour.CutRemainingElements).ToSystemEnumerable(); + var actual = ReadOnlySpanExtensions.Split(source, delimiter, count, CountExceedingBehaviour.CutRemainingElements).ToSystemEnumerable(); AssertEqual(expected, actual); } @@ -140,13 +140,13 @@ public void CountEqualDelimiterCountResultsInEverythingAfterAndIncludingLastDeli [Fact] public void NegativeCountThrowsArgumentOutOfRangeException() { - Assert.Throws(() => "aabcbc".AsSpan().Split(['b', 'c'], -1)); + Assert.Throws(() => ReadOnlySpanExtensions.Split("aabcbc".AsSpan(), ['b', 'c'], -1)); } [Fact] public void UndefinedCountExceedingBehaviourOptionThrowsArgumentException() { - Assert.Throws(() => "aabcbc".AsSpan().Split(['b', 'c'], 1, InvalidCountExceedingBehaviour)); + Assert.Throws(() => ReadOnlySpanExtensions.Split("aabcbc".AsSpan(), ['b', 'c'], 1, InvalidCountExceedingBehaviour)); } } } diff --git a/tests/unit-tests/Tests/ReadOnlySpan/Split/SplitSequence_StringSplitOptions/Tests.cs b/tests/unit-tests/Tests/ReadOnlySpan/Split/SplitSequence_StringSplitOptions/Tests.cs index 1e1a4f1..75adfb8 100644 --- a/tests/unit-tests/Tests/ReadOnlySpan/Split/SplitSequence_StringSplitOptions/Tests.cs +++ b/tests/unit-tests/Tests/ReadOnlySpan/Split/SplitSequence_StringSplitOptions/Tests.cs @@ -14,7 +14,7 @@ public void EmptySourceResultInEmptySpan(StringSplitOptions options) var expected = EmptyNestedCharArray; - var actual = emptySpan.Split(['b', 'c'], options).ToSystemEnumerable(); + var actual = ReadOnlySpanExtensions.Split(emptySpan, ['b', 'c'], options).ToSystemEnumerable(); AssertEqual(expected, actual); } @@ -27,7 +27,7 @@ public void NoDelimiterOccurenceResultsInNoChange(StringSplitOptions options) var expected = NestedABBAArray; - var actual = source.Split(['c', 'd'], options).ToSystemEnumerable(); + var actual = ReadOnlySpanExtensions.Split(source, ['c', 'd'], options).ToSystemEnumerable(); AssertEqual(expected, actual); } @@ -39,7 +39,7 @@ public void EmptyDelimiterSpanResultsInNoChange() var expected = NestedABBAArray; - var actual = source.Split([], StringSplitOptions.None).ToSystemEnumerable(); + var actual = ReadOnlySpanExtensions.Split(source, [], StringSplitOptions.None).ToSystemEnumerable(); AssertEqual(expected, actual); } @@ -52,7 +52,7 @@ public void CountEqualZeroResultsInNothing(StringSplitOptions options, CountExce char[][] expected = []; - var actual = source.Split(delimiter, 0, options, countExceedingBehaviour).ToSystemEnumerable(); + var actual = ReadOnlySpanExtensions.Split(source, delimiter, 0, options, countExceedingBehaviour).ToSystemEnumerable(); AssertEqual(expected, actual); } @@ -64,7 +64,7 @@ public void CountEqualOneResultsInNoChange() var expected = NestedABBAArray; - var actual = source.Split(['a', 'b'], 1, StringSplitOptions.None).ToSystemEnumerable(); + var actual = ReadOnlySpanExtensions.Split(source, ['a', 'b'], 1, StringSplitOptions.None).ToSystemEnumerable(); AssertEqual(expected, actual); } @@ -76,7 +76,7 @@ public void ConsecutiveDelimitersResultInEmptySpan() char[][] expected = [['a'], [], ['a']]; - var actual = source.Split(['b', 'c'], StringSplitOptions.None).ToSystemEnumerable(); + var actual = ReadOnlySpanExtensions.Split(source, ['b', 'c'], StringSplitOptions.None).ToSystemEnumerable(); AssertEqual(expected, actual); } @@ -89,7 +89,7 @@ public void ConsecutiveDelimitersWithRemoveEmptyEntriesOptionResultInNoEmptySpan char[][] expected = [['a'], ['a']]; - var actual = source.Split(['b', 'c'], options).ToSystemEnumerable(); + var actual = ReadOnlySpanExtensions.Split(source, ['b', 'c'], options).ToSystemEnumerable(); AssertEqual(expected, actual); } @@ -101,7 +101,7 @@ public void DelimiterAtTheStartResultInEmptySpan() char[][] expected = [[], ['a', 'a']]; - var actual = source.Split(['b', 'c'], StringSplitOptions.None).ToSystemEnumerable(); + var actual = ReadOnlySpanExtensions.Split(source, ['b', 'c'], StringSplitOptions.None).ToSystemEnumerable(); AssertEqual(expected, actual); } @@ -114,7 +114,7 @@ public void DelimiterAtTheStartWithRemoveEmptyEntriesOptionResultInNoEmptySpan(S char[][] expected = [['a', 'a']]; - var actual = source.Split(['b', 'c'], options).ToSystemEnumerable(); + var actual = ReadOnlySpanExtensions.Split(source, ['b', 'c'], options).ToSystemEnumerable(); AssertEqual(expected, actual); } @@ -126,7 +126,7 @@ public void DelimiterAtTheEndResultInEmptySpan() char[][] expected = [['a', 'a'], []]; - var actual = source.Split(['b', 'c'], StringSplitOptions.None).ToSystemEnumerable(); + var actual = ReadOnlySpanExtensions.Split(source, ['b', 'c'], StringSplitOptions.None).ToSystemEnumerable(); AssertEqual(expected, actual); } @@ -139,7 +139,7 @@ public void DelimiterAtTheEndWithRemoveEmptyEntriesOptionResultInNoEmptySpan(Str char[][] expected = [['a', 'a']]; - var actual = source.Split(['b', 'c'], options).ToSystemEnumerable(); + var actual = ReadOnlySpanExtensions.Split(source, ['b', 'c'], options).ToSystemEnumerable(); AssertEqual(expected, actual); } @@ -150,7 +150,7 @@ public void CountEqualDelimiterCountResultsInSpanWithEverythingAfterAndIncluding { ReadOnlySpan source = sourceString; - var actual = source.Split(delimiter, count, StringSplitOptions.None).ToSystemEnumerable(); + var actual = ReadOnlySpanExtensions.Split(source, delimiter, count, StringSplitOptions.None).ToSystemEnumerable(); AssertEqual(expected, actual); } @@ -161,7 +161,7 @@ public void DelimiterAtTheEndWithCountEqualDelimiterCountResultsInSpanWithDelimi { ReadOnlySpan source = sourceString; - var actual = source.Split(delimiter, count, StringSplitOptions.None).ToSystemEnumerable(); + var actual = ReadOnlySpanExtensions.Split(source, delimiter, count, StringSplitOptions.None).ToSystemEnumerable(); AssertEqual(expected, actual); } @@ -172,7 +172,7 @@ public void CountEqualDelimiterCountResultsInEverythingAfterAndIncludingLastDeli { ReadOnlySpan source = sourceString; - var actual = source.Split(delimiter, count, StringSplitOptions.None, CountExceedingBehaviour.CutRemainingElements).ToSystemEnumerable(); + var actual = ReadOnlySpanExtensions.Split(source, delimiter, count, StringSplitOptions.None, CountExceedingBehaviour.CutRemainingElements).ToSystemEnumerable(); AssertEqual(expected, actual); } @@ -185,7 +185,7 @@ public void ConsecutiveDelimitersAtTheEndWithCountEqualDelimiterCountWithRemoveE char[][] expected = [['a', 'a']]; - var actual = source.Split(['b', 'c'], 2, options).ToSystemEnumerable(); + var actual = ReadOnlySpanExtensions.Split(source, ['b', 'c'], 2, options).ToSystemEnumerable(); AssertEqual(expected, actual); } @@ -197,7 +197,7 @@ public void TrimEntriesOptionTrimsEverySpan() char[][] expected = [['a'], ['a']]; - var actual = source.Split(['b', 'c'], StringSplitOptions.TrimEntries).ToSystemEnumerable(); + var actual = ReadOnlySpanExtensions.Split(source, ['b', 'c'], StringSplitOptions.TrimEntries).ToSystemEnumerable(); AssertEqual(expected, actual); } @@ -209,7 +209,7 @@ public void WhiteSpaceSpanWithTrimEntriesAndRemoveEmptyEntriesOptionsReturnsNoth char[][] expected = []; - var actual = source.Split(['b', 'c'], StringSplitOptions.TrimEntries | StringSplitOptions.RemoveEmptyEntries).ToSystemEnumerable(); + var actual = ReadOnlySpanExtensions.Split(source, ['b', 'c'], StringSplitOptions.TrimEntries | StringSplitOptions.RemoveEmptyEntries).ToSystemEnumerable(); AssertEqual(expected, actual); } @@ -221,7 +221,7 @@ public void ConsecutiveDelimitersAtTheEndWithRemoveEmptyEntriesOptionResultInNoE char[][] expected = [['a', 'a']]; - var actual = source.Split(['b', 'c'], StringSplitOptions.RemoveEmptyEntries).ToSystemEnumerable(); + var actual = ReadOnlySpanExtensions.Split(source, ['b', 'c'], StringSplitOptions.RemoveEmptyEntries).ToSystemEnumerable(); AssertEqual(expected, actual); } @@ -233,7 +233,7 @@ public void CountEqualOneWithRemoveEmptyEntriesOptionResultsInNothingIfSourceEmp char[][] expected = []; - var actual = source.Split(['b', 'c'], 1, StringSplitOptions.RemoveEmptyEntries).ToSystemEnumerable(); + var actual = ReadOnlySpanExtensions.Split(source, ['b', 'c'], 1, StringSplitOptions.RemoveEmptyEntries).ToSystemEnumerable(); AssertEqual(expected, actual); } @@ -245,7 +245,7 @@ public void CountEqualOneWithRemoveEmptyEntriesOptionDoesNotRecursivelyRemoveEmp char[][] expected = [['b', 'c', 'a', 'a']]; - var actual = source.Split(['b', 'c'], 1, StringSplitOptions.RemoveEmptyEntries).ToSystemEnumerable(); + var actual = ReadOnlySpanExtensions.Split(source, ['b', 'c'], 1, StringSplitOptions.RemoveEmptyEntries).ToSystemEnumerable(); AssertEqual(expected, actual); } @@ -257,7 +257,7 @@ public void CountGreaterThanOneWithRemoveEmptyEntriesOptionRecursivelyRemovesEmp char[][] expected = [['a', 'a']]; - var actual = source.Split(['b', 'c'], 2, StringSplitOptions.RemoveEmptyEntries).ToSystemEnumerable(); + var actual = ReadOnlySpanExtensions.Split(source, ['b', 'c'], 2, StringSplitOptions.RemoveEmptyEntries).ToSystemEnumerable(); AssertEqual(expected, actual); } @@ -269,7 +269,7 @@ public void CountEqualOneWithRemoveEmptyEntriesAndTrimEntriesOptionsResultsInNot char[][] expected = []; - var actual = source.Split(['b', 'c'], 1, StringSplitOptions.RemoveEmptyEntries | StringSplitOptions.TrimEntries).ToSystemEnumerable(); + var actual = ReadOnlySpanExtensions.Split(source, ['b', 'c'], 1, StringSplitOptions.RemoveEmptyEntries | StringSplitOptions.TrimEntries).ToSystemEnumerable(); AssertEqual(expected, actual); } @@ -281,7 +281,7 @@ public void CountEqualOneWithRemoveEmptyEntriesAndTrimEntriesOptionsDoesNotRecur char[][] expected = [['b', 'c', '\t', 'a', 'a']]; - var actual = source.Split(['b', 'c'], 1, StringSplitOptions.RemoveEmptyEntries | StringSplitOptions.TrimEntries).ToSystemEnumerable(); + var actual = ReadOnlySpanExtensions.Split(source, ['b', 'c'], 1, StringSplitOptions.RemoveEmptyEntries | StringSplitOptions.TrimEntries).ToSystemEnumerable(); AssertEqual(expected, actual); } @@ -293,7 +293,7 @@ public void CountGreaterThanOneWithRemoveEmptyEntriesAndTrimEntriesOptionsRecurs char[][] expected = [['a', 'a']]; - var actual = source.Split(['b', 'c'], 2, StringSplitOptions.RemoveEmptyEntries | StringSplitOptions.TrimEntries).ToSystemEnumerable(); + var actual = ReadOnlySpanExtensions.Split(source, ['b', 'c'], 2, StringSplitOptions.RemoveEmptyEntries | StringSplitOptions.TrimEntries).ToSystemEnumerable(); AssertEqual(expected, actual); } @@ -301,19 +301,19 @@ public void CountGreaterThanOneWithRemoveEmptyEntriesAndTrimEntriesOptionsRecurs [Fact] public void NegativeCountThrowsArgumentOutOfRangeException() { - Assert.Throws(() => "aabc".AsSpan().Split(['b', 'c'], -1, StringSplitOptions.None)); + Assert.Throws(() => ReadOnlySpanExtensions.Split("aabc".AsSpan(), ['b', 'c'], -1, StringSplitOptions.None)); } [Fact] public void UndefinedCountExceedingBehaviourOptionThrowsArgumentException() { - Assert.Throws(() => "aabc".AsSpan().Split(['b', 'c'], 1, StringSplitOptions.None, InvalidCountExceedingBehaviour)); + Assert.Throws(() => ReadOnlySpanExtensions.Split("aabc".AsSpan(), ['b', 'c'], 1, StringSplitOptions.None, InvalidCountExceedingBehaviour)); } [Fact] public void UndefinedStringSplitOptionsThrowsArgumentException() { - Assert.Throws(() => "aabc".AsSpan().Split(['b', 'c'], InvalidStringSplitOptions)); + Assert.Throws(() => ReadOnlySpanExtensions.Split("aabc".AsSpan(), ['b', 'c'], InvalidStringSplitOptions)); } } } diff --git a/tests/unit-tests/Tests/ReadOnlySpan/Split/Split_StringSplitOptions/Tests.cs b/tests/unit-tests/Tests/ReadOnlySpan/Split/Split_StringSplitOptions/Tests.cs index 6d87661..e6265f6 100644 --- a/tests/unit-tests/Tests/ReadOnlySpan/Split/Split_StringSplitOptions/Tests.cs +++ b/tests/unit-tests/Tests/ReadOnlySpan/Split/Split_StringSplitOptions/Tests.cs @@ -14,7 +14,7 @@ public void EmptySourceResultInEmptySpanUnless_StringSplitOptions_RemoveEmptyEnt var expected = EmptyNestedCharArray; - var actual = emptySpan.Split('a', options).ToSystemEnumerable(); + var actual = ReadOnlySpanExtensions.Split(emptySpan, 'a', options).ToSystemEnumerable(); AssertEqual(expected, actual); } @@ -27,7 +27,7 @@ public void NoDelimiterOccurenceResultsInNoChange(StringSplitOptions options) var expected = NestedABBAArray; - var actual = source.Split('c', options).ToSystemEnumerable(); + var actual = ReadOnlySpanExtensions.Split(source, 'c', options).ToSystemEnumerable(); AssertEqual(expected, actual); } @@ -40,7 +40,7 @@ public void CountEqualZeroResultsInNothing(StringSplitOptions options, CountExce char[][] expected = []; - var actual = source.Split(delimiter, 0, options, countExceedingBehaviour).ToSystemEnumerable(); + var actual = ReadOnlySpanExtensions.Split(source, delimiter, 0, options, countExceedingBehaviour).ToSystemEnumerable(); AssertEqual(expected, actual); } @@ -52,7 +52,7 @@ public void CountEqualOneResultsInNoChange() var expected = NestedABBAArray; - var actual = source.Split('a', 1, StringSplitOptions.None).ToSystemEnumerable(); + var actual = ReadOnlySpanExtensions.Split(source, 'a', 1, StringSplitOptions.None).ToSystemEnumerable(); AssertEqual(expected, actual); } @@ -64,7 +64,7 @@ public void ConsecutiveDelimitersResultInEmptySpan() char[][] expected = [['a'], [], ['a']]; - var actual = source.Split('b', StringSplitOptions.None).ToSystemEnumerable(); + var actual = ReadOnlySpanExtensions.Split(source, 'b', StringSplitOptions.None).ToSystemEnumerable(); AssertEqual(expected, actual); } @@ -77,7 +77,7 @@ public void ConsecutiveDelimitersWithRemoveEmptyEntriesOptionResultInNoEmptySpan char[][] expected = [['a'], ['a']]; - var actual = source.Split('b', options).ToSystemEnumerable(); + var actual = ReadOnlySpanExtensions.Split(source, 'b', options).ToSystemEnumerable(); AssertEqual(expected, actual); } @@ -89,7 +89,7 @@ public void DelimiterAtTheStartResultInEmptySpan() char[][] expected = [[], ['a', 'a']]; - var actual = source.Split('b', StringSplitOptions.None).ToSystemEnumerable(); + var actual = ReadOnlySpanExtensions.Split(source, 'b', StringSplitOptions.None).ToSystemEnumerable(); AssertEqual(expected, actual); } @@ -102,7 +102,7 @@ public void DelimiterAtTheStartWithRemoveEmptyEntriesOptionResultInNoEmptySpan(S char[][] expected = [['a', 'a']]; - var actual = source.Split('b', options).ToSystemEnumerable(); + var actual = ReadOnlySpanExtensions.Split(source, 'b', options).ToSystemEnumerable(); AssertEqual(expected, actual); } @@ -114,7 +114,7 @@ public void DelimiterAtTheEndResultInEmptySpan() char[][] expected = [['a', 'a'], []]; - var actual = source.Split('b', StringSplitOptions.None).ToSystemEnumerable(); + var actual = ReadOnlySpanExtensions.Split(source, 'b', StringSplitOptions.None).ToSystemEnumerable(); AssertEqual(expected, actual); } @@ -127,7 +127,7 @@ public void DelimiterAtTheEndWithRemoveEmptyEntriesOptionResultInNoEmptySpan(Str char[][] expected = [['a', 'a']]; - var actual = source.Split('b', options).ToSystemEnumerable(); + var actual = ReadOnlySpanExtensions.Split(source, 'b', options).ToSystemEnumerable(); AssertEqual(expected, actual); } @@ -138,7 +138,7 @@ public void CountEqualDelimiterCountResultsInSpanWithEverythingAfterAndIncluding { ReadOnlySpan source = sourceString; - var actual = source.Split(delimiter, count, StringSplitOptions.None).ToSystemEnumerable(); + var actual = ReadOnlySpanExtensions.Split(source, delimiter, count, StringSplitOptions.None).ToSystemEnumerable(); AssertEqual(expected, actual); } @@ -149,7 +149,7 @@ public void DelimiterAtTheEndWithCountEqualDelimiterCountResultsInSpanWithDelimi { ReadOnlySpan source = sourceString; - var actual = source.Split(delimiter, count).ToSystemEnumerable(); + var actual = ReadOnlySpanExtensions.Split(source, delimiter, count).ToSystemEnumerable(); AssertEqual(expected, actual); } @@ -161,7 +161,7 @@ public void CountEqualDelimiterCountResultsInEverythingAfterAndIncludingLastDeli { ReadOnlySpan source = sourceString; - var actual = source.Split(delimiter, count, StringSplitOptions.None, CountExceedingBehaviour.CutRemainingElements).ToSystemEnumerable(); + var actual = ReadOnlySpanExtensions.Split(source, delimiter, count, StringSplitOptions.None, CountExceedingBehaviour.CutRemainingElements).ToSystemEnumerable(); AssertEqual(expected, actual); } @@ -174,7 +174,7 @@ public void ConsecutiveDelimitersAtTheEndWithCountEqualDelimiterCountWithRemoveE char[][] expected = [['a', 'a']]; - var actual = source.Split('b', 2, options).ToSystemEnumerable(); + var actual = ReadOnlySpanExtensions.Split(source, 'b', 2, options).ToSystemEnumerable(); AssertEqual(expected, actual); } @@ -186,7 +186,7 @@ public void TrimEntriesOptionTrimsEverySpan() char[][] expected = [['a'], ['a']]; - var actual = source.Split('b', StringSplitOptions.TrimEntries).ToSystemEnumerable(); + var actual = ReadOnlySpanExtensions.Split(source, 'b', StringSplitOptions.TrimEntries).ToSystemEnumerable(); AssertEqual(expected, actual); } @@ -198,7 +198,7 @@ public void WhiteSpaceSpanWithTrimEntriesAndRemoveEmptyEntriesOptionsReturnsNoth char[][] expected = []; - var actual = source.Split('_', StringSplitOptions.TrimEntries | StringSplitOptions.RemoveEmptyEntries).ToSystemEnumerable(); + var actual = ReadOnlySpanExtensions.Split(source, '_', StringSplitOptions.TrimEntries | StringSplitOptions.RemoveEmptyEntries).ToSystemEnumerable(); AssertEqual(expected, actual); } @@ -210,7 +210,7 @@ public void ConsecutiveDelimitersAtTheEndWithRemoveEmptyEntriesOptionResultInNoE char[][] expected = [['a', 'a']]; - var actual = source.Split('b', StringSplitOptions.RemoveEmptyEntries).ToSystemEnumerable(); + var actual = ReadOnlySpanExtensions.Split(source, 'b', StringSplitOptions.RemoveEmptyEntries).ToSystemEnumerable(); AssertEqual(expected, actual); } @@ -222,7 +222,7 @@ public void CountEqualOneWithRemoveEmptyEntriesOptionResultsInNothingIfSourceEmp char[][] expected = []; - var actual = source.Split('b', 1, StringSplitOptions.RemoveEmptyEntries).ToSystemEnumerable(); + var actual = ReadOnlySpanExtensions.Split(source, 'b', 1, StringSplitOptions.RemoveEmptyEntries).ToSystemEnumerable(); AssertEqual(expected, actual); } @@ -234,7 +234,7 @@ public void CountEqualOneWithRemoveEmptyEntriesOptionDoesNotRecursivelyRemoveEmp char[][] expected = [['b', 'a', 'a']]; - var actual = source.Split('b', 1, StringSplitOptions.RemoveEmptyEntries).ToSystemEnumerable(); + var actual = ReadOnlySpanExtensions.Split(source, 'b', 1, StringSplitOptions.RemoveEmptyEntries).ToSystemEnumerable(); AssertEqual(expected, actual); } @@ -246,7 +246,7 @@ public void CountGreaterThanOneWithRemoveEmptyEntriesOptionRecursivelyRemovesEmp char[][] expected = [['a', 'a']]; - var actual = source.Split('b', 2, StringSplitOptions.RemoveEmptyEntries).ToSystemEnumerable(); + var actual = ReadOnlySpanExtensions.Split(source, 'b', 2, StringSplitOptions.RemoveEmptyEntries).ToSystemEnumerable(); AssertEqual(expected, actual); } @@ -258,7 +258,7 @@ public void CountEqualOneWithRemoveEmptyEntriesAndTrimEntriesOptionsResultsInNot char[][] expected = []; - var actual = source.Split('b', 1, StringSplitOptions.RemoveEmptyEntries | StringSplitOptions.TrimEntries).ToSystemEnumerable(); + var actual = ReadOnlySpanExtensions.Split(source, 'b', 1, StringSplitOptions.RemoveEmptyEntries | StringSplitOptions.TrimEntries).ToSystemEnumerable(); AssertEqual(expected, actual); } @@ -270,7 +270,7 @@ public void CountEqualOneWithRemoveEmptyEntriesAndTrimEntriesOptionsDoesNotRecur char[][] expected = [['b', '\t', 'a', 'a']]; - var actual = source.Split('b', 1, StringSplitOptions.RemoveEmptyEntries | StringSplitOptions.TrimEntries).ToSystemEnumerable(); + var actual = ReadOnlySpanExtensions.Split(source, 'b', 1, StringSplitOptions.RemoveEmptyEntries | StringSplitOptions.TrimEntries).ToSystemEnumerable(); AssertEqual(expected, actual); } @@ -282,7 +282,7 @@ public void CountGreaterThanOneWithRemoveEmptyEntriesAndTrimEntriesOptionsRecurs char[][] expected = [['a', 'a']]; - var actual = source.Split('b', 2, StringSplitOptions.RemoveEmptyEntries | StringSplitOptions.TrimEntries).ToSystemEnumerable(); + var actual = ReadOnlySpanExtensions.Split(source, 'b', 2, StringSplitOptions.RemoveEmptyEntries | StringSplitOptions.TrimEntries).ToSystemEnumerable(); AssertEqual(expected, actual); } @@ -290,19 +290,19 @@ public void CountGreaterThanOneWithRemoveEmptyEntriesAndTrimEntriesOptionsRecurs [Fact] public void NegativeCountThrowsArgumentOutOfRangeException() { - Assert.Throws(() => "aabb".AsSpan().Split('b', -1, StringSplitOptions.None)); + Assert.Throws(() => ReadOnlySpanExtensions.Split("aabb".AsSpan(), 'b', -1, StringSplitOptions.None)); } [Fact] public void UndefinedCountExceedingBehaviourOptionThrowsArgumentException() { - Assert.Throws(() => "aabb".AsSpan().Split('b', 1, StringSplitOptions.None, InvalidCountExceedingBehaviour)); + Assert.Throws(() => ReadOnlySpanExtensions.Split("aabb".AsSpan(), 'b', 1, StringSplitOptions.None, InvalidCountExceedingBehaviour)); } [Fact] public void UndefinedStringSplitOptionsThrowsArgumentException() { - Assert.Throws(() => "aabb".AsSpan().Split('b', InvalidStringSplitOptions)); + Assert.Throws(() => ReadOnlySpanExtensions.Split("aabb".AsSpan(), 'b', InvalidStringSplitOptions)); } } }