public void BinarySearchTest() { List <int> list = new List <int>(new int[] { 0, 2, 4, 5, 6 }); Assert.AreEqual(1, ListUtils.BinarySearch(list, 0, list.Count, delegate(int x) { return(x < 2); })); Assert.AreEqual(2, ListUtils.BinarySearch(list, 0, list.Count, delegate(int x) { return(x <= 2); })); Assert.AreEqual(3, ListUtils.BinarySearch(list, 3, 3, delegate(int x) { return(x <= 2); })); }
public static int ScreenPositionToMessageTextCharIndex(Graphics g, IMessage msg, bool showRawMessages, int textLineIndex, Font font, StringFormat format, int screenPosition) { var textToDisplay = msg.GetDisplayText(showRawMessages); var txt = textToDisplay.Text; var line = textToDisplay.GetNthTextLine(textLineIndex); var lineValue = line.Value; int lineCharIdx = ListUtils.BinarySearch(new ListUtils.VirtualList <int>(lineValue.Length, i => i), 0, lineValue.Length, i => { var charBounds = g.MeasureCharacterRange(lineValue, font, format, new System.Drawing.CharacterRange(i, 1)); return(((charBounds.Left + charBounds.Right) / 2) < screenPosition); }); //return (line.StartIndex + lineCharIdx) - txt.StartIndex; return(lineCharIdx); }
public IEnumerable <IndexedMessage> Reverse(long startFrom) { var idx = ListUtils.BinarySearch(messages, 0, messages.Count, m => m.Position <= startFrom); bool started = false; for (; idx >= 0; --idx) { if (!started) { started = idx < messages.Count && messages[idx].EndPosition <= startFrom; } if (started) { yield return(new IndexedMessage(idx, messages[idx])); } } }
public static Tuple <int, int> CalcFocusedMessageEqualRange(this IReadOnlyList <StateInspectorEvent> allChanges, FocusedMessageInfo focusedMessageInfo) { if (focusedMessageInfo == null || focusedMessageInfo.FocusedMessage == null) { return(null); } var messageLogSource = focusedMessageInfo.FocusedMessage.GetLogSource(); if (messageLogSource == null) { return(null); } var focusedMessageTime = focusedMessageInfo.FocusedMessage.Time; var focusedMessagePosition = focusedMessageInfo.FocusedMessage.Position; int lowerBound = ListUtils.BinarySearch(allChanges, 0, allChanges.Count, change => EventsComparer.Compare(change, focusedMessageTime, messageLogSource, focusedMessagePosition) < 0); int upperBound = ListUtils.BinarySearch(allChanges, 0, allChanges.Count, change => EventsComparer.Compare(change, focusedMessageTime, messageLogSource, focusedMessagePosition) <= 0); return(new Tuple <int, int>(lowerBound, upperBound)); }
bool ISelectionManager.PickNewSelection() { var viewLines = screenBuffer.Messages; if (selection.First.Message == null) { if (viewLines.Count > 0) { SetSelection(0, SelectionFlag.SelectBeginningOfLine); } return(true); } if (BelongsToNonExistentSource(selection.First) || BelongsToNonExistentSource(selection.Last)) { if (viewLines.Count > 0) { var maxIdx = Math.Min(screenBuffer.FullyVisibleLinesCount, viewLines.Count); IComparer <IMessage> cmp = new DatesComparer(selection.First.Message.Time.ToLocalDateTime()); var idx = ListUtils.BinarySearch(viewLines, 0, maxIdx, dl => cmp.Compare(dl.Message, null) < 0); if (idx != maxIdx) { SetSelection(idx, SelectionFlag.SelectBeginningOfLine); } else { SetSelection(0, SelectionFlag.SelectBeginningOfLine); } } else { SetSelection(new CursorPosition(), new CursorPosition()); OnFocusedMessageBookmarkChanged(); } return(true); } return(false); }