60 lines · c
1//===----------------------------------------------------------------------===//2//3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.4// See https://llvm.org/LICENSE.txt for license information.5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception6//7//===----------------------------------------------------------------------===//8 9#ifndef _LIBCPP___ALGORITHM_SHIFT_LEFT_H10#define _LIBCPP___ALGORITHM_SHIFT_LEFT_H11 12#include <__algorithm/move.h>13#include <__config>14#include <__iterator/iterator_traits.h>15 16#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)17# pragma GCC system_header18#endif19 20_LIBCPP_PUSH_MACROS21#include <__undef_macros>22 23_LIBCPP_BEGIN_NAMESPACE_STD24 25#if _LIBCPP_STD_VER >= 2026 27template <class _ForwardIterator>28inline _LIBCPP_HIDE_FROM_ABI constexpr _ForwardIterator29shift_left(_ForwardIterator __first,30 _ForwardIterator __last,31 typename iterator_traits<_ForwardIterator>::difference_type __n) {32 if (__n == 0) {33 return __last;34 }35 36 _ForwardIterator __m = __first;37 if constexpr (__has_random_access_iterator_category<_ForwardIterator>::value) {38 if (__n >= __last - __first) {39 return __first;40 }41 __m += __n;42 } else {43 for (; __n > 0; --__n) {44 if (__m == __last) {45 return __first;46 }47 ++__m;48 }49 }50 return std::move(__m, __last, __first);51}52 53#endif // _LIBCPP_STD_VER >= 2054 55_LIBCPP_END_NAMESPACE_STD56 57_LIBCPP_POP_MACROS58 59#endif // _LIBCPP___ALGORITHM_SHIFT_LEFT_H60