87cab44fb8
Fixed #135: Change services service priorities Fixed #136: ErrorManager: Implement recognize_error Fixed #137: BNFNodeParser : Error when parsing regex with sub parsers Fixed #138: get_last_errors(): real errors sources are lost Fixed #139: OneError return value removes the origin of the error Fixed #140: Concept variables are not correctly handled when parsing sub expression Fixed #143: Implement has_unknown_concepts()
72 lines
1.5 KiB
Python
72 lines
1.5 KiB
Python
from core.global_symbols import NotFound
|
|
|
|
|
|
class FastCache:
|
|
"""
|
|
Simplest LRU cache
|
|
"""
|
|
|
|
def __init__(self, max_size=256, default=None):
|
|
self.max_size = max_size
|
|
self.cache = {}
|
|
self.lru = []
|
|
self.default = default
|
|
self.calls = {}
|
|
|
|
def __contains__(self, item):
|
|
return self.has(item)
|
|
|
|
def __iter__(self):
|
|
yield from self.cache
|
|
|
|
def __next__(self):
|
|
return next(iter(self.cache))
|
|
|
|
def __len__(self):
|
|
return len(self.cache)
|
|
|
|
def put(self, key, value):
|
|
if len(self.cache) == self.max_size:
|
|
del self.cache[self.lru.pop(0)]
|
|
|
|
if key in self.cache:
|
|
self.lru.remove(key)
|
|
|
|
self.cache[key] = value
|
|
self.lru.append(key)
|
|
self.calls[key] = 0
|
|
|
|
def has(self, key):
|
|
return key in self.cache
|
|
|
|
def get(self, key):
|
|
try:
|
|
res = self.cache[key]
|
|
self.calls[key] += 1
|
|
return res
|
|
except KeyError:
|
|
if self.default:
|
|
value = self.default(key)
|
|
self.put(key, value)
|
|
return value
|
|
|
|
return NotFound
|
|
|
|
def evict_by_key(self, predicate):
|
|
to_remove = []
|
|
|
|
for k, v in self.cache.items():
|
|
if predicate(k):
|
|
to_remove.append(k)
|
|
|
|
for k in to_remove:
|
|
self.lru.remove(k)
|
|
del self.cache[k]
|
|
|
|
def copy(self):
|
|
return self.cache.copy()
|
|
|
|
def clear(self):
|
|
self.cache.clear()
|
|
self.lru.clear()
|