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