in fatal/string/rope.h [1666:1704]
const_iterator pinpoint(size_type i) const {
auto const pieces = pieces_.size();
if (i < size_) {
piece_index begin = 0;
auto end = pieces;
while ((end - begin) > 1) {
auto const pivot = begin + ((end - begin) / 2);
auto const &piece = pieces_[pivot];
assert(pivot >= begin);
assert(pivot < end);
auto const offset = piece.payload();
if (i < offset) {
end = pivot;
} else if (offset < i) {
begin = pivot;
} else {
assert(i >= offset);
return const_iterator(this, std::addressof(piece), pivot, i - offset);
}
}
if (begin != end) {
assert(begin + 1 == end);
auto const &piece = pieces_[begin];
auto const offset = piece.payload();
if (i >= offset) {
return const_iterator(this, std::addressof(piece), begin, i - offset);
}
}
}
return const_iterator(this, nullptr, pieces, i - size_);
}