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-exception 6// 7//===----------------------------------------------------------------------===// 8 9#ifndef _LIBCPP___ALGORITHM_PSTL_FIND_H 10#define _LIBCPP___ALGORITHM_PSTL_FIND_H 11 12#include <__algorithm/comp.h> 13#include <__algorithm/find.h> 14#include <__algorithm/pstl_backend.h> 15#include <__algorithm/pstl_frontend_dispatch.h> 16#include <__config> 17#include <__iterator/cpp17_iterator_concepts.h> 18#include <__type_traits/enable_if.h> 19#include <__type_traits/is_execution_policy.h> 20#include <__type_traits/remove_cvref.h> 21#include <__utility/move.h> 22#include <optional> 23 24#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) 25# pragma GCC system_header 26#endif 27 28_LIBCPP_PUSH_MACROS 29#include <__undef_macros> 30 31#if !defined(_LIBCPP_HAS_NO_INCOMPLETE_PSTL) && _LIBCPP_STD_VER >= 17 32 33_LIBCPP_BEGIN_NAMESPACE_STD 34 35template <class _ExecutionPolicy, 36 class _ForwardIterator, 37 class _Predicate, 38 class _RawPolicy = __remove_cvref_t<_ExecutionPolicy>, 39 enable_if_t<is_execution_policy_v<_RawPolicy>, int> = 0> 40[[nodiscard]] _LIBCPP_HIDE_FROM_ABI optional<__remove_cvref_t<_ForwardIterator>> 41__find_if(_ExecutionPolicy&&, _ForwardIterator&& __first, _ForwardIterator&& __last, _Predicate&& __pred) noexcept { 42 using _Backend = typename __select_backend<_RawPolicy>::type; 43 return std::__pstl_find_if<_RawPolicy>(_Backend{}, std::move(__first), std::move(__last), std::move(__pred)); 44} 45 46template <class _ExecutionPolicy, 47 class _ForwardIterator, 48 class _Predicate, 49 class _RawPolicy = __remove_cvref_t<_ExecutionPolicy>, 50 enable_if_t<is_execution_policy_v<_RawPolicy>, int> = 0> 51_LIBCPP_HIDE_FROM_ABI _ForwardIterator 52find_if(_ExecutionPolicy&& __policy, _ForwardIterator __first, _ForwardIterator __last, _Predicate __pred) { 53 _LIBCPP_REQUIRE_CPP17_FORWARD_ITERATOR(_ForwardIterator); 54 auto __res = std::__find_if(__policy, std::move(__first), std::move(__last), std::move(__pred)); 55 if (!__res) 56 std::__throw_bad_alloc(); 57 return *std::move(__res); 58} 59 60template <class> 61void __pstl_find_if_not(); 62 63template <class _ExecutionPolicy, 64 class _ForwardIterator, 65 class _Predicate, 66 class _RawPolicy = __remove_cvref_t<_ExecutionPolicy>, 67 enable_if_t<is_execution_policy_v<_RawPolicy>, int> = 0> 68[[nodiscard]] _LIBCPP_HIDE_FROM_ABI optional<__remove_cvref_t<_ForwardIterator>> 69__find_if_not(_ExecutionPolicy&& __policy, _ForwardIterator&& __first, _ForwardIterator&& __last, _Predicate&& __pred) { 70 return std::__pstl_frontend_dispatch( 71 _LIBCPP_PSTL_CUSTOMIZATION_POINT(__pstl_find_if_not, _RawPolicy), 72 [&](_ForwardIterator&& __g_first, _ForwardIterator&& __g_last, _Predicate&& __g_pred) 73 -> optional<__remove_cvref_t<_ForwardIterator>> { 74 return std::__find_if( 75 __policy, __g_first, __g_last, [&](__iter_reference<__remove_cvref_t<_ForwardIterator>> __value) { 76 return !__g_pred(__value); 77 }); 78 }, 79 std::move(__first), 80 std::move(__last), 81 std::move(__pred)); 82} 83 84template <class _ExecutionPolicy, 85 class _ForwardIterator, 86 class _Predicate, 87 class _RawPolicy = __remove_cvref_t<_ExecutionPolicy>, 88 enable_if_t<is_execution_policy_v<_RawPolicy>, int> = 0> 89_LIBCPP_HIDE_FROM_ABI _ForwardIterator 90find_if_not(_ExecutionPolicy&& __policy, _ForwardIterator __first, _ForwardIterator __last, _Predicate __pred) { 91 _LIBCPP_REQUIRE_CPP17_FORWARD_ITERATOR(_ForwardIterator); 92 auto __res = std::__find_if_not(__policy, std::move(__first), std::move(__last), std::move(__pred)); 93 if (!__res) 94 std::__throw_bad_alloc(); 95 return *std::move(__res); 96} 97 98template <class> 99void __pstl_find(); 100 101template <class _ExecutionPolicy, 102 class _ForwardIterator, 103 class _Tp, 104 class _RawPolicy = __remove_cvref_t<_ExecutionPolicy>, 105 enable_if_t<is_execution_policy_v<_RawPolicy>, int> = 0> 106[[nodiscard]] _LIBCPP_HIDE_FROM_ABI optional<__remove_cvref_t<_ForwardIterator>> 107__find(_ExecutionPolicy&& __policy, _ForwardIterator __first, _ForwardIterator __last, const _Tp& __value) noexcept { 108 return std::__pstl_frontend_dispatch( 109 _LIBCPP_PSTL_CUSTOMIZATION_POINT(__pstl_find, _RawPolicy), 110 [&](_ForwardIterator __g_first, _ForwardIterator __g_last, const _Tp& __g_value) -> optional<_ForwardIterator> { 111 return std::find_if( 112 __policy, __g_first, __g_last, [&](__iter_reference<__remove_cvref_t<_ForwardIterator>> __element) { 113 return __element == __g_value; 114 }); 115 }, 116 std::move(__first), 117 std::move(__last), 118 __value); 119} 120 121template <class _ExecutionPolicy, 122 class _ForwardIterator, 123 class _Tp, 124 class _RawPolicy = __remove_cvref_t<_ExecutionPolicy>, 125 enable_if_t<is_execution_policy_v<_RawPolicy>, int> = 0> 126_LIBCPP_HIDE_FROM_ABI _ForwardIterator 127find(_ExecutionPolicy&& __policy, _ForwardIterator __first, _ForwardIterator __last, const _Tp& __value) { 128 _LIBCPP_REQUIRE_CPP17_FORWARD_ITERATOR(_ForwardIterator); 129 auto __res = std::__find(__policy, std::move(__first), std::move(__last), __value); 130 if (!__res) 131 std::__throw_bad_alloc(); 132 return *std::move(__res); 133} 134 135_LIBCPP_END_NAMESPACE_STD 136 137#endif // !defined(_LIBCPP_HAS_NO_INCOMPLETE_PSTL) && _LIBCPP_STD_VER >= 17 138 139_LIBCPP_POP_MACROS 140 141#endif // _LIBCPP___ALGORITHM_PSTL_FIND_H 142