Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- Tuple!(size_t, size_t) rotateTail(R)(R whole, R right)
- {
- if (whole.empty || right.empty || whole is right)
- {
- // Degenerate cases, just return all zeros
- return typeof(return).init;
- }
- auto w = whole.save, r = right.save;
- size_t rotated = 0;
- for (;; w.popFront, r.popFront, ++rotated)
- {
- if (r.empty)
- {
- assert(!w.empty && !right.empty);
- if (w is right) return tuple(2 * rotated, rotated);
- auto x = rotateTail(w, right);
- return tuple(rotated + x[0], rotated);
- }
- if (w is right)
- {
- assert(!w.empty && rotated);
- auto x = rotateTail(right, r);
- return tuple(rotated + x[0], x[0]);
- }
- assert(!w.empty);
- assert(!r.empty);
- swap(w.front, r.front);
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement