1dcb03dacSrobert //===----------------------------------------------------------------------===// 2dcb03dacSrobert // 3dcb03dacSrobert // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4dcb03dacSrobert // See https://llvm.org/LICENSE.txt for license information. 5dcb03dacSrobert // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6dcb03dacSrobert // 7dcb03dacSrobert //===----------------------------------------------------------------------===// 8dcb03dacSrobert 9dcb03dacSrobert #ifndef _LIBCPP___ALGORITHM_RANGES_FIND_H 10dcb03dacSrobert #define _LIBCPP___ALGORITHM_RANGES_FIND_H 11dcb03dacSrobert 12dcb03dacSrobert #include <__algorithm/ranges_find_if.h> 13dcb03dacSrobert #include <__config> 14dcb03dacSrobert #include <__functional/identity.h> 15dcb03dacSrobert #include <__functional/invoke.h> 16dcb03dacSrobert #include <__functional/ranges_operations.h> 17dcb03dacSrobert #include <__iterator/concepts.h> 18dcb03dacSrobert #include <__iterator/projected.h> 19dcb03dacSrobert #include <__ranges/access.h> 20dcb03dacSrobert #include <__ranges/concepts.h> 21dcb03dacSrobert #include <__ranges/dangling.h> 22dcb03dacSrobert #include <__utility/forward.h> 23dcb03dacSrobert #include <__utility/move.h> 24dcb03dacSrobert 25dcb03dacSrobert #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) 26dcb03dacSrobert # pragma GCC system_header 27dcb03dacSrobert #endif 28dcb03dacSrobert 29*dc37c87aSrobert #if _LIBCPP_STD_VER > 17 30dcb03dacSrobert 31dcb03dacSrobert _LIBCPP_BEGIN_NAMESPACE_STD 32dcb03dacSrobert 33dcb03dacSrobert namespace ranges { 34dcb03dacSrobert namespace __find { 35dcb03dacSrobert struct __fn { 36dcb03dacSrobert template <input_iterator _Ip, sentinel_for<_Ip> _Sp, class _Tp, class _Proj = identity> 37dcb03dacSrobert requires indirect_binary_predicate<ranges::equal_to, projected<_Ip, _Proj>, const _Tp*> 38*dc37c87aSrobert _LIBCPP_NODISCARD_EXT _LIBCPP_HIDE_FROM_ABI constexpr operator__fn39dcb03dacSrobert _Ip operator()(_Ip __first, _Sp __last, const _Tp& __value, _Proj __proj = {}) const { 40dcb03dacSrobert auto __pred = [&](auto&& __e) { return std::forward<decltype(__e)>(__e) == __value; }; 41dcb03dacSrobert return ranges::__find_if_impl(std::move(__first), std::move(__last), __pred, __proj); 42dcb03dacSrobert } 43dcb03dacSrobert 44dcb03dacSrobert template <input_range _Rp, class _Tp, class _Proj = identity> 45dcb03dacSrobert requires indirect_binary_predicate<ranges::equal_to, projected<iterator_t<_Rp>, _Proj>, const _Tp*> 46*dc37c87aSrobert _LIBCPP_NODISCARD_EXT _LIBCPP_HIDE_FROM_ABI constexpr operator__fn47dcb03dacSrobert borrowed_iterator_t<_Rp> operator()(_Rp&& __r, const _Tp& __value, _Proj __proj = {}) const { 48dcb03dacSrobert auto __pred = [&](auto&& __e) { return std::forward<decltype(__e)>(__e) == __value; }; 49dcb03dacSrobert return ranges::__find_if_impl(ranges::begin(__r), ranges::end(__r), __pred, __proj); 50dcb03dacSrobert } 51dcb03dacSrobert }; 52dcb03dacSrobert } // namespace __find 53dcb03dacSrobert 54dcb03dacSrobert inline namespace __cpo { 55dcb03dacSrobert inline constexpr auto find = __find::__fn{}; 56dcb03dacSrobert } // namespace __cpo 57dcb03dacSrobert } // namespace ranges 58dcb03dacSrobert 59dcb03dacSrobert _LIBCPP_END_NAMESPACE_STD 60dcb03dacSrobert 61*dc37c87aSrobert #endif // _LIBCPP_STD_VER > 17 62dcb03dacSrobert 63dcb03dacSrobert #endif // _LIBCPP___ALGORITHM_RANGES_FIND_H 64