static range rotate_gcd()

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};
            }