mirror of
https://github.com/MarioSpore/Grinch-AP.git
synced 2025-10-21 20:21:32 -06:00
Added Super Metroid support (#46)
Varia Randomizer based implementation LttPClient -> SNIClient
This commit is contained in:
63
worlds/sm/variaRandomizer/logic/cache.py
Normal file
63
worlds/sm/variaRandomizer/logic/cache.py
Normal file
@@ -0,0 +1,63 @@
|
||||
# the caching decorator for helpers functions
|
||||
class VersionedCache(object):
|
||||
__slots__ = ( 'cache', 'masterCache', 'nextSlot', 'size')
|
||||
|
||||
def __init__(self):
|
||||
self.cache = []
|
||||
self.masterCache = {}
|
||||
self.nextSlot = 0
|
||||
self.size = 0
|
||||
|
||||
def reset(self):
|
||||
# reinit the whole cache
|
||||
self.masterCache = {}
|
||||
self.update(0)
|
||||
|
||||
def update(self, newKey):
|
||||
cache = self.masterCache.get(newKey, None)
|
||||
if cache is None:
|
||||
cache = [ None ] * self.size
|
||||
self.masterCache[newKey] = cache
|
||||
self.cache = cache
|
||||
|
||||
def decorator(self, func):
|
||||
return self._decorate(func.__name__, self._new_slot(), func)
|
||||
|
||||
# for lambdas
|
||||
def ldeco(self, func):
|
||||
return self._decorate(func.__code__, self._new_slot(), func)
|
||||
|
||||
def _new_slot(self):
|
||||
slot = self.nextSlot
|
||||
self.nextSlot += 1
|
||||
self.size += 1
|
||||
return slot
|
||||
|
||||
def _decorate(self, name, slot, func):
|
||||
def _decorator(arg):
|
||||
#ret = self.cache[slot]
|
||||
#if ret is not None:
|
||||
# return ret
|
||||
#else:
|
||||
ret = func(arg)
|
||||
# self.cache[slot] = ret
|
||||
return ret
|
||||
return _decorator
|
||||
|
||||
Cache = VersionedCache()
|
||||
|
||||
class RequestCache(object):
|
||||
def __init__(self):
|
||||
self.results = {}
|
||||
|
||||
def request(self, request, *args):
|
||||
return ''.join([request] + [str(arg) for arg in args])
|
||||
|
||||
def store(self, request, result):
|
||||
self.results[request] = result
|
||||
|
||||
def get(self, request):
|
||||
return self.results[request] if request in self.results else None
|
||||
|
||||
def reset(self):
|
||||
self.results.clear()
|
||||
Reference in New Issue
Block a user