brintos

brintos / llvm-project-archived public Read only

0
0
Text · 2.7 KiB · 1eac4cf Raw
79 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_RANGES_FIND_H10#define _LIBCPP___ALGORITHM_RANGES_FIND_H11 12#include <__algorithm/find.h>13#include <__algorithm/ranges_find_if.h>14#include <__algorithm/unwrap_range.h>15#include <__config>16#include <__functional/identity.h>17#include <__functional/invoke.h>18#include <__functional/ranges_operations.h>19#include <__iterator/concepts.h>20#include <__iterator/projected.h>21#include <__ranges/access.h>22#include <__ranges/concepts.h>23#include <__ranges/dangling.h>24#include <__utility/forward.h>25#include <__utility/move.h>26 27#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)28#  pragma GCC system_header29#endif30 31_LIBCPP_PUSH_MACROS32#include <__undef_macros>33 34#if _LIBCPP_STD_VER >= 2035 36_LIBCPP_BEGIN_NAMESPACE_STD37 38namespace ranges {39struct __find {40  template <class _Iter, class _Sent, class _Tp, class _Proj>41  _LIBCPP_HIDE_FROM_ABI static constexpr _Iter42  __find_unwrap(_Iter __first, _Sent __last, const _Tp& __value, _Proj& __proj) {43    if constexpr (forward_iterator<_Iter>) {44      auto [__first_un, __last_un] = std::__unwrap_range(__first, std::move(__last));45      return std::__rewrap_range<_Sent>(46          std::move(__first), std::__find(std::move(__first_un), std::move(__last_un), __value, __proj));47    } else {48      return std::__find(std::move(__first), std::move(__last), __value, __proj);49    }50  }51 52  template <input_iterator _Ip, sentinel_for<_Ip> _Sp, class _Tp, class _Proj = identity>53    requires indirect_binary_predicate<ranges::equal_to, projected<_Ip, _Proj>, const _Tp*>54  [[nodiscard]] _LIBCPP_HIDE_FROM_ABI constexpr _Ip55  operator()(_Ip __first, _Sp __last, const _Tp& __value, _Proj __proj = {}) const {56    return __find_unwrap(std::move(__first), std::move(__last), __value, __proj);57  }58 59  template <input_range _Rp, class _Tp, class _Proj = identity>60    requires indirect_binary_predicate<ranges::equal_to, projected<iterator_t<_Rp>, _Proj>, const _Tp*>61  [[nodiscard]] _LIBCPP_HIDE_FROM_ABI constexpr borrowed_iterator_t<_Rp>62  operator()(_Rp&& __r, const _Tp& __value, _Proj __proj = {}) const {63    return __find_unwrap(ranges::begin(__r), ranges::end(__r), __value, __proj);64  }65};66 67inline namespace __cpo {68inline constexpr auto find = __find{};69} // namespace __cpo70} // namespace ranges71 72_LIBCPP_END_NAMESPACE_STD73 74#endif // _LIBCPP_STD_VER >= 2075 76_LIBCPP_POP_MACROS77 78#endif // _LIBCPP___ALGORITHM_RANGES_FIND_H79