void Path::moveLeft(unsigned Level) { assert(Level != 0 && "Cannot move the root node"); // Go up the tree until we can go left. unsigned l = 0; if (valid()) { l = Level - 1; while (path[l].offset == 0) { assert(l != 0 && "Cannot move beyond begin()"); --l; } } else if (height() < Level) // end() may have created a height=0 path. path.resize(Level + 1, Entry(nullptr, 0, 0)); // NR is the subtree containing our left sibling. --path[l].offset; NodeRef NR = subtree(l); // Get the rightmost node in the subtree. for (++l; l != Level; ++l) { path[l] = Entry(NR, NR.size() - 1); NR = NR.subtree(NR.size() - 1); } path[l] = Entry(NR, NR.size() - 1); }
NodeRef Path::getLeftSibling(unsigned Level) const { // The root has no siblings. if (Level == 0) return NodeRef(); // Go up the tree until we can go left. unsigned l = Level - 1; while (l && path[l].offset == 0) --l; // We can't go left. if (path[l].offset == 0) return NodeRef(); // NR is the subtree containing our left sibling. NodeRef NR = path[l].subtree(path[l].offset - 1); // Keep right all the way down. for (++l; l != Level; ++l) NR = NR.subtree(NR.size() - 1); return NR; }