def __init__(self, objects): self._objects = list(objects) self._postFilterObjs = [] self._sync = Sync('%s-%s' % (self.__class__.__name__, self._SerialNumGen.next()), self._SyncMaster) self._sync.invalidate() ExclusiveObjectPool.addExclObjs(self._objects, self._postFilterObjs, self._sync)
class ExclusiveObjectPool(DirectObject.DirectObject): __module__ = __name__ _ExclObjs = [] _ExclObjIds = {} _SyncMaster = Sync('ExclusiveObjectPool.ExcludedObjectList') _SerialNumGen = SerialNumGen() @classmethod def addExclObjs(cls, *objs): for obj in makeList(objs): if id(obj) not in cls._ExclObjIds: cls._ExclObjs.append(obj) cls._ExclObjIds.setdefault(id(obj), 0) cls._ExclObjIds[id(obj)] += 1 cls._SyncMaster.change() @classmethod def removeExclObjs(cls, *objs): for obj in makeList(objs): cls._ExclObjIds[id(obj)] -= 1 if cls._ExclObjIds[id(obj)] == 0: del cls._ExclObjIds[id(obj)] cls._ExclObjs.remove(obj) cls._SyncMaster.change() def __init__(self, objects): self._objects = list(objects) self._postFilterObjs = [] self._sync = Sync('%s-%s' % (self.__class__.__name__, self._SerialNumGen.next()), self._SyncMaster) self._sync.invalidate() ExclusiveObjectPool.addExclObjs(self._objects, self._postFilterObjs, self._sync) def destroy(self): self.ignoreAll() ExclusiveObjectPool.removeExclObjs(self._objects, self._postFilterObjs, self._sync) del self._objects del self._postFilterObjs del self._sync def _resync(self): if self._sync.isSynced(self._SyncMaster): return if hasattr(self, '_filteredPool'): ExclusiveObjectPool.removeExclObjs(*self._filteredPool._getInternalObjs()) ExclusiveObjectPool.removeExclObjs(self._filteredPool) del self._filteredPool del self._postFilterObjs[:] for obj in self._objects: if id(obj) not in ExclusiveObjectPool._ExclObjIds: self._postFilterObjs.append(obj) self._filteredPool = ExclusiveObjectPool(self._postFilterObjs) ExclusiveObjectPool.addExclObjs(self._filteredPool) ExclusiveObjectPool.addExclObjs(*self._filteredPool._getInternalObjs()) self._sync.sync(self._SyncMaster) def getObjsOfType(self, type): self._resync() return self._filteredPool.getObjsOfType(type) def printObjsOfType(self, type): self._resync() return self._filteredPool.printObjsOfType(type) def diff(self, other): self._resync() return self._filteredPool.diff(other._filteredPool) def typeFreqStr(self): self._resync() return self._filteredPool.typeFreqStr() def __len__(self): self._resync() return len(self._filteredPool)
class ExclusiveObjectPool(DirectObject.DirectObject): _ExclObjs = [] _ExclObjIds = {} _SyncMaster = Sync('ExclusiveObjectPool.ExcludedObjectList') _SerialNumGen = SerialNumGen() def addExclObjs(cls, *objs): for obj in makeList(objs): if id(obj) not in cls._ExclObjIds: cls._ExclObjs.append(obj) cls._ExclObjIds.setdefault(id(obj), 0) cls._ExclObjIds[id(obj)] += 1 cls._SyncMaster.change() addExclObjs = classmethod(addExclObjs) def removeExclObjs(cls, *objs): for obj in makeList(objs): cls._ExclObjIds[id(obj)] -= 1 if cls._ExclObjIds[id(obj)] == 0: del cls._ExclObjIds[id(obj)] cls._ExclObjs.remove(obj) continue cls._SyncMaster.change() removeExclObjs = classmethod(removeExclObjs) def __init__(self, objects): self._objects = list(objects) self._postFilterObjs = [] self._sync = Sync( '%s-%s' % (self.__class__.__name__, self._SerialNumGen.next()), self._SyncMaster) self._sync.invalidate() ExclusiveObjectPool.addExclObjs(self._objects, self._postFilterObjs, self._sync) def destroy(self): self.ignoreAll() ExclusiveObjectPool.removeExclObjs(self._objects, self._postFilterObjs, self._sync) del self._objects del self._postFilterObjs del self._sync def _resync(self): if self._sync.isSynced(self._SyncMaster): return None if hasattr(self, '_filteredPool'): ExclusiveObjectPool.removeExclObjs( *self._filteredPool._getInternalObjs()) ExclusiveObjectPool.removeExclObjs(self._filteredPool) del self._filteredPool del self._postFilterObjs[:] for obj in self._objects: if id(obj) not in ExclusiveObjectPool._ExclObjIds: self._postFilterObjs.append(obj) continue self._filteredPool = ExclusiveObjectPool(self._postFilterObjs) ExclusiveObjectPool.addExclObjs(self._filteredPool) ExclusiveObjectPool.addExclObjs(*self._filteredPool._getInternalObjs()) self._sync.sync(self._SyncMaster) def getObjsOfType(self, type): self._resync() return self._filteredPool.getObjsOfType(type) def printObjsOfType(self, type): self._resync() return self._filteredPool.printObjsOfType(type) def diff(self, other): self._resync() return self._filteredPool.diff(other._filteredPool) def typeFreqStr(self): self._resync() return self._filteredPool.typeFreqStr() def __len__(self): self._resync() return len(self._filteredPool)