in include/range/v3/algorithm/rotate.hpp [115:143]
static range<I> rotate_gcd(I begin, I middle, I end)
{
auto const m1 = middle - begin;
auto const m2 = end - middle;
if(m1 == m2)
{
swap_ranges(begin, middle, middle);
return {middle, end};
}
auto const g = rotate_fn::gcd(m1, m2);
for (I p = begin + g; p != begin;)
{
iterator_value_t<I> t = iter_move(--p);
I p1 = p;
I p2 = p1 + m1;
do
{
*p1 = iter_move(p2);
p1 = p2;
auto const d = end - p2;
if(m1 < d)
p2 += m1;
else
p2 = begin + (m1 - d);
} while(p2 != p);
*p1 = std::move(t);
}
return {begin + m2, end};
}