Beispiel #1
0
 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 __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)
Beispiel #3
0
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)