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 Dionneshift_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