in include/range/v3/algorithm/rotate.hpp [69:100]
static range<I> rotate_forward(I begin, I middle, S end)
{
I i = middle;
while(true)
{
ranges::iter_swap(begin, i);
++begin;
if(++i == end)
break;
if(begin == middle)
middle = i;
}
I r = begin;
if(begin != middle)
{
I j = middle;
while(true)
{
ranges::iter_swap(begin, j);
++begin;
if(++j == end)
{
if(begin == middle)
break;
j = middle;
}
else if(begin == middle)
middle = j;
}
}
return {r, i};
}