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