Skip to content

Commit e7db757

Browse files
committed
Use CastingEnumeratorAdapter in CastingListAdapter; optimize as readonly struct to reduce allocations
1 parent 24dd596 commit e7db757

4 files changed

Lines changed: 16 additions & 10 deletions

File tree

src/Lucene.Net/Support/CastingCollectionAdapter.cs

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -56,10 +56,12 @@ public void CopyTo(U[] array, int arrayIndex)
5656
}
5757
}
5858

59-
public IEnumerator<U> GetEnumerator() => new CastingEnumeratorAdapter<T, U>(collection.GetEnumerator());
59+
public CastingEnumeratorAdapter<T, U> GetEnumerator() => new CastingEnumeratorAdapter<T, U>(collection.GetEnumerator());
6060

61-
public bool Remove(U item) => collection.Remove((T)item);
61+
IEnumerator<U> IEnumerable<U>.GetEnumerator() => GetEnumerator();
6262

6363
IEnumerator IEnumerable.GetEnumerator() => GetEnumerator();
64+
65+
public bool Remove(U item) => collection.Remove((T)item);
6466
}
6567
}

src/Lucene.Net/Support/CastingEnumeratorAdapter.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,11 +21,11 @@ namespace Lucene.Net.Support
2121
*/
2222

2323
/// <summary>
24-
/// LUCENENET specific class used to adapt an <see cref="IEnumerator{T}"/> to one with a different type parameter.
24+
/// LUCENENET specific struct used to adapt an <see cref="IEnumerator{T}"/> to one with a different type parameter.
2525
/// </summary>
2626
/// <typeparam name="T">The type of elements in the original enumerator.</typeparam>
2727
/// <typeparam name="U">The type of elements in the adapted enumerator.</typeparam>
28-
internal class CastingEnumeratorAdapter<T, U> : IEnumerator<U>
28+
internal readonly struct CastingEnumeratorAdapter<T, U> : IEnumerator<U>
2929
where T : U
3030
{
3131
private readonly IEnumerator<T> enumerator;

src/Lucene.Net/Support/CastingListAdapter.cs

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
1-
using System.Collections.Generic;
2-
using System.Linq;
1+
using System.Collections;
2+
using System.Collections.Generic;
33

44
namespace Lucene.Net.Support
55
{
@@ -60,7 +60,11 @@ public void CopyTo(U[] array, int arrayIndex)
6060
}
6161
}
6262

63-
public IEnumerator<U> GetEnumerator() => list.Cast<U>().GetEnumerator();
63+
public CastingEnumeratorAdapter<T, U> GetEnumerator() => new CastingEnumeratorAdapter<T, U>(list.GetEnumerator());
64+
65+
IEnumerator<U> IEnumerable<U>.GetEnumerator() => GetEnumerator();
66+
67+
IEnumerator IEnumerable.GetEnumerator() => GetEnumerator();
6468

6569
public int IndexOf(U item) => list.IndexOf((T)item);
6670

@@ -69,7 +73,5 @@ public void CopyTo(U[] array, int arrayIndex)
6973
public bool Remove(U item) => list.Remove((T)item);
7074

7175
public void RemoveAt(int index) => list.RemoveAt(index);
72-
73-
System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator() => GetEnumerator();
7476
}
7577
}

src/Lucene.Net/Support/CastingSetAdapter.cs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,9 @@ public CastingSetAdapter(ISet<T> set)
3535
this.set = set;
3636
}
3737

38-
public IEnumerator<U> GetEnumerator() => new CastingEnumeratorAdapter<T, U>(set.GetEnumerator());
38+
public CastingEnumeratorAdapter<T, U> GetEnumerator() => new CastingEnumeratorAdapter<T, U>(set.GetEnumerator());
39+
40+
IEnumerator<U> IEnumerable<U>.GetEnumerator() => GetEnumerator();
3941

4042
IEnumerator IEnumerable.GetEnumerator() => GetEnumerator();
4143

0 commit comments

Comments
 (0)