#pragma once #include "gp/algorithm/move.hpp" namespace gp { template iterator rotate(iterator first, iterator new_first, iterator last) { if(first == new_first) return last; if(new_first == last) return first; iterator in = new_first; iterator out = first; iterator mv = first; while(in != last) { if(out == mv) mv = in; gp::swap((*out++), (*in++)); } // rotate the remaining sequence into place (rotate)(out, mv, last); return out; } }