xref: /llvm-project/libcxx/include/__algorithm/shift_left.h (revision 7b4622514d232ce5f7110dd8b20d90e81127c467)
1134723edSLouis Dionne //===----------------------------------------------------------------------===//
2134723edSLouis Dionne //
3134723edSLouis Dionne // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4134723edSLouis Dionne // See https://llvm.org/LICENSE.txt for license information.
5134723edSLouis Dionne // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6134723edSLouis Dionne //
7134723edSLouis Dionne //===----------------------------------------------------------------------===//
8134723edSLouis Dionne 
9134723edSLouis Dionne #ifndef _LIBCPP___ALGORITHM_SHIFT_LEFT_H
10134723edSLouis Dionne #define _LIBCPP___ALGORITHM_SHIFT_LEFT_H
11134723edSLouis Dionne 
12134723edSLouis Dionne #include <__algorithm/move.h>
134d81a46fSArthur O'Dwyer #include <__config>
14134723edSLouis Dionne #include <__iterator/iterator_traits.h>
15134723edSLouis Dionne 
16134723edSLouis Dionne #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
17134723edSLouis Dionne #  pragma GCC system_header
18134723edSLouis Dionne #endif
19134723edSLouis Dionne 
20*7b462251SLouis Dionne _LIBCPP_PUSH_MACROS
21*7b462251SLouis Dionne #include <__undef_macros>
22*7b462251SLouis Dionne 
23134723edSLouis Dionne _LIBCPP_BEGIN_NAMESPACE_STD
24134723edSLouis Dionne 
254f15267dSNikolas Klauser #if _LIBCPP_STD_VER >= 20
26134723edSLouis Dionne 
27134723edSLouis Dionne template <class _ForwardIterator>
289783f28cSLouis Dionne inline _LIBCPP_HIDE_FROM_ABI constexpr _ForwardIterator
shift_left(_ForwardIterator __first,_ForwardIterator __last,typename iterator_traits<_ForwardIterator>::difference_type __n)299783f28cSLouis Dionne shift_left(_ForwardIterator __first,
309783f28cSLouis Dionne            _ForwardIterator __last,
319783f28cSLouis Dionne            typename iterator_traits<_ForwardIterator>::difference_type __n) {
32134723edSLouis Dionne   if (__n == 0) {
33134723edSLouis Dionne     return __last;
34134723edSLouis Dionne   }
35134723edSLouis Dionne 
36134723edSLouis Dionne   _ForwardIterator __m = __first;
3780643d93SNikolas Klauser   if constexpr (__has_random_access_iterator_category<_ForwardIterator>::value) {
38134723edSLouis Dionne     if (__n >= __last - __first) {
39134723edSLouis Dionne       return __first;
40134723edSLouis Dionne     }
41134723edSLouis Dionne     __m += __n;
42134723edSLouis Dionne   } else {
43134723edSLouis Dionne     for (; __n > 0; --__n) {
44134723edSLouis Dionne       if (__m == __last) {
45134723edSLouis Dionne         return __first;
46134723edSLouis Dionne       }
47134723edSLouis Dionne       ++__m;
48134723edSLouis Dionne     }
49134723edSLouis Dionne   }
5077a00c0dSLouis Dionne   return std::move(__m, __last, __first);
51134723edSLouis Dionne }
52134723edSLouis Dionne 
534f15267dSNikolas Klauser #endif // _LIBCPP_STD_VER >= 20
54134723edSLouis Dionne 
55134723edSLouis Dionne _LIBCPP_END_NAMESPACE_STD
56134723edSLouis Dionne 
57*7b462251SLouis Dionne _LIBCPP_POP_MACROS
58*7b462251SLouis Dionne 
59134723edSLouis Dionne #endif // _LIBCPP___ALGORITHM_SHIFT_LEFT_H
60