123456789101112131415161718192021222324252627282930313233343536373839404142 |
- from sccd.runtime.infinity import INFINITY
- from heapq import heappush, heappop
- class EventQueue(object):
- def __init__(self):
- self.event_list = []
- self.event_time_numbers = {}
- self.removed = set()
-
- def __str__(self):
- return str([entry for entry in self.event_list if entry not in self.removed])
-
- def isEmpty(self):
- return not [item for item in self.event_list if not item in self.removed]
-
- def getEarliestTime(self):
- while not self.isEmpty() and (self.event_list[0] in self.removed):
- item = heappop(self.event_list)
- self.removed.remove(item)
- return INFINITY if self.isEmpty() else self.event_list[0][0]
-
- def add(self, event_time, event):
- self.event_time_numbers[event_time] = self.event_time_numbers.setdefault(event_time, 0) + 1
- def_event = (event_time, self.event_time_numbers[event_time], event)
- heappush(self.event_list, def_event)
- return def_event
-
- def remove(self, event):
- self.removed.add(event)
- if len(self.removed) > 100:
- self.event_list = [x for x in self.event_list if x not in self.removed]
- self.removed = set()
-
- def pop(self):
- while 1:
- item = heappop(self.event_list)
- event_time = item[0]
- self.event_time_numbers[event_time] -= 1
- if not self.event_time_numbers[event_time]:
- del self.event_time_numbers[event_time]
- if item not in self.removed:
- return item[2]
|