This allows us to merge some optimizations common between the 3-leg overload and the two ranges overload. In some cases this could also improve performance, since we avoid checking one of the iterators if the size if the ranges is known. I haven't been able to show any improvements though. This is also a prerequisite for optimizing `std::search`.