Merge pull request #20 from mlemanczyk/d2kqjh-codex/dodaj-oznaczenia-wersjonowania-w-recyclablelonglist

Implement versioned enumerator retrieval
This commit is contained in:
Marek Lemańczyk authored and GitHub committed 2025-07-14 23:13:48 +02:00
commit 037271acc8
9 files changed
+46 -6

No files matched your search

@@ -7,6 +7,7 @@ namespace Recyclable.Collections
public partial class RecyclableList<T> public partial class RecyclableList<T>
{ {
[StructLayout(LayoutKind.Sequential, Pack = 1)] [StructLayout(LayoutKind.Sequential, Pack = 1)]
[VersionedCollectionsGenerator.CloneForVersioned]
public struct Enumerator : IEnumerator<T> public struct Enumerator : IEnumerator<T>
{ {
private static readonly bool _isReferenceType = !typeof(T).IsValueType; private static readonly bool _isReferenceType = !typeof(T).IsValueType;
@@ -3,6 +3,7 @@ using System.Runtime.CompilerServices;
namespace Recyclable.Collections namespace Recyclable.Collections
{ {
[VersionedCollectionsGenerator.GenerateVersioned]
public static class RecyclableListExtensions public static class RecyclableListExtensions
{ {
[MethodImpl(MethodImplOptions.AggressiveInlining)] [MethodImpl(MethodImplOptions.AggressiveInlining)]
@@ -6,9 +6,11 @@ namespace Recyclable.Collections
{ {
public partial class RecyclableList<T> : IRecyclableVersionedList<T> public partial class RecyclableList<T> : IRecyclableVersionedList<T>
{ {
[VersionedCollectionsGenerator.CloneForVersioned]
VersionedEnumerator IRecyclableVersionedList<T>.GetEnumerator() => new(this); VersionedEnumerator IRecyclableVersionedList<T>.GetEnumerator() => new(this);
[StructLayout(LayoutKind.Sequential, Pack = 1)] [StructLayout(LayoutKind.Sequential, Pack = 1)]
[VersionedCollectionsGenerator.CloneForVersioned]
public struct VersionedEnumerator : IEnumerator<T> public struct VersionedEnumerator : IEnumerator<T>
{ {
private int _currentItemIndex; private int _currentItemIndex;
+15
View File
@@ -364,13 +364,28 @@ namespace Recyclable.Collections
} }
[MethodImpl(MethodImplOptions.AggressiveInlining)] [MethodImpl(MethodImplOptions.AggressiveInlining)]
[VersionedCollectionsGenerator.CloneForVersioned]
#if WITH_VERSIONING
public VersionedEnumerator GetEnumerator() => new(this);
#else
public Enumerator GetEnumerator() => new(this); public Enumerator GetEnumerator() => new(this);
#endif
[MethodImpl(MethodImplOptions.AggressiveInlining)] [MethodImpl(MethodImplOptions.AggressiveInlining)]
[VersionedCollectionsGenerator.CloneForVersioned]
#if WITH_VERSIONING
IEnumerator IEnumerable.GetEnumerator() => new VersionedEnumerator(this);
#else
IEnumerator IEnumerable.GetEnumerator() => new Enumerator(this); IEnumerator IEnumerable.GetEnumerator() => new Enumerator(this);
#endif
[MethodImpl(MethodImplOptions.AggressiveInlining)] [MethodImpl(MethodImplOptions.AggressiveInlining)]
[VersionedCollectionsGenerator.CloneForVersioned]
#if WITH_VERSIONING
IEnumerator<T> IEnumerable<T>.GetEnumerator() => new VersionedEnumerator(this);
#else
IEnumerator<T> IEnumerable<T>.GetEnumerator() => new Enumerator(this); IEnumerator<T> IEnumerable<T>.GetEnumerator() => new Enumerator(this);
#endif
public void Dispose() public void Dispose()
{ {
@@ -5,6 +5,7 @@ namespace Recyclable.Collections
{ {
public partial class RecyclableLongList<T> public partial class RecyclableLongList<T>
{ {
[VersionedCollectionsGenerator.CloneForVersioned]
public struct Enumerator : IEnumerator<T> public struct Enumerator : IEnumerator<T>
{ {
#nullable disable #nullable disable
@@ -3,6 +3,7 @@ using System.Runtime.CompilerServices;
namespace Recyclable.Collections namespace Recyclable.Collections
{ {
[VersionedCollectionsGenerator.GenerateVersioned]
public static class RecyclableLongListExtensions public static class RecyclableLongListExtensions
{ {
[MethodImpl(MethodImplOptions.AggressiveInlining)] [MethodImpl(MethodImplOptions.AggressiveInlining)]
@@ -1,4 +1,5 @@
using Recyclable.Collections.Pools; using Recyclable.Collections.Pools;
using System.Numerics;
using System.Runtime.CompilerServices; using System.Runtime.CompilerServices;
namespace Recyclable.Collections namespace Recyclable.Collections
@@ -78,9 +79,9 @@ namespace Recyclable.Collections
ReadOnlySpan<T> sourceBlockMemory; ReadOnlySpan<T> sourceBlockMemory;
Span<T> destinationArrayMemory; Span<T> destinationArrayMemory;
// TODO: Replace with bit-shifting int blockSizePow2Shift = BitOperations.TrailingZeroCount((uint)blockSize);
int startingBlockIndex = (int)(startingIndex / blockSize); int startingBlockIndex = (int)(startingIndex >> blockSizePow2Shift);
int lastBlockIndex = (int)((itemsCount / blockSize) + (itemsCount % blockSize != 0 ? 1 : 0)) - 1; int lastBlockIndex = (int)((itemsCount >> blockSizePow2Shift) + ((itemsCount & (blockSize - 1)) != 0 ? 1 : 0)) - 1;
ReadOnlySpan<T[]> sourceMemoryBlocksSpan = new(sourceMemoryBlocks, startingBlockIndex, lastBlockIndex + 1); ReadOnlySpan<T[]> sourceMemoryBlocksSpan = new(sourceMemoryBlocks, startingBlockIndex, lastBlockIndex + 1);
destinationArrayMemory = new Span<T>(destinationArray, destinationArrayIndex, (int)Math.Min(destinationArray.Length - destinationArrayIndex, itemsCount)); destinationArrayMemory = new Span<T>(destinationArray, destinationArrayIndex, (int)Math.Min(destinationArray.Length - destinationArrayIndex, itemsCount));
int memoryBlockIndex; int memoryBlockIndex;
@@ -105,9 +106,9 @@ namespace Recyclable.Collections
return; return;
} }
// TODO: Replace with bit-shifting int blockSizePow2Shift = BitOperations.TrailingZeroCount((uint)blockSize);
int startingBlockIndex = (int)(startingIndex / blockSize); int startingBlockIndex = (int)(startingIndex >> blockSizePow2Shift);
int lastBlockIndex = (int)((itemsCount / blockSize) + (itemsCount % blockSize != 0 ? 1 : 0)) - 1; int lastBlockIndex = (int)((itemsCount >> blockSizePow2Shift) + ((itemsCount & (blockSize - 1)) != 0 ? 1 : 0)) - 1;
var destinationIndex = destinationArrayIndex; var destinationIndex = destinationArrayIndex;
ReadOnlySpan<T[]> sourceMemoryBlocksSpan = new(sourceMemoryBlocks, startingBlockIndex, lastBlockIndex + 1); ReadOnlySpan<T[]> sourceMemoryBlocksSpan = new(sourceMemoryBlocks, startingBlockIndex, lastBlockIndex + 1);
@@ -5,9 +5,12 @@ namespace Recyclable.Collections
{ {
public partial class RecyclableLongList<T> : IRecyclableVersionedLongList<T> public partial class RecyclableLongList<T> : IRecyclableVersionedLongList<T>
{ {
[VersionedCollectionsGenerator.CloneForVersioned]
public VersionedEnumerator GetVersionedEnumerator() => new(this); public VersionedEnumerator GetVersionedEnumerator() => new(this);
[VersionedCollectionsGenerator.CloneForVersioned]
VersionedEnumerator IRecyclableVersionedLongList<T>.GetEnumerator() => new(this); VersionedEnumerator IRecyclableVersionedLongList<T>.GetEnumerator() => new(this);
[VersionedCollectionsGenerator.CloneForVersioned]
public struct VersionedEnumerator : IEnumerator<T> public struct VersionedEnumerator : IEnumerator<T>
{ {
#nullable disable #nullable disable
@@ -372,9 +372,24 @@ namespace Recyclable.Collections
public void CopyTo(T[] array, int arrayIndex) => Helpers.CopyTo(_memoryBlocks, 0, _blockSize, _longCount, array, arrayIndex); public void CopyTo(T[] array, int arrayIndex) => Helpers.CopyTo(_memoryBlocks, 0, _blockSize, _longCount, array, arrayIndex);
[VersionedCollectionsGenerator.CloneForVersioned]
#if WITH_VERSIONING
public VersionedEnumerator GetEnumerator() => new(this);
#else
public Enumerator GetEnumerator() => new(this); public Enumerator GetEnumerator() => new(this);
#endif
[VersionedCollectionsGenerator.CloneForVersioned]
#if WITH_VERSIONING
IEnumerator IEnumerable.GetEnumerator() => new VersionedEnumerator(this);
#else
IEnumerator IEnumerable.GetEnumerator() => new Enumerator(this); IEnumerator IEnumerable.GetEnumerator() => new Enumerator(this);
#endif
[VersionedCollectionsGenerator.CloneForVersioned]
#if WITH_VERSIONING
IEnumerator<T> IEnumerable<T>.GetEnumerator() => new VersionedEnumerator(this);
#else
IEnumerator<T> IEnumerable<T>.GetEnumerator() => new Enumerator(this); IEnumerator<T> IEnumerable<T>.GetEnumerator() => new Enumerator(this);
#endif
[MethodImpl(MethodImplOptions.AggressiveInlining | MethodImplOptions.AggressiveOptimization)] [MethodImpl(MethodImplOptions.AggressiveInlining | MethodImplOptions.AggressiveOptimization)]
public int IndexOf(T item) public int IndexOf(T item)