From 3d37c1391f9845875818989695a15c3488801fb1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marek=20Lema=C5=84czyk?= Date: Mon, 14 Jul 2025 22:43:28 +0200 Subject: [PATCH] Annotate enumerators and extension helpers for versioned variants --- .../RecyclableList.Enumerator.cs | 8 +++++--- .../RecyclableList.Extensions.cs | 5 +++-- .../RecyclableList.VersionedEnumerator.cs | 11 +++++++---- Recyclable.Collections/RecyclableList.cs | 18 ++++++++++++------ .../RecyclableLongList.Enumerator.cs | 6 ++++-- .../RecyclableLongList.Extensions.cs | 5 +++-- .../RecyclableLongList.VersionedEnumerator.cs | 12 ++++++++---- Recyclable.Collections/RecyclableLongList.cs | 12 +++++++++--- 8 files changed, 51 insertions(+), 26 deletions(-) diff --git a/Recyclable.Collections/RecyclableList.Enumerator.cs b/Recyclable.Collections/RecyclableList.Enumerator.cs index acaae28..a1fe384 100644 --- a/Recyclable.Collections/RecyclableList.Enumerator.cs +++ b/Recyclable.Collections/RecyclableList.Enumerator.cs @@ -6,9 +6,11 @@ namespace Recyclable.Collections { public partial class RecyclableList { - [StructLayout(LayoutKind.Sequential, Pack = 1)] - public struct Enumerator : IEnumerator - { + [StructLayout(LayoutKind.Sequential, Pack = 1)] + [VersionedCollectionsGenerator.CloneForVersioned] + // TODO: confirm if enumerator should implement a versioned interface for generated types + public struct Enumerator : IEnumerator + { private static readonly bool _isReferenceType = !typeof(T).IsValueType; private int _currentItemIndex; diff --git a/Recyclable.Collections/RecyclableList.Extensions.cs b/Recyclable.Collections/RecyclableList.Extensions.cs index d10ac29..bf55211 100644 --- a/Recyclable.Collections/RecyclableList.Extensions.cs +++ b/Recyclable.Collections/RecyclableList.Extensions.cs @@ -3,8 +3,9 @@ using System.Runtime.CompilerServices; namespace Recyclable.Collections { - public static class RecyclableListExtensions - { + [VersionedCollectionsGenerator.GenerateVersioned] + public static class RecyclableListExtensions + { [MethodImpl(MethodImplOptions.AggressiveInlining)] public static RecyclableList ToRecyclableList(this Array values) => new(values); diff --git a/Recyclable.Collections/RecyclableList.VersionedEnumerator.cs b/Recyclable.Collections/RecyclableList.VersionedEnumerator.cs index 5e729f7..2dfb981 100644 --- a/Recyclable.Collections/RecyclableList.VersionedEnumerator.cs +++ b/Recyclable.Collections/RecyclableList.VersionedEnumerator.cs @@ -6,11 +6,14 @@ namespace Recyclable.Collections { public partial class RecyclableList : IRecyclableVersionedList { - VersionedEnumerator IRecyclableVersionedList.GetEnumerator() => new(this); + [VersionedCollectionsGenerator.CloneForVersioned] + VersionedEnumerator IRecyclableVersionedList.GetEnumerator() => new(this); - [StructLayout(LayoutKind.Sequential, Pack = 1)] - public struct VersionedEnumerator : IEnumerator - { + [StructLayout(LayoutKind.Sequential, Pack = 1)] + [VersionedCollectionsGenerator.CloneForVersioned] + // TODO: confirm if enumerator should implement a versioned interface for generated types + public struct VersionedEnumerator : IEnumerator + { private int _currentItemIndex; private readonly ulong _enumeratorVersion; private readonly RecyclableList _list; diff --git a/Recyclable.Collections/RecyclableList.cs b/Recyclable.Collections/RecyclableList.cs index 5a46ab2..e2fc7cd 100644 --- a/Recyclable.Collections/RecyclableList.cs +++ b/Recyclable.Collections/RecyclableList.cs @@ -363,14 +363,20 @@ namespace Recyclable.Collections #endif } - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public Enumerator GetEnumerator() => new(this); + [MethodImpl(MethodImplOptions.AggressiveInlining)] + [VersionedCollectionsGenerator.CloneForVersioned] + // TODO: review if returned enumerator type should change for versioned list + public Enumerator GetEnumerator() => new(this); - [MethodImpl(MethodImplOptions.AggressiveInlining)] - IEnumerator IEnumerable.GetEnumerator() => new Enumerator(this); + [MethodImpl(MethodImplOptions.AggressiveInlining)] + [VersionedCollectionsGenerator.CloneForVersioned] + // TODO: review if returned enumerator type should change for versioned list + IEnumerator IEnumerable.GetEnumerator() => new Enumerator(this); - [MethodImpl(MethodImplOptions.AggressiveInlining)] - IEnumerator IEnumerable.GetEnumerator() => new Enumerator(this); + [MethodImpl(MethodImplOptions.AggressiveInlining)] + [VersionedCollectionsGenerator.CloneForVersioned] + // TODO: review if returned enumerator type should change for versioned list + IEnumerator IEnumerable.GetEnumerator() => new Enumerator(this); public void Dispose() { diff --git a/Recyclable.Collections/RecyclableLongList.Enumerator.cs b/Recyclable.Collections/RecyclableLongList.Enumerator.cs index 353f2d3..8a91b5f 100644 --- a/Recyclable.Collections/RecyclableLongList.Enumerator.cs +++ b/Recyclable.Collections/RecyclableLongList.Enumerator.cs @@ -5,8 +5,10 @@ namespace Recyclable.Collections { public partial class RecyclableLongList { - public struct Enumerator : IEnumerator - { + [VersionedCollectionsGenerator.CloneForVersioned] + // TODO: confirm if enumerator should implement a versioned interface for generated types + public struct Enumerator : IEnumerator + { #nullable disable private static readonly T _default = default; #nullable restore diff --git a/Recyclable.Collections/RecyclableLongList.Extensions.cs b/Recyclable.Collections/RecyclableLongList.Extensions.cs index 5f24356..fc89683 100644 --- a/Recyclable.Collections/RecyclableLongList.Extensions.cs +++ b/Recyclable.Collections/RecyclableLongList.Extensions.cs @@ -3,8 +3,9 @@ using System.Runtime.CompilerServices; namespace Recyclable.Collections { - public static class RecyclableLongListExtensions - { + [VersionedCollectionsGenerator.GenerateVersioned] + public static class RecyclableLongListExtensions + { [MethodImpl(MethodImplOptions.AggressiveInlining)] public static RecyclableLongList ToRecyclableLongList(this Array values, int minBlockSize = RecyclableDefaults.BlockSize) => new(values, minBlockSize); diff --git a/Recyclable.Collections/RecyclableLongList.VersionedEnumerator.cs b/Recyclable.Collections/RecyclableLongList.VersionedEnumerator.cs index ad86d10..6a283fe 100644 --- a/Recyclable.Collections/RecyclableLongList.VersionedEnumerator.cs +++ b/Recyclable.Collections/RecyclableLongList.VersionedEnumerator.cs @@ -5,11 +5,15 @@ namespace Recyclable.Collections { public partial class RecyclableLongList : IRecyclableVersionedLongList { - public VersionedEnumerator GetVersionedEnumerator() => new(this); - VersionedEnumerator IRecyclableVersionedLongList.GetEnumerator() => new(this); + [VersionedCollectionsGenerator.CloneForVersioned] + public VersionedEnumerator GetVersionedEnumerator() => new(this); + [VersionedCollectionsGenerator.CloneForVersioned] + VersionedEnumerator IRecyclableVersionedLongList.GetEnumerator() => new(this); - public struct VersionedEnumerator : IEnumerator - { + [VersionedCollectionsGenerator.CloneForVersioned] + // TODO: confirm if enumerator should implement a versioned interface for generated types + public struct VersionedEnumerator : IEnumerator + { #nullable disable private static readonly T _default = default; #nullable restore diff --git a/Recyclable.Collections/RecyclableLongList.cs b/Recyclable.Collections/RecyclableLongList.cs index c9b574b..fea103c 100644 --- a/Recyclable.Collections/RecyclableLongList.cs +++ b/Recyclable.Collections/RecyclableLongList.cs @@ -372,9 +372,15 @@ namespace Recyclable.Collections public void CopyTo(T[] array, int arrayIndex) => Helpers.CopyTo(_memoryBlocks, 0, _blockSize, _longCount, array, arrayIndex); - public Enumerator GetEnumerator() => new(this); - IEnumerator IEnumerable.GetEnumerator() => new Enumerator(this); - IEnumerator IEnumerable.GetEnumerator() => new Enumerator(this); + [VersionedCollectionsGenerator.CloneForVersioned] + // TODO: review if returned enumerator type should change for versioned list + public Enumerator GetEnumerator() => new(this); + [VersionedCollectionsGenerator.CloneForVersioned] + // TODO: review if returned enumerator type should change for versioned list + IEnumerator IEnumerable.GetEnumerator() => new Enumerator(this); + [VersionedCollectionsGenerator.CloneForVersioned] + // TODO: review if returned enumerator type should change for versioned list + IEnumerator IEnumerable.GetEnumerator() => new Enumerator(this); [MethodImpl(MethodImplOptions.AggressiveInlining | MethodImplOptions.AggressiveOptimization)] public int IndexOf(T item)