Skip to content

Commit 0bba82c

Browse files
authored
Consolidate LRU factory logic (#479)
1 parent de15105 commit 0bba82c

File tree

3 files changed

+40
-25
lines changed

3 files changed

+40
-25
lines changed

BitFaster.Caching/Lru/Builder/AsyncConcurrentLruBuilder.cs

Lines changed: 1 addition & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -16,13 +16,7 @@ internal AsyncConcurrentLruBuilder(LruInfo<K> info)
1616
///<inheritdoc/>
1717
public override IAsyncCache<K, V> Build()
1818
{
19-
return info switch
20-
{
21-
LruInfo<K> i when i.WithMetrics && !i.TimeToExpireAfterWrite.HasValue => new ConcurrentLru<K, V>(info.ConcurrencyLevel, info.Capacity, info.KeyComparer),
22-
LruInfo<K> i when i.WithMetrics && i.TimeToExpireAfterWrite.HasValue => new ConcurrentTLru<K, V>(info.ConcurrencyLevel, info.Capacity, info.KeyComparer, info.TimeToExpireAfterWrite.Value),
23-
LruInfo<K> i when i.TimeToExpireAfterWrite.HasValue => new FastConcurrentTLru<K, V>(info.ConcurrencyLevel, info.Capacity, info.KeyComparer, info.TimeToExpireAfterWrite.Value),
24-
_ => new FastConcurrentLru<K, V>(info.ConcurrencyLevel, info.Capacity, info.KeyComparer),
25-
};
19+
return LruFactory<K, V>.CreateConcurrent(this.info) as IAsyncCache<K, V>;
2620
}
2721
}
2822
}

BitFaster.Caching/Lru/ConcurrentLruBuilder.cs

Lines changed: 1 addition & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -40,24 +40,7 @@ internal ConcurrentLruBuilder(LruInfo<K> info)
4040
///<inheritdoc/>
4141
public override ICache<K, V> Build()
4242
{
43-
if (info.TimeToExpireAfterWrite.HasValue && info.TimeToExpireAfterAccess.HasValue)
44-
Throw.InvalidOp("Specifying both ExpireAfterWrite and ExpireAfterAccess is not supported.");
45-
46-
return info switch
47-
{
48-
LruInfo<K> i when i.WithMetrics && !i.TimeToExpireAfterWrite.HasValue && !i.TimeToExpireAfterAccess.HasValue => new ConcurrentLru<K, V>(info.ConcurrencyLevel, info.Capacity, info.KeyComparer),
49-
LruInfo<K> i when i.WithMetrics && i.TimeToExpireAfterWrite.HasValue && !i.TimeToExpireAfterAccess.HasValue => new ConcurrentTLru<K, V>(info.ConcurrencyLevel, info.Capacity, info.KeyComparer, info.TimeToExpireAfterWrite.Value),
50-
LruInfo<K> i when i.TimeToExpireAfterWrite.HasValue && !i.TimeToExpireAfterAccess.HasValue => new FastConcurrentTLru<K, V>(info.ConcurrencyLevel, info.Capacity, info.KeyComparer, info.TimeToExpireAfterWrite.Value),
51-
LruInfo<K> i when i.WithMetrics && !i.TimeToExpireAfterWrite.HasValue && i.TimeToExpireAfterAccess.HasValue => CreateExpireAfterAccess<TelemetryPolicy<K, V>>(info),
52-
LruInfo<K> i when !i.TimeToExpireAfterWrite.HasValue && i.TimeToExpireAfterAccess.HasValue => CreateExpireAfterAccess<NoTelemetryPolicy<K, V>>(info),
53-
_ => new FastConcurrentLru<K, V>(info.ConcurrencyLevel, info.Capacity, info.KeyComparer),
54-
};
55-
}
56-
57-
private static ICache<K, V> CreateExpireAfterAccess<TP>(LruInfo<K> info) where TP : struct, ITelemetryPolicy<K, V>
58-
{
59-
return new ConcurrentLruCore<K, V, LongTickCountLruItem<K, V>, AfterAccessLongTicksPolicy<K, V>, TP>(
60-
info.ConcurrencyLevel, info.Capacity, info.KeyComparer, new AfterAccessLongTicksPolicy<K, V>(info.TimeToExpireAfterAccess.Value), default);
43+
return LruFactory<K, V>.CreateConcurrent(this.info);
6144
}
6245
}
6346
}
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
using System.Linq.Expressions;
2+
using BitFaster.Caching.Lru.Builder;
3+
4+
namespace BitFaster.Caching.Lru
5+
{
6+
/// <summary>
7+
/// Factory class for creating ConcurrentLru variants.
8+
/// </summary>
9+
internal static class LruFactory<K, V>
10+
{
11+
/// <summary>
12+
/// Creates a ConcurrentLru instance based on the provided LruInfo.
13+
/// </summary>
14+
/// <param name="info">The LruInfo</param>
15+
/// <returns>A ConcurrentLru</returns>
16+
internal static ICache<K, V> CreateConcurrent(LruInfo<K> info)
17+
{
18+
if (info.TimeToExpireAfterWrite.HasValue && info.TimeToExpireAfterAccess.HasValue)
19+
Throw.InvalidOp("Specifying both ExpireAfterWrite and ExpireAfterAccess is not supported.");
20+
21+
return (info.WithMetrics, info.TimeToExpireAfterWrite.HasValue, info.TimeToExpireAfterAccess.HasValue) switch
22+
{
23+
(true, false, false) => new ConcurrentLru<K, V>(info.ConcurrencyLevel, info.Capacity, info.KeyComparer),
24+
(true, true, false) => new ConcurrentTLru<K, V>(info.ConcurrencyLevel, info.Capacity, info.KeyComparer, info.TimeToExpireAfterWrite.Value),
25+
(false, true, false) => new FastConcurrentTLru<K, V>(info.ConcurrencyLevel, info.Capacity, info.KeyComparer, info.TimeToExpireAfterWrite.Value),
26+
(true, false, true) => CreateExpireAfterAccess<TelemetryPolicy<K, V>>(info),
27+
(false, false, true) => CreateExpireAfterAccess<NoTelemetryPolicy<K, V>>(info),
28+
_ => new FastConcurrentLru<K, V>(info.ConcurrencyLevel, info.Capacity, info.KeyComparer),
29+
};
30+
}
31+
32+
private static ICache<K, V> CreateExpireAfterAccess<TP>(LruInfo<K> info) where TP : struct, ITelemetryPolicy<K, V>
33+
{
34+
return new ConcurrentLruCore<K, V, LongTickCountLruItem<K, V>, AfterAccessLongTicksPolicy<K, V>, TP>(
35+
info.ConcurrencyLevel, info.Capacity, info.KeyComparer, new AfterAccessLongTicksPolicy<K, V>(info.TimeToExpireAfterAccess.Value), default);
36+
}
37+
}
38+
}

0 commit comments

Comments
 (0)