class EventQueue(object): """define the event Q. It can store event and get them by popping from the top""" def __init__(self): self._eventSortFunc = lambda e : e.eventType == Event.EventType.Now self._queue = SkipList(keyFun = Frame.getTime, allowDups = 0) def enque(self, event): """put the given event into the event Q. Throws exception if event has negative time""" #if e exit in Q in some frame f # append e to f #else # create new frame f with e and add f to Q if event.time in self._queue: #print "Appending event %s" % event self._queue[event.time].append(event) else: f = Frame(event.time, self._eventSortFunc) f.append(event) #print "Adding frame %s" % f self._queue.insert(f) return def deque(self): """remove the topmost event from the event Q. throws exception if the Q is empty""" if self.isEmpty: raise Exception("Error, can't deque cause Q is empty") currentFrame = self._queue.first() resultEvent = currentFrame.pop() if currentFrame.isEmpty(): #this frame is empty, bring the next one self._queue.delete(currentFrame.getTime()) return resultEvent @property def time(self): """returns the time of the top most event in event Q. Returns 0 if Q is empty""" if self.isEmpty: return 0 return self._queue.first().peek().time @property def top(self): if self.isEmpty: raise Exception("Error, can't get top cause event Q is empty") return self._queue.first().peek() @property def isEmpty(self): return len(self._queue) == 0 def __len__(self): #have to count all events cause sometimes events are merged eventCount = 0 for frame in self._queue: eventCount += len(frame) return eventCount def __iter__(self): for frame in self._queue: for event in frame: yield event def __str__(self): res = "EventQ len: {:3}".format(len(self)) for i , ev in enumerate(self._queue): res += "\n {:3}) {}".format(i, ev) return res
def __init__(self): self._eventSortFunc = lambda e : e.eventType == Event.EventType.Now self._queue = SkipList(keyFun = Frame.getTime, allowDups = 0)