getLocation method
Return the location information for the character at the given offset
.
Implementation
CharacterLocation getLocation(int offset) {
var min = 0;
var max = lineStarts.length - 1;
// Subsequent calls to [getLocation] are often for offsets near each other.
// To take advantage of that, we cache the index of the line start we found
// when this was last called. If the current offset is on that line or
// later, we'll skip those early indices completely when searching.
if (offset >= lineStarts[_previousLine]) {
min = _previousLine;
// Before kicking off a full binary search, do a quick check here to see
// if the new offset is on that exact line.
if (min == lineStarts.length - 1 || offset < lineStarts[min + 1]) {
return CharacterLocation(min + 1, offset - lineStarts[min] + 1);
}
}
// Binary search to find the line containing this offset.
while (min < max) {
var midpoint = (max - min + 1) ~/ 2 + min;
if (lineStarts[midpoint] > offset) {
max = midpoint - 1;
} else {
min = midpoint;
}
}
_previousLine = min;
return CharacterLocation(min + 1, offset - lineStarts[min] + 1);
}