Advertisement
Guest User

Untitled

a guest
Aug 8th, 2014
225
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
D 0.85 KB | None | 0 0
  1. Tuple!(size_t, size_t) rotateTail(R)(R whole, R right)
  2. {
  3.     if (whole.empty || right.empty || whole is right)
  4.     {
  5.         // Degenerate cases, just return all zeros
  6.         return typeof(return).init;
  7.     }
  8.     auto w = whole.save, r = right.save;
  9.     size_t rotated = 0;
  10.     for (;; w.popFront, r.popFront, ++rotated)
  11.     {
  12.         if (r.empty)
  13.         {
  14.             assert(!w.empty && !right.empty);
  15.             if (w is right) return tuple(2 * rotated, rotated);
  16.             auto x = rotateTail(w, right);
  17.             return tuple(rotated + x[0], rotated);
  18.         }
  19.         if (w is right)
  20.         {
  21.             assert(!w.empty && rotated);
  22.             auto x = rotateTail(right, r);
  23.             return tuple(rotated + x[0], x[0]);
  24.         }
  25.         assert(!w.empty);
  26.         assert(!r.empty);
  27.         swap(w.front, r.front);
  28.     }
  29. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement