private void InsertViaBinarySearch(TeleportQueueEntry entry) { if (_queue.Count == 0) { _queue.Add(entry); return; } if (entry.Timestamp > _queue[_queue.Count - 1].Timestamp) { _queue.Add(entry); return; } float key = entry.Timestamp; int minNum = 0; int maxNum = _queue.Count - 1; while (minNum <= maxNum) { int mid = (minNum + maxNum) / 2; if (System.Math.Abs(key - _queue[mid].Timestamp) < float.Epsilon) { _queue.Insert(mid + 1, entry); return; } else if (key < _queue[mid].Timestamp) { maxNum = mid - 1; } else { minNum = mid + 1; } } throw new System.Exception("Failed to binary search"); }
public void EnqueueEntry(float timestamp, ITeleportState[] states) { var entry = new TeleportQueueEntry() { Timestamp = timestamp, States = states, }; InsertViaBinarySearch(entry); }