Source code for remcall.communication.store

from logging import log, DEBUG
from ..schema import Type
from .proxy import ProxyType
from ..error import UnknownProxyObject, UnknownImplementationObjectReference

[docs]class IdStore: def __init__(self): self.id_to_obj = {} self.obj_to_id = {} def __getitem__(self, key: int): return self.id_to_obj[key] def __setitem__(self, key: int, obj): self.id_to_obj[key] = obj self.obj_to_id[obj] = key def __delitem__(self, key): value = self.id_to_obj[key] del self.id_to_obj[key] del self.obj_to_id[value] def __contains__(self, key): return key in self.id_to_obj
[docs] def get_id_for_object(self, obj): return self.obj_to_id[obj]
[docs] def delete_object(self, obj): key = self.obj_to_id[obj] del self.obj_to_id[obj] del self.id_to_obj[key]
[docs] def contains_object(self, obj): return obj in self.obj_to_id
[docs]class ReferenceStore: def __init__(self, is_client, proxy_factory): self.is_client = is_client self.proxy_factory = proxy_factory self.proxy_objects = IdStore() self.implementation_objects = IdStore() self._next_object_id = 0 @property def object_id_sign(self): return -1 if self.is_client else 1
[docs] def next_object_id(self): self._next_object_id += self.object_id_sign return self._next_object_id
[docs] def get_proxy_object(self, key: int, typ: Type): if not key in self.proxy_objects: self.proxy_objects[key] = self.proxy_factory(typ) return self.proxy_objects[key]
[docs] def get_implementation_object(self, key: int): if not key in self.implementation_objects: raise UnknownImplementationObjectReference(key) return self.implementation_objects[key]
[docs] def get_id_for_proxy_object(self, obj): if not self.proxy_objects.contains_object(obj): raise UnknownProxyObject(obj) return self.proxy_objects.get_id_for_object(obj)
[docs] def get_id_for_implementation_object(self, obj): if not self.implementation_objects.contains_object(obj): self.implementation_objects[self.next_object_id()] = obj return self.implementation_objects.get_id_for_object(obj)
[docs] def get_object(self, key: int, typ: Type): log(DEBUG, '{} store is getting object for ID {}'.format('client' if self.is_client else 'server', key)) if key == 0: return None is_proxy_obj = (self.is_client and key > 0) or (not self.is_client and key < 0) log(DEBUG, '{} references {} object'.format(key, 'a proxy' if is_proxy_obj else 'an implementation')) return self.get_proxy_object(key, typ) if is_proxy_obj else self.get_implementation_object(key)
[docs] def get_id_for_object(self, obj): if obj is None: return 0 is_proxy_obj = isinstance(obj, ProxyType) return self.get_id_for_proxy_object(obj) if is_proxy_obj else self.get_id_for_implementation_object(obj)