diff --git a/BitFaster.Caching.UnitTests/Lfu/ConcurrentLfuTests.cs b/BitFaster.Caching.UnitTests/Lfu/ConcurrentLfuTests.cs index e60b72a3..e3ca7a46 100644 --- a/BitFaster.Caching.UnitTests/Lfu/ConcurrentLfuTests.cs +++ b/BitFaster.Caching.UnitTests/Lfu/ConcurrentLfuTests.cs @@ -1,10 +1,8 @@ using System; using System.Collections; using System.Collections.Generic; -using System.Diagnostics; using System.Linq; using System.Threading.Tasks; -using BitFaster.Caching.Buffers; using BitFaster.Caching.Lfu; using BitFaster.Caching.Scheduler; using BitFaster.Caching.UnitTests.Lru; @@ -572,7 +570,11 @@ public void WhenItemsAddedGenericEnumerateContainsKvps() cache.GetOrAdd(1, k => k + 1); cache.GetOrAdd(2, k => k + 1); - cache.Should().BeEquivalentTo(new[] { new KeyValuePair(1, 2), new KeyValuePair(2, 3) }); + var enumerator = cache.GetEnumerator(); + enumerator.MoveNext().Should().BeTrue(); + enumerator.Current.Should().Be(new KeyValuePair(1, 2)); + enumerator.MoveNext().Should().BeTrue(); + enumerator.Current.Should().Be(new KeyValuePair(2, 3)); } [Fact] diff --git a/BitFaster.Caching/Lfu/ConcurrentLfu.cs b/BitFaster.Caching/Lfu/ConcurrentLfu.cs index 654463a0..b9a7f052 100644 --- a/BitFaster.Caching/Lfu/ConcurrentLfu.cs +++ b/BitFaster.Caching/Lfu/ConcurrentLfu.cs @@ -85,13 +85,13 @@ private void DrainBuffers() public int Count => core.Count; /// - public Optional Metrics => core.Metrics; + public Optional Metrics => new(this.core.metrics); /// - public Optional> Events => core.Events; + public Optional> Events => Optional>.None(); /// - public CachePolicy Policy => core.Policy; + public CachePolicy Policy => new(new Optional(this), Optional.None()); /// public ICollection Keys => core.Keys; @@ -127,12 +127,6 @@ public void Clear() core.Clear(); } - /// - public IEnumerator> GetEnumerator() - { - return core.GetEnumerator(); - } - /// public V GetOrAdd(K key, Func valueFactory) { @@ -202,10 +196,17 @@ public bool TryUpdate(K key, V value) return core.TryUpdate(key, value); } + /// + public IEnumerator> GetEnumerator() + { + return core.GetEnumerator(); + } + /// IEnumerator IEnumerable.GetEnumerator() { - return ((ConcurrentLfuCore, AccessOrderPolicy>)core).GetEnumerator(); + return core.GetEnumerator(); + //return ((ConcurrentLfuCore, AccessOrderPolicy>)core).GetEnumerator(); } #if DEBUG @@ -276,7 +277,7 @@ public KeyValuePair[] Items /// Based on the Caffeine library by ben.manes@gmail.com (Ben Manes). /// https://github.com/ben-manes/caffeine - internal struct ConcurrentLfuCore : ICache, IAsyncCache, IBoundedPolicy + internal struct ConcurrentLfuCore : IBoundedPolicy where N : LfuNode where P : struct, INodePolicy { @@ -289,7 +290,7 @@ internal struct ConcurrentLfuCore : ICache, IAsyncCache, internal readonly StripedMpscBuffer readBuffer; internal readonly MpscBoundedBuffer writeBuffer; - private readonly CacheMetrics metrics = new(); + internal readonly CacheMetrics metrics = new(); private readonly CmSketch cmSketch; @@ -342,12 +343,6 @@ public ConcurrentLfuCore(int concurrencyLevel, int capacity, IScheduler schedule public int Capacity => this.capacity.Capacity; - public Optional Metrics => new(this.metrics); - - public Optional> Events => Optional>.None(); - - public CachePolicy Policy => new(new Optional(this), Optional.None()); - public ICollection Keys => this.dictionary.Keys; public IScheduler Scheduler => scheduler; @@ -662,11 +657,6 @@ private void ScheduleAfterWrite() } } - IEnumerator IEnumerable.GetEnumerator() - { - return ((ConcurrentLfuCore)this).GetEnumerator(); - } - private void TryScheduleDrain() { if (this.drainStatus.VolatileRead() >= DrainStatus.ProcessingToIdle)