[libcxx-commits] [libcxx] [libc++] Optimize rotate (PR #120890)
Louis Dionne via libcxx-commits
libcxx-commits at lists.llvm.org
Thu Dec 18 09:14:50 PST 2025
================
@@ -89,46 +86,39 @@ __rotate_forward(_ForwardIterator __first, _ForwardIterator __middle, _ForwardIt
return __r;
}
-template <typename _Integral>
-inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX17 _Integral __algo_gcd(_Integral __x, _Integral __y) {
- do {
- _Integral __t = __x % __y;
- __x = __y;
- __y = __t;
- } while (__y);
- return __x;
-}
+template <class _AlgPolicy, class _Iter, class _Sent>
+_LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX17 _Iter __rotate_random(_Iter __first, _Iter __middle, _Sent __last) {
+ auto __left = _IterOps<_AlgPolicy>::distance(__first, __middle);
+ auto __right = _IterOps<_AlgPolicy>::distance(__middle, __last);
+ auto __end = __first + __right;
-template <class _AlgPolicy, typename _RandomAccessIterator>
-_LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX17 _RandomAccessIterator
-__rotate_gcd(_RandomAccessIterator __first, _RandomAccessIterator __middle, _RandomAccessIterator __last) {
- typedef typename iterator_traits<_RandomAccessIterator>::difference_type difference_type;
- typedef typename iterator_traits<_RandomAccessIterator>::value_type value_type;
- using _Ops = _IterOps<_AlgPolicy>;
+ if (__left == 0 || __first == __last)
+ return __first;
- const difference_type __m1 = __middle - __first;
- const difference_type __m2 = _Ops::distance(__middle, __last);
- if (__m1 == __m2) {
- std::__swap_ranges<_AlgPolicy>(__first, __middle, __middle, __last);
+ if (__left == __right) {
+ std::__swap_ranges<_AlgPolicy>(__first, __middle, __middle);
----------------
ldionne wrote:
Can you file an issue to use `for_each` in `swap_ranges` for deque? That would greatly speed it up. It would also benefit the tree containers.
https://github.com/llvm/llvm-project/pull/120890
More information about the libcxx-commits
mailing list