[libcxx-commits] [libcxx] [libc++][ranges] implement `ranges::shift_left` (PR #83231)
Louis Dionne via libcxx-commits
libcxx-commits at lists.llvm.org
Fri Jan 23 10:31:31 PST 2026
================
@@ -24,30 +29,42 @@ _LIBCPP_BEGIN_NAMESPACE_STD
#if _LIBCPP_STD_VER >= 20
-template <class _ForwardIterator>
-inline _LIBCPP_HIDE_FROM_ABI constexpr _ForwardIterator
-shift_left(_ForwardIterator __first,
- _ForwardIterator __last,
- typename iterator_traits<_ForwardIterator>::difference_type __n) {
+template <class _AlgPolicy, class _Iter, class _Sent>
+_LIBCPP_HIDE_FROM_ABI constexpr pair<_Iter, _Iter>
+__shift_left(_Iter __first, _Sent __last, typename _IterOps<_AlgPolicy>::template __difference_type<_Iter> __n) {
+ _LIBCPP_ASSERT_UNCATEGORIZED(__n >= 0, "__n must be greater than or equal to 0");
+
if (__n == 0) {
- return __last;
+ _Iter __end = _IterOps<_AlgPolicy>::next(__first, __last);
+ return {std::move(__first), std::move(__end)};
}
- _ForwardIterator __m = __first;
- if constexpr (__has_random_access_iterator_category<_ForwardIterator>::value) {
- if (__n >= __last - __first) {
- return __first;
+ _Iter __m = __first;
+ if constexpr (sized_sentinel_for<_Sent, _Iter>) {
+ auto __size = _IterOps<_AlgPolicy>::distance(__first, __last);
+ if (__n >= __size) {
+ return {__first, std::move(__first)};
}
- __m += __n;
+ _IterOps<_AlgPolicy>::advance(__m, __n);
} else {
for (; __n > 0; --__n) {
if (__m == __last) {
- return __first;
+ return {__first, std::move(__first)};
}
++__m;
}
}
- return std::move(__m, __last, __first);
+
+ _Iter __result = std::__move<_AlgPolicy>(__m, __last, __first).second;
+ return {std::move(__first), std::move(__result)};
+}
+
+template <class _ForwardIterator>
+inline _LIBCPP_HIDE_FROM_ABI constexpr _ForwardIterator
----------------
ldionne wrote:
```suggestion
_LIBCPP_HIDE_FROM_ABI constexpr _ForwardIterator
```
https://github.com/llvm/llvm-project/pull/83231
More information about the libcxx-commits
mailing list