const_iterator pinpoint()

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_);
  }