Skip to content

Commit b449db6

Browse files
committed
[Contains] Use always Visitor and fix it.
1 parent a156a9d commit b449db6

File tree

8 files changed

+47
-356
lines changed

8 files changed

+47
-356
lines changed

Documents/BenchmarksResults/Contains.md

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -6,16 +6,16 @@
66
### Results:
77
``` ini
88

9-
BenchmarkDotNet=v0.12.1, OS=Windows 10.0.19042
9+
BenchmarkDotNet=v0.12.1, OS=Windows 10.0.19043
1010
Intel Core i7-8750H CPU 2.20GHz (Coffee Lake), 1 CPU, 12 logical and 6 physical cores
11-
.NET Core SDK=5.0.101
12-
[Host] : .NET Core 5.0.1 (CoreCLR 5.0.120.57516, CoreFX 5.0.120.57516), X64 RyuJIT
13-
DefaultJob : .NET Core 5.0.1 (CoreCLR 5.0.120.57516, CoreFX 5.0.120.57516), X64 RyuJIT
11+
.NET Core SDK=5.0.301
12+
[Host] : .NET Core 5.0.7 (CoreCLR 5.0.721.25508, CoreFX 5.0.721.25508), X64 RyuJIT
13+
DefaultJob : .NET Core 5.0.7 (CoreCLR 5.0.721.25508, CoreFX 5.0.721.25508), X64 RyuJIT
1414

1515

1616
```
17-
| Method | Mean | Error | StdDev | Ratio | Code Size | Gen 0 | Gen 1 | Gen 2 | Allocated |
18-
|-------------------- |---------:|----------:|----------:|------:|----------:|-------:|------:|------:|----------:|
19-
| Array | 1.128 μs | 0.0031 μs | 0.0026 μs | 1.00 | 98 B | - | - | - | - |
20-
| StructLinq | 2.592 μs | 0.0129 μs | 0.0114 μs | 2.30 | 176 B | 0.0038 | - | - | 32 B |
21-
| StructLinqZeroAlloc | 3.803 μs | 0.0059 μs | 0.0053 μs | 3.37 | 256 B | - | - | - | - |
17+
| Method | Mean | Error | StdDev | Ratio | RatioSD | Code Size | Gen 0 | Gen 1 | Gen 2 | Allocated |
18+
|-------------------- |---------:|----------:|----------:|------:|--------:|----------:|-------:|------:|------:|----------:|
19+
| Array | 1.096 μs | 0.0055 μs | 0.0052 μs | 1.00 | 0.00 | 98 B | - | - | - | - |
20+
| StructLinq | 3.203 μs | 0.0088 μs | 0.0083 μs | 2.92 | 0.02 | 148 B | 0.0038 | - | - | 32 B |
21+
| StructLinqZeroAlloc | 1.910 μs | 0.0088 μs | 0.0078 μs | 1.74 | 0.01 | 347 B | - | - | - | - |

Documents/BenchmarksResults/ContainsOnBigStruct.md

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -6,19 +6,19 @@
66
### Results:
77
``` ini
88

9-
BenchmarkDotNet=v0.12.1, OS=Windows 10.0.19042
9+
BenchmarkDotNet=v0.12.1, OS=Windows 10.0.19043
1010
Intel Core i7-8750H CPU 2.20GHz (Coffee Lake), 1 CPU, 12 logical and 6 physical cores
11-
.NET Core SDK=5.0.101
12-
[Host] : .NET Core 5.0.1 (CoreCLR 5.0.120.57516, CoreFX 5.0.120.57516), X64 RyuJIT
13-
DefaultJob : .NET Core 5.0.1 (CoreCLR 5.0.120.57516, CoreFX 5.0.120.57516), X64 RyuJIT
11+
.NET Core SDK=5.0.301
12+
[Host] : .NET Core 5.0.7 (CoreCLR 5.0.721.25508, CoreFX 5.0.721.25508), X64 RyuJIT
13+
DefaultJob : .NET Core 5.0.7 (CoreCLR 5.0.721.25508, CoreFX 5.0.721.25508), X64 RyuJIT
1414

1515

1616
```
17-
| Method | Mean | Error | StdDev | Ratio | Gen 0 | Gen 1 | Gen 2 | Allocated |
18-
|----------------------------------------- |----------:|----------:|----------:|------:|------:|------:|------:|----------:|
19-
| Linq | 6.379 μs | 0.0133 μs | 0.0117 μs | 1.00 | - | - | - | - |
20-
| Array | 6.350 μs | 0.0166 μs | 0.0147 μs | 1.00 | - | - | - | - |
21-
| StructLinq | 22.289 μs | 0.0510 μs | 0.0398 μs | 3.49 | - | - | - | - |
22-
| RefStructLinq | 16.671 μs | 0.0332 μs | 0.0311 μs | 2.61 | - | - | - | - |
23-
| StructLinqWithCustomComparer | 15.165 μs | 0.0679 μs | 0.0602 μs | 2.38 | - | - | - | - |
24-
| RefStructLinqZeroAllocwithCustomComparer | 5.093 μs | 0.0144 μs | 0.0120 μs | 0.80 | - | - | - | - |
17+
| Method | Mean | Error | StdDev | Ratio | RatioSD | Gen 0 | Gen 1 | Gen 2 | Allocated |
18+
|----------------------------------------- |----------:|----------:|----------:|------:|--------:|------:|------:|------:|----------:|
19+
| Linq | 6.444 μs | 0.0215 μs | 0.0201 μs | 1.00 | 0.00 | - | - | - | - |
20+
| Array | 6.426 μs | 0.0334 μs | 0.0312 μs | 1.00 | 0.00 | - | - | - | - |
21+
| StructLinq | 25.566 μs | 0.4951 μs | 0.5503 μs | 3.98 | 0.09 | - | - | - | - |
22+
| RefStructLinq | 18.115 μs | 0.1549 μs | 0.1373 μs | 2.81 | 0.02 | - | - | - | - |
23+
| StructLinqWithCustomComparer | 14.013 μs | 0.1160 μs | 0.1085 μs | 2.17 | 0.02 | - | - | - | - |
24+
| RefStructLinqZeroAllocwithCustomComparer | 5.136 μs | 0.0308 μs | 0.0273 μs | 0.80 | 0.00 | - | - | - | - |

Documents/BenchmarksResults/ContainsWhere.md

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -6,17 +6,17 @@
66
### Results:
77
``` ini
88

9-
BenchmarkDotNet=v0.12.1, OS=Windows 10.0.19042
9+
BenchmarkDotNet=v0.12.1, OS=Windows 10.0.19043
1010
Intel Core i7-8750H CPU 2.20GHz (Coffee Lake), 1 CPU, 12 logical and 6 physical cores
11-
.NET Core SDK=5.0.101
12-
[Host] : .NET Core 5.0.1 (CoreCLR 5.0.120.57516, CoreFX 5.0.120.57516), X64 RyuJIT
13-
DefaultJob : .NET Core 5.0.1 (CoreCLR 5.0.120.57516, CoreFX 5.0.120.57516), X64 RyuJIT
11+
.NET Core SDK=5.0.301
12+
[Host] : .NET Core 5.0.7 (CoreCLR 5.0.721.25508, CoreFX 5.0.721.25508), X64 RyuJIT
13+
DefaultJob : .NET Core 5.0.7 (CoreCLR 5.0.721.25508, CoreFX 5.0.721.25508), X64 RyuJIT
1414

1515

1616
```
17-
| Method | Mean | Error | StdDev | Ratio | Code Size | Gen 0 | Gen 1 | Gen 2 | Allocated |
18-
|-------------------- |---------:|---------:|---------:|------:|----------:|------:|------:|------:|----------:|
19-
| Linq | 31.71 μs | 0.122 μs | 0.095 μs | 1.00 | 1257 B | - | - | - | 48 B |
20-
| Array | 30.42 μs | 0.065 μs | 0.054 μs | 0.96 | 1257 B | - | - | - | 48 B |
21-
| StructLinq | 11.24 μs | 0.051 μs | 0.045 μs | 0.35 | 302 B | - | - | - | 64 B |
22-
| StructLinqZeroAlloc | 10.39 μs | 0.071 μs | 0.063 μs | 0.33 | 716 B | - | - | - | - |
17+
| Method | Mean | Error | StdDev | Ratio | Gen 0 | Gen 1 | Gen 2 | Allocated | Code Size |
18+
|-------------------- |---------:|---------:|---------:|------:|------:|------:|------:|----------:|----------:|
19+
| Linq | 28.27 μs | 0.174 μs | 0.155 μs | 1.00 | - | - | - | 48 B | 1257 B |
20+
| Array | 30.77 μs | 0.272 μs | 0.255 μs | 1.09 | - | - | - | 48 B | 1257 B |
21+
| StructLinq | 10.33 μs | 0.080 μs | 0.075 μs | 0.37 | - | - | - | 64 B | 302 B |
22+
| StructLinqZeroAlloc | 10.23 μs | 0.044 μs | 0.039 μs | 0.36 | - | - | - | - | 716 B |

Documents/BenchmarksResults/ContainsWhereOnBigStruct.md

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -6,19 +6,19 @@
66
### Results:
77
``` ini
88

9-
BenchmarkDotNet=v0.12.1, OS=Windows 10.0.19042
9+
BenchmarkDotNet=v0.12.1, OS=Windows 10.0.19043
1010
Intel Core i7-8750H CPU 2.20GHz (Coffee Lake), 1 CPU, 12 logical and 6 physical cores
11-
.NET Core SDK=5.0.101
12-
[Host] : .NET Core 5.0.1 (CoreCLR 5.0.120.57516, CoreFX 5.0.120.57516), X64 RyuJIT
13-
DefaultJob : .NET Core 5.0.1 (CoreCLR 5.0.120.57516, CoreFX 5.0.120.57516), X64 RyuJIT
11+
.NET Core SDK=5.0.301
12+
[Host] : .NET Core 5.0.7 (CoreCLR 5.0.721.25508, CoreFX 5.0.721.25508), X64 RyuJIT
13+
DefaultJob : .NET Core 5.0.7 (CoreCLR 5.0.721.25508, CoreFX 5.0.721.25508), X64 RyuJIT
1414

1515

1616
```
17-
| Method | Mean | Error | StdDev | Ratio | Gen 0 | Gen 1 | Gen 2 | Allocated |
18-
|----------------------------------------- |---------:|---------:|---------:|------:|------:|------:|------:|----------:|
19-
| Linq | 49.68 μs | 0.315 μs | 0.294 μs | 1.00 | - | - | - | 80 B |
20-
| Array | 52.62 μs | 0.214 μs | 0.190 μs | 1.06 | - | - | - | 80 B |
21-
| StructLinq | 52.99 μs | 0.331 μs | 0.310 μs | 1.07 | - | - | - | - |
22-
| RefStructLinq | 30.43 μs | 0.039 μs | 0.030 μs | 0.61 | - | - | - | - |
23-
| StructLinqWithCustomComparer | 22.06 μs | 0.198 μs | 0.165 μs | 0.44 | - | - | - | - |
24-
| RefStructLinqZeroAllocwithCustomComparer | 18.84 μs | 0.052 μs | 0.046 μs | 0.38 | - | - | - | - |
17+
| Method | Mean | Error | StdDev | Ratio | RatioSD | Gen 0 | Gen 1 | Gen 2 | Allocated |
18+
|----------------------------------------- |---------:|---------:|---------:|------:|--------:|------:|------:|------:|----------:|
19+
| Linq | 53.77 μs | 0.441 μs | 0.412 μs | 1.00 | 0.00 | - | - | - | 80 B |
20+
| Array | 53.76 μs | 0.703 μs | 0.658 μs | 1.00 | 0.02 | - | - | - | 80 B |
21+
| StructLinq | 65.74 μs | 0.509 μs | 0.476 μs | 1.22 | 0.01 | - | - | - | - |
22+
| RefStructLinq | 31.68 μs | 0.424 μs | 0.397 μs | 0.59 | 0.01 | - | - | - | - |
23+
| StructLinqWithCustomComparer | 25.44 μs | 0.177 μs | 0.166 μs | 0.47 | 0.00 | - | - | - | - |
24+
| RefStructLinqZeroAllocwithCustomComparer | 19.39 μs | 0.171 μs | 0.159 μs | 0.36 | 0.00 | - | - | - | - |

src/StructLinq/Contains/StructCollection.Contains.cs

Lines changed: 0 additions & 67 deletions
This file was deleted.

src/StructLinq/Contains/StructEnumerable.Contains.cs

Lines changed: 4 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -8,28 +8,14 @@ namespace StructLinq
88
{
99
public static partial class StructEnumerable
1010
{
11-
[MethodImpl(MethodImplOptions.AggressiveInlining)]
12-
private static bool InnerContains<T, TEnumerator, TComparer>(TEnumerator enumerator, T x, TComparer comparer)
13-
where TEnumerator : struct, IStructEnumerator<T>
14-
where TComparer : IEqualityComparer<T>
15-
{
16-
while (enumerator.MoveNext())
17-
{
18-
if (comparer.Equals(x, enumerator.Current))
19-
return true;
20-
}
21-
enumerator.Dispose();
22-
return false;
23-
}
24-
2511
[MethodImpl(MethodImplOptions.AggressiveInlining)]
2612
public static bool Contains<T, TEnumerable, TEnumerator, TComparer>(this TEnumerable enumerable, T x, TComparer comparer, Func<TEnumerable, IStructEnumerable<T, TEnumerator>> _)
2713
where TEnumerator : struct, IStructEnumerator<T>
2814
where TEnumerable : IStructEnumerable<T, TEnumerator>
2915
where TComparer : IEqualityComparer<T>
3016
{
3117
var visitor = new ContainsVisitor<T, TComparer>(comparer, x);
32-
return enumerable.Visit(ref visitor) == VisitStatus.EnumeratorFinished;
18+
return enumerable.Visit(ref visitor) == VisitStatus.VisitorFinished;
3319
}
3420

3521
[MethodImpl(MethodImplOptions.AggressiveInlining)]
@@ -39,7 +25,7 @@ public static bool Contains<T, TEnumerable, TEnumerator>(this TEnumerable enumer
3925
{
4026
EqualityComparer<T> equalityComparer = EqualityComparer<T>.Default;
4127
var visitor = new ContainsVisitor<T, EqualityComparer<T>>(equalityComparer, x);
42-
return enumerable.Visit(ref visitor) == VisitStatus.EnumeratorFinished;
28+
return enumerable.Visit(ref visitor) == VisitStatus.VisitorFinished;
4329
}
4430

4531
[MethodImpl(MethodImplOptions.AggressiveInlining)]
@@ -48,7 +34,7 @@ public static bool Contains<T, TEnumerator, TComparer>(this IStructEnumerable<T,
4834
where TComparer : IEqualityComparer<T>
4935
{
5036
var visitor = new ContainsVisitor<T, TComparer>(comparer, x);
51-
return enumerable.Visit(ref visitor) == VisitStatus.EnumeratorFinished;
37+
return enumerable.Visit(ref visitor) == VisitStatus.VisitorFinished;
5238
}
5339

5440
[MethodImpl(MethodImplOptions.AggressiveInlining)]
@@ -57,7 +43,7 @@ public static bool Contains<T, TEnumerator>(this IStructEnumerable<T, TEnumerato
5743
{
5844
EqualityComparer<T> equalityComparer = EqualityComparer<T>.Default;
5945
var visitor = new ContainsVisitor<T, EqualityComparer<T>>(equalityComparer, x);
60-
return enumerable.Visit(ref visitor) == VisitStatus.EnumeratorFinished;
46+
return enumerable.Visit(ref visitor) == VisitStatus.VisitorFinished;
6147
}
6248
}
6349
}

0 commit comments

Comments
 (0)