Add versioning support for RecyclableLongList

This commit is contained in:
Marek Lemańczyk committed 2025-07-14 22:01:03 +02:00
1 parent ed23fd7f69
commit 1e64c71af3
3 files changed
+75

No files matched your search

@@ -126,7 +126,9 @@ namespace Recyclable.Collections
}
targetList._capacity = capacity;
#if WITH_VERSIONING
targetList._version++;
#endif
return;
}
@@ -186,9 +188,12 @@ namespace Recyclable.Collections
targetList._nextItemBlockIndex = targetBlockIdx;
targetList._nextItemIndex = targetItemIdx;
targetList._lastBlockWithData = targetBlockIdx - (targetItemIdx > 0 ? 0 : 1);
#if WITH_VERSIONING
targetList._version++;
#endif
}
[VersionedCollectionsGenerator.RewriteForVersioned]
public static void AddRange<T>(this RecyclableLongList<T> targetList, in Array items)
{
if (items.LongLength == 0)
@@ -240,7 +245,9 @@ namespace Recyclable.Collections
}
targetList._longCount = targetCapacity;
#if WITH_VERSIONING
targetList._version++;
#endif
}
public static void AddRange<T>(this RecyclableLongList<T> targetList, ICollection items)
@@ -305,7 +312,9 @@ namespace Recyclable.Collections
RecyclableArrayPool<T>.ReturnShared(itemsBuffer, RecyclableLongList<T>._needsClearing);
}
#if WITH_VERSIONING
targetList._version++;
#endif
}
public static void AddRange<T>(this RecyclableLongList<T> targetList, ICollection<T> items)
@@ -373,7 +382,9 @@ namespace Recyclable.Collections
RecyclableArrayPool<T>.ReturnShared(itemsBuffer, RecyclableLongList<T>._needsClearing);
}
#if WITH_VERSIONING
targetList._version++;
#endif
}
public static void AddRange<T>(this RecyclableLongList<T> targetList, IEnumerable source)
@@ -616,7 +627,9 @@ namespace Recyclable.Collections
targetList._nextItemBlockIndex = targetBlockIndex;
targetList._longCount = targetCapacity;
targetList._lastBlockWithData = targetBlockIndex - (targetList._nextItemIndex > 0 ? 0 : 1);
#if WITH_VERSIONING
targetList._version++;
#endif
}
public static void AddRange<T>(this RecyclableLongList<T> targetList, ReadOnlySpan<T> items)
@@ -671,7 +684,9 @@ namespace Recyclable.Collections
targetList._longCount = targetCapacity;
targetList._lastBlockWithData = targetBlockIndex;
#if WITH_VERSIONING
targetList._version++;
#endif
}
public static void AddRange<T>(this RecyclableLongList<T> targetList, RecyclableList<T> items)
@@ -728,7 +743,9 @@ namespace Recyclable.Collections
}
targetList._longCount = targetCapacity;
#if WITH_VERSIONING
targetList._version++;
#endif
}
public static void AddRange<T>(this RecyclableLongList<T> targetList, RecyclableLongList<T> items)
@@ -801,7 +818,9 @@ namespace Recyclable.Collections
}
targetList._longCount = targetCapacity;
#if WITH_VERSIONING
targetList._version++;
#endif
}
public static void AddRange<T>(this RecyclableLongList<T> targetList, Span<T> items)
@@ -856,7 +875,9 @@ namespace Recyclable.Collections
targetList._longCount = targetCapacity;
targetList._lastBlockWithData = targetBlockIndex;
#if WITH_VERSIONING
targetList._version++;
#endif
}
public static void AddRange<T>(this RecyclableLongList<T> targetList, in T[] items)
@@ -912,7 +933,9 @@ namespace Recyclable.Collections
targetList._longCount = targetCapacity;
targetList._lastBlockWithData = targetBlockIndex;
#if WITH_VERSIONING
targetList._version++;
#endif
}
[MethodImpl(MethodImplOptions.NoInlining | MethodImplOptions.AggressiveOptimization)]
@@ -954,7 +977,9 @@ namespace Recyclable.Collections
targetList._nextItemBlockIndex = blockIndex;
targetList._nextItemIndex = itemIndex;
targetList._lastBlockWithData = blockIndex - (itemIndex > 0 ? 0 : 1);
#if WITH_VERSIONING
targetList._version++;
#endif
}
[MethodImpl(MethodImplOptions.NoInlining | MethodImplOptions.AggressiveOptimization)]
@@ -999,7 +1024,9 @@ namespace Recyclable.Collections
targetList._nextItemBlockIndex = blockIndex;
targetList._nextItemIndex = itemIndex;
targetList._lastBlockWithData = blockIndex - (itemIndex > 0 ? 0 : 1);
#if WITH_VERSIONING
targetList._version++;
#endif
}
[MethodImpl(MethodImplOptions.NoInlining | MethodImplOptions.AggressiveOptimization)]
@@ -1038,7 +1065,9 @@ namespace Recyclable.Collections
targetList._nextItemBlockIndex = blockIndex;
targetList._nextItemIndex = itemIndex;
targetList._lastBlockWithData = blockIndex - (itemIndex > 0 ? 0 : 1);
#if WITH_VERSIONING
targetList._version++;
#endif
}
[MethodImpl(MethodImplOptions.NoInlining | MethodImplOptions.AggressiveOptimization)]
@@ -1082,7 +1111,9 @@ namespace Recyclable.Collections
targetList._nextItemBlockIndex = blockIndex;
targetList._nextItemIndex = itemIndex;
targetList._lastBlockWithData = blockIndex - (itemIndex > 0 ? 0 : 1);
#if WITH_VERSIONING
targetList._version++;
#endif
}
[MethodImpl(MethodImplOptions.NoInlining | MethodImplOptions.AggressiveOptimization)]
@@ -1121,7 +1152,9 @@ namespace Recyclable.Collections
targetList._nextItemBlockIndex = blockIndex;
targetList._nextItemIndex = itemIndex;
targetList._lastBlockWithData = blockIndex - (itemIndex > 0 ? 0 : 1);
#if WITH_VERSIONING
targetList._version++;
#endif
}
[MethodImpl(MethodImplOptions.NoInlining | MethodImplOptions.AggressiveOptimization)]
@@ -1165,7 +1198,9 @@ namespace Recyclable.Collections
targetList._nextItemBlockIndex = blockIndex;
targetList._nextItemIndex = itemIndex;
targetList._lastBlockWithData = blockIndex - (itemIndex > 0 ? 0 : 1);
#if WITH_VERSIONING
targetList._version++;
#endif
}
[MethodImpl(MethodImplOptions.NoInlining | MethodImplOptions.AggressiveOptimization)]
@@ -1208,7 +1243,9 @@ namespace Recyclable.Collections
targetList._nextItemBlockIndex = blockIndex;
targetList._nextItemIndex = itemIndex;
targetList._lastBlockWithData = blockIndex - (itemIndex > 0 ? 0 : 1);
#if WITH_VERSIONING
targetList._version++;
#endif
}
[MethodImpl(MethodImplOptions.NoInlining | MethodImplOptions.AggressiveOptimization)]
@@ -1248,7 +1285,9 @@ namespace Recyclable.Collections
targetList._nextItemBlockIndex = blockIndex;
targetList._nextItemIndex = itemIndex;
targetList._lastBlockWithData = blockIndex - (itemIndex > 0 ? 0 : 1);
#if WITH_VERSIONING
targetList._version++;
#endif
}
}
}
@@ -10,19 +10,25 @@ namespace Recyclable.Collections
public static void Sort<T>(this RecyclableLongList<T> list)
{
QuickSortExtensions<T>.QuickSort(list);
#if WITH_VERSIONING
list._version++;
#endif
}
public static void Sort<T>(this RecyclableLongList<T> list, Comparison<T> comparison)
{
QuickSortExtensions<T>.QuickSort(list, new ComparisonToComparerAdapter<T>(comparison), new SystemRandomNumberGenerator());
#if WITH_VERSIONING
list._version++;
#endif
}
public static void Sort<T>(this RecyclableLongList<T> list, IComparer<T>? comparer)
{
QuickSortExtensions<T>.QuickSort(list, comparer ?? Comparer<T>.Default, new SystemRandomNumberGenerator());
#if WITH_VERSIONING
list._version++;
#endif
}
public static void Sort<T>(this RecyclableLongList<T> list, long index, long count, IComparer<T>? comparer)
@@ -33,7 +39,9 @@ namespace Recyclable.Collections
}
QuickSortExtensions<T>.QuickSort(list, (int)index, (int)(index + count - 1), comparer ?? Comparer<T>.Default, new SystemRandomNumberGenerator());
#if WITH_VERSIONING
list._version++;
#endif
}
}
}
@@ -9,6 +9,7 @@ using Recyclable.Collections.Pools;
namespace Recyclable.Collections
{
[VersionedCollectionsGenerator.GenerateVersioned]
public partial class RecyclableLongList<T> : IList<T>, IReadOnlyList<T>, IDisposable
{
private static readonly bool _defaultIsNull = default(T) == null;
@@ -36,11 +37,15 @@ namespace Recyclable.Collections
private set
{
_capacity = value;
#if WITH_VERSIONING
_version++;
#endif
if (_capacity != value)
{
_capacity = Helpers.Resize(this, _blockSize, _blockSizePow2BitShift, checked((long)BitOperations.RoundUpToPowerOf2((ulong)value)));
#if WITH_VERSIONING
_version++;
#endif
}
}
}
@@ -51,6 +56,7 @@ namespace Recyclable.Collections
public long LongCount => _longCount;
public int NextItemBlockIndex => _nextItemBlockIndex;
public int NextItemIndex => _nextItemIndex;
[VersionedCollectionsGenerator.CloneForVersioned]
public ulong Version => _version;
public RecyclableLongList(int minBlockSize = RecyclableDefaults.BlockSize, long initialCapacity = RecyclableDefaults.InitialCapacity)
@@ -252,7 +258,9 @@ namespace Recyclable.Collections
set
{
new Span<T>(_memoryBlocks[(int)(index >> _blockSizePow2BitShift)])[(int)(index & _blockSizeMinus1)] = value;
#if WITH_VERSIONING
_version++;
#endif
}
}
@@ -262,7 +270,9 @@ namespace Recyclable.Collections
set
{
new Span<T>(_memoryBlocks[index >> _blockSizePow2BitShift])[index & _blockSizeMinus1] = value;
#if WITH_VERSIONING
_version++;
#endif
}
}
@@ -293,7 +303,9 @@ namespace Recyclable.Collections
}
_longCount++;
#if WITH_VERSIONING
_version++;
#endif
}
public void Clear()
@@ -327,7 +339,9 @@ namespace Recyclable.Collections
_nextItemIndex = 0;
_lastBlockWithData = RecyclableDefaults.ItemNotFoundIndex;
_longCount = 0;
#if WITH_VERSIONING
_version++;
#endif
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
@@ -433,7 +447,9 @@ namespace Recyclable.Collections
_lastBlockWithData++;
}
#if WITH_VERSIONING
_version++;
#endif
}
public void Insert(long index, T item)
@@ -472,7 +488,9 @@ namespace Recyclable.Collections
_lastBlockWithData++;
}
#if WITH_VERSIONING
_version++;
#endif
}
[MethodImpl(MethodImplOptions.AggressiveInlining | MethodImplOptions.AggressiveOptimization)]
@@ -543,7 +561,9 @@ namespace Recyclable.Collections
#nullable restore
}
#if WITH_VERSIONING
_version++;
#endif
return true;
}
@@ -585,7 +605,9 @@ namespace Recyclable.Collections
#nullable restore
}
#if WITH_VERSIONING
_version++;
#endif
}
[MethodImpl(MethodImplOptions.AggressiveInlining | MethodImplOptions.AggressiveOptimization)]
@@ -623,7 +645,9 @@ namespace Recyclable.Collections
#nullable restore
}
#if WITH_VERSIONING
_version++;
#endif
}
public void RemoveBlock(int index)
@@ -645,12 +669,16 @@ namespace Recyclable.Collections
}
_lastBlockWithData--;
#if WITH_VERSIONING
_version++;
#endif
}
public void Dispose()
{
#if WITH_VERSIONING
_version++;
#endif
if (_capacity > 0)
{
Clear();