diff --git a/src/core/StackExchange.Redis.Extensions.Core/Extensions/GenericsExtensions.cs b/src/core/StackExchange.Redis.Extensions.Core/Extensions/GenericsExtensions.cs new file mode 100644 index 00000000..86cabf1e --- /dev/null +++ b/src/core/StackExchange.Redis.Extensions.Core/Extensions/GenericsExtensions.cs @@ -0,0 +1,44 @@ +using System; +using System.Collections.Generic; + +namespace StackExchange.Redis.Extensions.Core.Extensions; + +internal static class GenericsExtensions +{ + public static TResult[] ToFastArray(this ReadOnlySpan source, Func action) + { + if (source.IsEmpty) + return []; + + var result = new TResult[source.Length]; + for (var i = 0; i < source.Length; i++) + result[i] = action.Invoke(source[i]); + + return result; + } + + public static TResult[] ToFastArray(this ICollection? source, Func action) + { + if (source is not { Count: > 0 }) + return []; + + if (source is TSource[] sourceArray) + return sourceArray.AsSpan().ToFastArray(action); + + if (source is IList sourceList) + { + var listResult = new TResult[sourceList.Count]; + for (var i = 0; i < listResult.Length; i++) + listResult[i] = action.Invoke(sourceList[i]); + + return listResult; + } + + var result = new TResult[source.Count]; + var index = 0; + foreach (var item in source) + result[index++] = action.Invoke(item); + + return result; + } +} diff --git a/src/core/StackExchange.Redis.Extensions.Core/Extensions/SpanExtensions.cs b/src/core/StackExchange.Redis.Extensions.Core/Extensions/SpanExtensions.cs index d83f1137..41fd15be 100644 --- a/src/core/StackExchange.Redis.Extensions.Core/Extensions/SpanExtensions.cs +++ b/src/core/StackExchange.Redis.Extensions.Core/Extensions/SpanExtensions.cs @@ -47,17 +47,4 @@ public static void EnumerateLines(this ReadOnlySpan span, ref List(this ReadOnlySpan span, Func action) - { - if (span.IsEmpty) - return []; - - var result = new TResult[span.Length]; - - for (var i = 0; i < span.Length; i++) - result[i] = action.Invoke(span[i]); - - return result; - } } diff --git a/src/core/StackExchange.Redis.Extensions.Core/Helpers/GenericsExtensions.cs b/src/core/StackExchange.Redis.Extensions.Core/Helpers/GenericsExtensions.cs deleted file mode 100644 index f3bea6aa..00000000 --- a/src/core/StackExchange.Redis.Extensions.Core/Helpers/GenericsExtensions.cs +++ /dev/null @@ -1,63 +0,0 @@ -using System; -using System.Collections.Generic; -#if NET8_0_OR_GREATER -using System.Runtime.InteropServices; -#endif - -namespace StackExchange.Redis.Extensions.Core.Helpers; - -internal static class GenericsExtensions -{ - public static TResult[] ToFastArray(this TSource[]? source, Func action) - { - if (source is not { Length: > 0 }) - return []; - - var result = new TResult[source.Length]; - for (var i = 0; i < source.Length; i++) - result[i] = action.Invoke(source[i]); - - return result; - } - - public static TResult[] ToFastArray(this ICollection? source, Func action) - { - if (source is null) - return []; - - if (source is TSource[] sourceArray) - return sourceArray.ToFastArray(action); - -#if NET8_0_OR_GREATER - // Iterating a List through ICollection would box its struct enumerator; the span avoids both - // the boxing and the per-item interface dispatch. - if (source is List sourceList) - { - var span = CollectionsMarshal.AsSpan(sourceList); - - if (span.Length == 0) - return []; - - var listResult = new TResult[span.Length]; - for (var i = 0; i < span.Length; i++) - listResult[i] = action.Invoke(span[i]); - - return listResult; - } -#endif - - var srcCnt = source.Count; - if (srcCnt == 0) - return []; - - var result = new TResult[srcCnt]; - var i2 = 0; - foreach (var item in source) - { - result[i2] = action.Invoke(item); - i2++; - } - - return result; - } -} diff --git a/src/core/StackExchange.Redis.Extensions.Core/Implementations/RedisDatabase.Bitmap.cs b/src/core/StackExchange.Redis.Extensions.Core/Implementations/RedisDatabase.Bitmap.cs index 01cdc724..f78c1007 100644 --- a/src/core/StackExchange.Redis.Extensions.Core/Implementations/RedisDatabase.Bitmap.cs +++ b/src/core/StackExchange.Redis.Extensions.Core/Implementations/RedisDatabase.Bitmap.cs @@ -3,7 +3,7 @@ using System; using System.Threading.Tasks; -using StackExchange.Redis.Extensions.Core.Helpers; +using StackExchange.Redis.Extensions.Core.Extensions; namespace StackExchange.Redis.Extensions.Core.Implementations; diff --git a/src/core/StackExchange.Redis.Extensions.Core/Implementations/RedisDatabase.Geo.cs b/src/core/StackExchange.Redis.Extensions.Core/Implementations/RedisDatabase.Geo.cs index 5f5978b6..bc25734b 100644 --- a/src/core/StackExchange.Redis.Extensions.Core/Implementations/RedisDatabase.Geo.cs +++ b/src/core/StackExchange.Redis.Extensions.Core/Implementations/RedisDatabase.Geo.cs @@ -2,7 +2,7 @@ using System.Threading.Tasks; -using StackExchange.Redis.Extensions.Core.Helpers; +using StackExchange.Redis.Extensions.Core.Extensions; namespace StackExchange.Redis.Extensions.Core.Implementations; diff --git a/src/core/StackExchange.Redis.Extensions.Core/Implementations/RedisDatabase.Hash.cs b/src/core/StackExchange.Redis.Extensions.Core/Implementations/RedisDatabase.Hash.cs index b57007b9..1c9cd0b0 100644 --- a/src/core/StackExchange.Redis.Extensions.Core/Implementations/RedisDatabase.Hash.cs +++ b/src/core/StackExchange.Redis.Extensions.Core/Implementations/RedisDatabase.Hash.cs @@ -5,7 +5,7 @@ using System.Linq; using System.Threading.Tasks; -using StackExchange.Redis.Extensions.Core.Helpers; +using StackExchange.Redis.Extensions.Core.Extensions; namespace StackExchange.Redis.Extensions.Core.Implementations; diff --git a/src/core/StackExchange.Redis.Extensions.Core/Implementations/RedisDatabase.HyperLogLog.cs b/src/core/StackExchange.Redis.Extensions.Core/Implementations/RedisDatabase.HyperLogLog.cs index 381dc79c..aaf702dd 100644 --- a/src/core/StackExchange.Redis.Extensions.Core/Implementations/RedisDatabase.HyperLogLog.cs +++ b/src/core/StackExchange.Redis.Extensions.Core/Implementations/RedisDatabase.HyperLogLog.cs @@ -3,7 +3,7 @@ using System; using System.Threading.Tasks; -using StackExchange.Redis.Extensions.Core.Helpers; +using StackExchange.Redis.Extensions.Core.Extensions; namespace StackExchange.Redis.Extensions.Core.Implementations; diff --git a/src/core/StackExchange.Redis.Extensions.Core/Implementations/RedisDatabase.List.cs b/src/core/StackExchange.Redis.Extensions.Core/Implementations/RedisDatabase.List.cs index 7bfc0c17..d84c8d9d 100644 --- a/src/core/StackExchange.Redis.Extensions.Core/Implementations/RedisDatabase.List.cs +++ b/src/core/StackExchange.Redis.Extensions.Core/Implementations/RedisDatabase.List.cs @@ -4,7 +4,7 @@ using System.Collections.Generic; using System.Threading.Tasks; -using StackExchange.Redis.Extensions.Core.Helpers; +using StackExchange.Redis.Extensions.Core.Extensions; namespace StackExchange.Redis.Extensions.Core.Implementations; diff --git a/src/core/StackExchange.Redis.Extensions.Core/Implementations/RedisDatabase.PubSub.cs b/src/core/StackExchange.Redis.Extensions.Core/Implementations/RedisDatabase.PubSub.cs index 68cf1bf3..6c5dad19 100644 --- a/src/core/StackExchange.Redis.Extensions.Core/Implementations/RedisDatabase.PubSub.cs +++ b/src/core/StackExchange.Redis.Extensions.Core/Implementations/RedisDatabase.PubSub.cs @@ -4,7 +4,7 @@ using System.Collections.Generic; using System.Threading.Tasks; -using StackExchange.Redis.Extensions.Core.Helpers; +using StackExchange.Redis.Extensions.Core.Extensions; using StackExchange.Redis.Extensions.Core.Logging; namespace StackExchange.Redis.Extensions.Core.Implementations; diff --git a/src/core/StackExchange.Redis.Extensions.Core/Implementations/RedisDatabase.Sort.cs b/src/core/StackExchange.Redis.Extensions.Core/Implementations/RedisDatabase.Sort.cs index a0d1e0d8..98ce40cf 100644 --- a/src/core/StackExchange.Redis.Extensions.Core/Implementations/RedisDatabase.Sort.cs +++ b/src/core/StackExchange.Redis.Extensions.Core/Implementations/RedisDatabase.Sort.cs @@ -1,10 +1,9 @@ // Copyright (c) Ugo Lattanzi. All Rights Reserved. Licensed under the MIT license. See License.txt in the project root for license information. using System.Collections.Generic; -using System.Linq; using System.Threading.Tasks; -using StackExchange.Redis.Extensions.Core.Helpers; +using StackExchange.Redis.Extensions.Core.Extensions; using StackExchange.Redis.Extensions.Core.Models; namespace StackExchange.Redis.Extensions.Core.Implementations; diff --git a/src/core/StackExchange.Redis.Extensions.Core/Implementations/RedisDatabase.Streams.cs b/src/core/StackExchange.Redis.Extensions.Core/Implementations/RedisDatabase.Streams.cs index 8e27376d..dc6982c9 100644 --- a/src/core/StackExchange.Redis.Extensions.Core/Implementations/RedisDatabase.Streams.cs +++ b/src/core/StackExchange.Redis.Extensions.Core/Implementations/RedisDatabase.Streams.cs @@ -2,7 +2,7 @@ using System.Threading.Tasks; -using StackExchange.Redis.Extensions.Core.Helpers; +using StackExchange.Redis.Extensions.Core.Extensions; namespace StackExchange.Redis.Extensions.Core.Implementations; diff --git a/src/core/StackExchange.Redis.Extensions.Core/Implementations/RedisDatabase.cs b/src/core/StackExchange.Redis.Extensions.Core/Implementations/RedisDatabase.cs index ecc7b42d..9f3c333b 100644 --- a/src/core/StackExchange.Redis.Extensions.Core/Implementations/RedisDatabase.cs +++ b/src/core/StackExchange.Redis.Extensions.Core/Implementations/RedisDatabase.cs @@ -2,7 +2,6 @@ using System; using System.Collections.Generic; -using System.Linq; using System.Runtime.CompilerServices; using System.Runtime.InteropServices; using System.Threading.Tasks; diff --git a/tests/StackExchange.Redis.Extensions.Core.Tests/CacheClientTestBase.Hash.cs b/tests/StackExchange.Redis.Extensions.Core.Tests/CacheClientTestBase.Hash.cs index bd50cf01..0baca730 100644 --- a/tests/StackExchange.Redis.Extensions.Core.Tests/CacheClientTestBase.Hash.cs +++ b/tests/StackExchange.Redis.Extensions.Core.Tests/CacheClientTestBase.Hash.cs @@ -4,7 +4,7 @@ using System.Collections.Generic; using System.Threading.Tasks; -using StackExchange.Redis.Extensions.Core.Helpers; +using StackExchange.Redis.Extensions.Core.Extensions; using StackExchange.Redis.Extensions.Core.Tests.Helpers; using Xunit; diff --git a/tests/StackExchange.Redis.Extensions.Core.Tests/CacheClientTestBase.cs b/tests/StackExchange.Redis.Extensions.Core.Tests/CacheClientTestBase.cs index e3798a02..40167ce5 100644 --- a/tests/StackExchange.Redis.Extensions.Core.Tests/CacheClientTestBase.cs +++ b/tests/StackExchange.Redis.Extensions.Core.Tests/CacheClientTestBase.cs @@ -11,11 +11,9 @@ using NSubstitute; -using StackExchange.Redis; - using StackExchange.Redis.Extensions.Core.Abstractions; using StackExchange.Redis.Extensions.Core.Configuration; -using StackExchange.Redis.Extensions.Core.Helpers; +using StackExchange.Redis.Extensions.Core.Extensions; using StackExchange.Redis.Extensions.Core.Implementations; using StackExchange.Redis.Extensions.Core.Tests.Helpers; using StackExchange.Redis.Extensions.Tests.Extensions;