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