brintos

brintos / llvm-project-archived public Read only

0
0
Text · 1.5 KiB · 06cd7c5 Raw
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