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>
13*4d81a46fSArthur O'Dwyer #include <__config>
14134723edSLouis Dionne #include <__iterator/iterator_traits.h>
15*4d81a46fSArthur O'Dwyer #include <type_traits>
16134723edSLouis Dionne 
17134723edSLouis Dionne #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
18134723edSLouis Dionne #  pragma GCC system_header
19134723edSLouis Dionne #endif
20134723edSLouis Dionne 
21134723edSLouis Dionne _LIBCPP_BEGIN_NAMESPACE_STD
22134723edSLouis Dionne 
23134723edSLouis Dionne #if _LIBCPP_STD_VER > 17
24134723edSLouis Dionne 
25134723edSLouis Dionne template <class _ForwardIterator>
26134723edSLouis Dionne inline _LIBCPP_INLINE_VISIBILITY constexpr
27134723edSLouis Dionne _ForwardIterator
shift_left(_ForwardIterator __first,_ForwardIterator __last,typename iterator_traits<_ForwardIterator>::difference_type __n)28134723edSLouis Dionne shift_left(_ForwardIterator __first, _ForwardIterator __last,
29134723edSLouis Dionne            typename iterator_traits<_ForwardIterator>::difference_type __n)
30134723edSLouis Dionne {
31134723edSLouis Dionne     if (__n == 0) {
32134723edSLouis Dionne         return __last;
33134723edSLouis Dionne     }
34134723edSLouis Dionne 
35134723edSLouis Dionne     _ForwardIterator __m = __first;
36134723edSLouis Dionne     if constexpr (__is_cpp17_random_access_iterator<_ForwardIterator>::value) {
37134723edSLouis Dionne         if (__n >= __last - __first) {
38134723edSLouis Dionne             return __first;
39134723edSLouis Dionne         }
40134723edSLouis Dionne         __m += __n;
41134723edSLouis Dionne     } else {
42134723edSLouis Dionne         for (; __n > 0; --__n) {
43134723edSLouis Dionne             if (__m == __last) {
44134723edSLouis Dionne                 return __first;
45134723edSLouis Dionne             }
46134723edSLouis Dionne             ++__m;
47134723edSLouis Dionne         }
48134723edSLouis Dionne     }
49134723edSLouis Dionne     return _VSTD::move(__m, __last, __first);
50134723edSLouis Dionne }
51134723edSLouis Dionne 
52134723edSLouis Dionne #endif // _LIBCPP_STD_VER > 17
53134723edSLouis Dionne 
54134723edSLouis Dionne _LIBCPP_END_NAMESPACE_STD
55134723edSLouis Dionne 
56134723edSLouis Dionne #endif // _LIBCPP___ALGORITHM_SHIFT_LEFT_H
57