< Summary

Class:Itinero.Profiles.EdgeTypesMap.LruCache`2
Assembly:Itinero
File(s):/home/runner/work/routing2/routing2/src/Itinero/Profiles/EdgeTypesMap/LruCache.cs
Covered lines:0
Uncovered lines:32
Coverable lines:32
Total lines:67
Line coverage:0% (0 of 32)
Covered branches:0
Total branches:4
Branch coverage:0% (0 of 4)
Tag:224_14471318300

Metrics

MethodBranch coverage Cyclomatic complexity Line coverage
.ctor(...)100%10%
TryGet(...)0%20%
Add(...)0%20%
RemoveFirst()100%10%
get_Count()100%10%

File(s)

/home/runner/work/routing2/routing2/src/Itinero/Profiles/EdgeTypesMap/LruCache.cs

#LineLine coverage
 1using System.Collections.Generic;
 2
 3namespace Itinero.Profiles.EdgeTypesMap;
 4
 5internal class LruCache<K, V>
 6{
 07    private readonly Dictionary<K, LinkedListNode<LruCacheItem<K, V>>> _cacheMap = new();
 8    private readonly int _capacity;
 09    private readonly LinkedList<LruCacheItem<K, V>> _lruList = new();
 10
 011    public LruCache(int capacity)
 012    {
 013        _capacity = capacity;
 014    }
 15
 16    public bool TryGet(K key, out V? value)
 017    {
 18        LinkedListNode<LruCacheItem<K, V>> node;
 019        if (!_cacheMap.TryGetValue(key, out node))
 020        {
 021            value = default;
 022            return false;
 23        }
 24
 025        value = node.Value.value;
 026        _lruList.Remove(node);
 027        _lruList.AddLast(node);
 028        return true;
 029    }
 30
 31    public void Add(K key, V val)
 032    {
 033        if (_cacheMap.Count >= _capacity)
 034        {
 035            this.RemoveFirst();
 036        }
 37
 038        LruCacheItem<K, V> cacheItem = new(key, val);
 039        LinkedListNode<LruCacheItem<K, V>> node = new(cacheItem);
 040        _lruList.AddLast(node);
 041        _cacheMap.Add(key, node);
 042    }
 43
 44    private void RemoveFirst()
 045    {
 46        // Remove from LRUPriority
 047        LinkedListNode<LruCacheItem<K, V>> node = _lruList.First;
 048        _lruList.RemoveFirst();
 49
 50        // Remove from cache
 051        _cacheMap.Remove(node.Value.key);
 052    }
 53
 054    public int Count => _cacheMap.Count;
 55}
 56
 57internal class LruCacheItem<K, V>
 58{
 59    public K key;
 60    public V value;
 61
 62    public LruCacheItem(K k, V v)
 63    {
 64        key = k;
 65        value = v;
 66    }
 67}