SupaLidlGame/Utils/CacheStore.cs

100 lines
2.2 KiB
C#
Raw Permalink Normal View History

2023-08-03 16:17:34 -07:00
using Godot;
using System.Collections.Generic;
2023-08-17 01:05:21 -07:00
public class CacheStore<TKey, TVal> : IEnumerable<KeyValuePair<TKey, CacheItem<TVal>>>
2023-08-03 16:17:34 -07:00
{
2023-08-07 02:38:51 -07:00
// default TTL is 1 min
public ulong TimeToLive { get; } = 60000;
2023-08-03 16:17:34 -07:00
2023-08-17 01:05:21 -07:00
private readonly Dictionary<TKey, CacheItem<TVal>> _store = new();
2023-08-03 16:17:34 -07:00
public CacheItem<TVal> this[TKey key]
{
get
{
if (_store.ContainsKey(key))
{
return _store[key];
}
return null;
}
set
{
if (_store.ContainsKey(key))
{
_store[key] = value;
}
else
{
_store.Add(key, value);
}
}
}
2023-08-17 01:05:21 -07:00
public IEnumerator<KeyValuePair<TKey, CacheItem<TVal>>> GetEnumerator()
{
return _store.GetEnumerator();
}
System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()
{
return this.GetEnumerator();
}
2023-08-03 16:17:34 -07:00
public TVal Retrieve(TKey key)
{
if (IsItemValid(key))
{
return _store[key].Value;
}
return default;
}
public void Update(TKey key, TVal value = default)
{
CacheItem<TVal> cacheItem;
if (_store.ContainsKey(key))
{
cacheItem = _store[key];
}
else
{
cacheItem = new CacheItem<TVal>();
_store[key] = cacheItem;
}
cacheItem.TimeToLiveTimestamp = Time.GetTicksMsec();
cacheItem.Value = value;
}
public bool IsItemStale(TKey key)
{
if (_store.ContainsKey(key))
{
return _store[key].HasExpired(TimeToLive);
}
return false;
}
public bool IsItemValid(TKey key)
{
return key is not null && _store.ContainsKey(key) && !IsItemStale(key);
2023-08-03 16:17:34 -07:00
}
public bool ContainsKey(TKey key)
{
return _store.ContainsKey(key);
}
public void Update(TKey key)
{
if (_store.ContainsKey(key))
{
_store[key].TimeToLiveTimestamp = Time.GetTicksMsec();
}
else
{
GD.PushWarning("Updating a non-existent item in a cache!");
}
}
}