int compare()

in fatal/string/rope.h [1373:1421]


  int compare(rope const &rhs) const {
    if (!size_) {
      return rhs.size_ ? -1 : 0;
    }

    if (!rhs.size_) {
      return 1;
    }

    assert(!pieces_.empty());
    assert(!rhs.pieces_.empty());

    auto const lpieces = pieces_.size();
    auto const rpieces = rhs.pieces_.size();
    piece_index lpiece = 0;
    piece_index rpiece = 0;

    for (auto left = pieces_[0].ref(), right = rhs.pieces_[0].ref();;) {
      assert(!left.empty());
      assert(!right.empty());

      auto const length = std::min(left.size(), right.size());
      assert(length > 0);

      if (auto const result = std::strncmp(left.data(), right.data(), length)) {
        return result;
      }

      left += length;
      if (!left) {
        if (++lpiece == lpieces) {
          return -(right + length || rpiece + 1 < rpieces);
        }

        left = pieces_[lpiece].ref();
      }

      right += length;
      if (!right) {
        if (++rpiece == rpieces) {
          break;
        }

        right = rhs.pieces_[rpiece].ref();
      }
    }

    return 1;
  }