event_queue.py 2.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859
  1. from kernel.mvk_server.python_runtime.infinity import INFINITY
  2. class EventQueue(object):
  3. class EventQueueEntry(object):
  4. def __init__(self, event_list, time_offset) :
  5. self.event_list = event_list
  6. self.time_offset = time_offset
  7. def decreaseTime(self, offset) :
  8. self.time_offset -= offset;
  9. def getEvents(self) :
  10. return self.event_list
  11. def getTime (self) :
  12. return self.time_offset
  13. def __init__(self):
  14. self.event_list = []
  15. def add(self, event_list, time_offset) :
  16. entry = EventQueue.EventQueueEntry(event_list, time_offset);
  17. #We maintain a sorted stable list
  18. insert_index = 0;
  19. index = len(self.event_list)-1
  20. while (index >= 0) :
  21. if (self.event_list[index].getTime() <= time_offset) :
  22. insert_index = index + 1;
  23. break;
  24. index -= 1
  25. self.event_list.insert(insert_index, entry)
  26. def decreaseTime(self, offset) :
  27. for event in self.event_list :
  28. event.decreaseTime(offset)
  29. def isEmpty(self) :
  30. return len(self.event_list) == 0
  31. def getEarliestTime(self) :
  32. """Returns the earliest time. INFINITY if no events are present."""
  33. if self.isEmpty() :
  34. return INFINITY
  35. else :
  36. return self.event_list[0].getTime()
  37. def popDueEvents(self) :
  38. result = []
  39. if (self.isEmpty() or self.event_list[0].getTime() > 0.0) :
  40. #There are no events, or the earliest event isn't due, so we can already return an emtpy result
  41. return result
  42. index = 0;
  43. while (index < len(self.event_list) and self.event_list[index].getTime() <= 0.0) :
  44. result.append(self.event_list[index].getEvents()) #Add all events that are due (offset less than 0) to the result
  45. index += 1
  46. self.event_list = self.event_list[len(result):]
  47. return result;