|
4 | 4 |
|
5 | 5 | using System; |
6 | 6 | using System.Runtime.CompilerServices; |
| 7 | +using StructLinq.Count; |
7 | 8 |
|
8 | 9 | // ReSharper disable once CheckNamespace |
9 | 10 | namespace StructLinq |
10 | 11 | { |
11 | 12 | public static partial class StructEnumerable |
12 | 13 | { |
13 | | - [MethodImpl(MethodImplOptions.AggressiveInlining)] |
14 | | - private static int IntCount<T,TEnumerator>(ref TEnumerator enumerator) |
15 | | - where TEnumerator : struct, IStructEnumerator<T> |
16 | | - { |
17 | | - int count = 0; |
18 | | - while (enumerator.MoveNext()) |
19 | | - { |
20 | | - count++; |
21 | | - } |
22 | | - enumerator.Dispose(); |
23 | | - return count; |
24 | | - } |
25 | | - |
26 | 14 | [MethodImpl(MethodImplOptions.AggressiveInlining)] |
27 | 15 | public static int Count<T, TEnumerator>(this IStructEnumerable<T, TEnumerator> enumerable) |
28 | 16 | where TEnumerator : struct, IStructEnumerator<T> |
29 | 17 | { |
30 | | - var structEnumerator = enumerable.GetEnumerator(); |
31 | | - return IntCount<T, TEnumerator>(ref structEnumerator); |
| 18 | + var visitor = new IntCountVisitor<T>(0); |
| 19 | + enumerable.Visit(ref visitor); |
| 20 | + return visitor.Count; |
32 | 21 | } |
33 | 22 |
|
34 | 23 | [MethodImpl(MethodImplOptions.AggressiveInlining)] |
35 | 24 | public static int Count<T, TEnumerable, TEnumerator>(this TEnumerable enumerable, Func<TEnumerable, IStructEnumerable<T, TEnumerator>> _) |
36 | 25 | where TEnumerable : IStructEnumerable<T, TEnumerator> |
37 | 26 | where TEnumerator : struct, IStructEnumerator<T> |
38 | 27 | { |
39 | | - var enumerator = enumerable.GetEnumerator(); |
40 | | - return IntCount<T, TEnumerator>(ref enumerator); |
41 | | - } |
42 | | - |
43 | | - private static long LongCount<T, TEnumerator>(ref TEnumerator enumerator) |
44 | | - where TEnumerator : struct, IStructEnumerator<T> |
45 | | - { |
46 | | - long count = 0; |
47 | | - while (enumerator.MoveNext()) |
48 | | - { |
49 | | - count++; |
50 | | - } |
51 | | - enumerator.Dispose(); |
52 | | - return count; |
| 28 | + var visitor = new IntCountVisitor<T>(0); |
| 29 | + enumerable.Visit(ref visitor); |
| 30 | + return visitor.Count; |
53 | 31 | } |
54 | 32 |
|
55 | 33 | [MethodImpl(MethodImplOptions.AggressiveInlining)] |
56 | 34 | public static long LongCount<T, TEnumerator>(this IStructEnumerable<T, TEnumerator> enumerable) |
57 | 35 | where TEnumerator : struct, IStructEnumerator<T> |
58 | 36 | { |
59 | | - var structEnumerator = enumerable.GetEnumerator(); |
60 | | - return LongCount<T, TEnumerator>(ref structEnumerator); |
| 37 | + var visitor = new LongCountVisitor<T>(0); |
| 38 | + enumerable.Visit(ref visitor); |
| 39 | + return visitor.Count; |
61 | 40 | } |
62 | 41 |
|
63 | 42 | [MethodImpl(MethodImplOptions.AggressiveInlining)] |
64 | 43 | public static long LongCount<T, TEnumerable, TEnumerator>(this TEnumerable enumerable, Func<TEnumerable, IStructEnumerable<T, TEnumerator>> _) |
65 | 44 | where TEnumerable : struct, IStructEnumerable<T, TEnumerator> |
66 | 45 | where TEnumerator : struct, IStructEnumerator<T> |
67 | 46 | { |
68 | | - var enumerator = enumerable.GetEnumerator(); |
69 | | - return LongCount<T, TEnumerator>(ref enumerator); |
70 | | - } |
71 | | - |
72 | | - private static uint UintCount<T, TEnumerator>(ref TEnumerator enumerator) |
73 | | - where TEnumerator : struct, IStructEnumerator<T> |
74 | | - { |
75 | | - uint count = 0; |
76 | | - while (enumerator.MoveNext()) |
77 | | - { |
78 | | - count++; |
79 | | - } |
80 | | - enumerator.Dispose(); |
81 | | - return count; |
| 47 | + var visitor = new LongCountVisitor<T>(0); |
| 48 | + enumerable.Visit(ref visitor); |
| 49 | + return visitor.Count; |
82 | 50 | } |
83 | 51 |
|
84 | 52 | [MethodImpl(MethodImplOptions.AggressiveInlining)] |
85 | 53 | public static uint UIntCount<T, TEnumerator>(this IStructEnumerable<T, TEnumerator> enumerable) |
86 | 54 | where TEnumerator : struct, IStructEnumerator<T> |
87 | 55 | { |
88 | | - var structEnumerator = enumerable.GetEnumerator(); |
89 | | - return UintCount<T, TEnumerator>(ref structEnumerator); |
| 56 | + var visitor = new UIntCountVisitor<T>(0); |
| 57 | + enumerable.Visit(ref visitor); |
| 58 | + return visitor.Count; |
90 | 59 | } |
91 | 60 |
|
92 | 61 | [MethodImpl(MethodImplOptions.AggressiveInlining)] |
93 | 62 | public static uint UIntCount<T, TEnumerable, TEnumerator>(this TEnumerable enumerable, Func<TEnumerable, IStructEnumerable<T, TEnumerator>> _) |
94 | 63 | where TEnumerable : struct, IStructEnumerable<T, TEnumerator> |
95 | 64 | where TEnumerator : struct, IStructEnumerator<T> |
96 | 65 | { |
97 | | - var enumerator = enumerable.GetEnumerator(); |
98 | | - return UintCount<T, TEnumerator>(ref enumerator); |
| 66 | + var visitor = new UIntCountVisitor<T>(0); |
| 67 | + enumerable.Visit(ref visitor); |
| 68 | + return visitor.Count; |
99 | 69 | } |
100 | 70 |
|
101 | 71 | [MethodImpl(MethodImplOptions.AggressiveInlining)] |
@@ -142,6 +112,5 @@ public static long LongCount<T, TEnumerator>(this IStructCollection<T, TEnumerat |
142 | 112 | { |
143 | 113 | return collection.Count; |
144 | 114 | } |
145 | | - |
146 | 115 | } |
147 | 116 | } |
0 commit comments