event_queue.py 1.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142
  1. from sccd.runtime.infinity import INFINITY
  2. from heapq import heappush, heappop
  3. class EventQueue(object):
  4. def __init__(self):
  5. self.event_list = []
  6. self.event_time_numbers = {}
  7. self.removed = set()
  8. def __str__(self):
  9. return str([entry for entry in self.event_list if entry not in self.removed])
  10. def isEmpty(self):
  11. return not [item for item in self.event_list if not item in self.removed]
  12. def getEarliestTime(self):
  13. while not self.isEmpty() and (self.event_list[0] in self.removed):
  14. item = heappop(self.event_list)
  15. self.removed.remove(item)
  16. return INFINITY if self.isEmpty() else self.event_list[0][0]
  17. def add(self, event_time, event):
  18. self.event_time_numbers[event_time] = self.event_time_numbers.setdefault(event_time, 0) + 1
  19. def_event = (event_time, self.event_time_numbers[event_time], event)
  20. heappush(self.event_list, def_event)
  21. return def_event
  22. def remove(self, event):
  23. self.removed.add(event)
  24. if len(self.removed) > 100:
  25. self.event_list = [x for x in self.event_list if x not in self.removed]
  26. self.removed = set()
  27. def pop(self):
  28. while 1:
  29. item = heappop(self.event_list)
  30. event_time = item[0]
  31. self.event_time_numbers[event_time] -= 1
  32. if not self.event_time_numbers[event_time]:
  33. del self.event_time_numbers[event_time]
  34. if item not in self.removed:
  35. return item[2]