176d0caaeSpatrick //===----------------------------------------------------------------------===// 276d0caaeSpatrick // 376d0caaeSpatrick // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 476d0caaeSpatrick // See https://llvm.org/LICENSE.txt for license information. 576d0caaeSpatrick // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 676d0caaeSpatrick // 776d0caaeSpatrick //===----------------------------------------------------------------------===// 876d0caaeSpatrick 976d0caaeSpatrick #ifndef _LIBCPP___ALGORITHM_SHIFT_LEFT_H 1076d0caaeSpatrick #define _LIBCPP___ALGORITHM_SHIFT_LEFT_H 1176d0caaeSpatrick 1276d0caaeSpatrick #include <__algorithm/move.h> 13*4bdff4beSrobert #include <__config> 1476d0caaeSpatrick #include <__iterator/iterator_traits.h> 15*4bdff4beSrobert #include <type_traits> 1676d0caaeSpatrick 1776d0caaeSpatrick #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) 1876d0caaeSpatrick # pragma GCC system_header 1976d0caaeSpatrick #endif 2076d0caaeSpatrick 2176d0caaeSpatrick _LIBCPP_BEGIN_NAMESPACE_STD 2276d0caaeSpatrick 2376d0caaeSpatrick #if _LIBCPP_STD_VER > 17 2476d0caaeSpatrick 2576d0caaeSpatrick template <class _ForwardIterator> 2676d0caaeSpatrick inline _LIBCPP_INLINE_VISIBILITY constexpr 2776d0caaeSpatrick _ForwardIterator shift_left(_ForwardIterator __first,_ForwardIterator __last,typename iterator_traits<_ForwardIterator>::difference_type __n)2876d0caaeSpatrickshift_left(_ForwardIterator __first, _ForwardIterator __last, 2976d0caaeSpatrick typename iterator_traits<_ForwardIterator>::difference_type __n) 3076d0caaeSpatrick { 3176d0caaeSpatrick if (__n == 0) { 3276d0caaeSpatrick return __last; 3376d0caaeSpatrick } 3476d0caaeSpatrick 3576d0caaeSpatrick _ForwardIterator __m = __first; 3676d0caaeSpatrick if constexpr (__is_cpp17_random_access_iterator<_ForwardIterator>::value) { 3776d0caaeSpatrick if (__n >= __last - __first) { 3876d0caaeSpatrick return __first; 3976d0caaeSpatrick } 4076d0caaeSpatrick __m += __n; 4176d0caaeSpatrick } else { 4276d0caaeSpatrick for (; __n > 0; --__n) { 4376d0caaeSpatrick if (__m == __last) { 4476d0caaeSpatrick return __first; 4576d0caaeSpatrick } 4676d0caaeSpatrick ++__m; 4776d0caaeSpatrick } 4876d0caaeSpatrick } 4976d0caaeSpatrick return _VSTD::move(__m, __last, __first); 5076d0caaeSpatrick } 5176d0caaeSpatrick 5276d0caaeSpatrick #endif // _LIBCPP_STD_VER > 17 5376d0caaeSpatrick 5476d0caaeSpatrick _LIBCPP_END_NAMESPACE_STD 5576d0caaeSpatrick 5676d0caaeSpatrick #endif // _LIBCPP___ALGORITHM_SHIFT_LEFT_H 57