1cb14a3feSDimitry Andric //===----------------------------------------------------------------------===// 2cb14a3feSDimitry Andric // 3cb14a3feSDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4cb14a3feSDimitry Andric // See https://llvm.org/LICENSE.txt for license information. 5cb14a3feSDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6cb14a3feSDimitry Andric // 7cb14a3feSDimitry Andric //===----------------------------------------------------------------------===// 8cb14a3feSDimitry Andric 9cb14a3feSDimitry Andric #ifndef _LIBCPP___ALGORITHM_RANGES_CONTAINS_H 10cb14a3feSDimitry Andric #define _LIBCPP___ALGORITHM_RANGES_CONTAINS_H 11cb14a3feSDimitry Andric 12cb14a3feSDimitry Andric #include <__algorithm/ranges_find.h> 13cb14a3feSDimitry Andric #include <__config> 14cb14a3feSDimitry Andric #include <__functional/identity.h> 15cb14a3feSDimitry Andric #include <__functional/ranges_operations.h> 16cb14a3feSDimitry Andric #include <__functional/reference_wrapper.h> 17cb14a3feSDimitry Andric #include <__iterator/concepts.h> 18cb14a3feSDimitry Andric #include <__iterator/indirectly_comparable.h> 19cb14a3feSDimitry Andric #include <__iterator/projected.h> 20cb14a3feSDimitry Andric #include <__ranges/access.h> 21cb14a3feSDimitry Andric #include <__ranges/concepts.h> 22cb14a3feSDimitry Andric #include <__utility/move.h> 23cb14a3feSDimitry Andric 24cb14a3feSDimitry Andric #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) 25cb14a3feSDimitry Andric # pragma GCC system_header 26cb14a3feSDimitry Andric #endif 27cb14a3feSDimitry Andric 28b3edf446SDimitry Andric _LIBCPP_PUSH_MACROS 29b3edf446SDimitry Andric #include <__undef_macros> 30b3edf446SDimitry Andric 31cb14a3feSDimitry Andric #if _LIBCPP_STD_VER >= 23 32cb14a3feSDimitry Andric 33cb14a3feSDimitry Andric _LIBCPP_BEGIN_NAMESPACE_STD 34cb14a3feSDimitry Andric 35cb14a3feSDimitry Andric namespace ranges { 36cb14a3feSDimitry Andric namespace __contains { 37cb14a3feSDimitry Andric struct __fn { 38cb14a3feSDimitry Andric template <input_iterator _Iter, sentinel_for<_Iter> _Sent, class _Type, class _Proj = identity> 39cb14a3feSDimitry Andric requires indirect_binary_predicate<ranges::equal_to, projected<_Iter, _Proj>, const _Type*> 40*0fca6ea1SDimitry Andric [[nodiscard]] _LIBCPP_HIDE_FROM_ABI constexpr bool static 41cb14a3feSDimitry Andric operator()(_Iter __first, _Sent __last, const _Type& __value, _Proj __proj = {}) { 42cb14a3feSDimitry Andric return ranges::find(std::move(__first), __last, __value, std::ref(__proj)) != __last; 43cb14a3feSDimitry Andric } 44cb14a3feSDimitry Andric 45cb14a3feSDimitry Andric template <input_range _Range, class _Type, class _Proj = identity> 46cb14a3feSDimitry Andric requires indirect_binary_predicate<ranges::equal_to, projected<iterator_t<_Range>, _Proj>, const _Type*> 47*0fca6ea1SDimitry Andric [[nodiscard]] _LIBCPP_HIDE_FROM_ABI constexpr bool static 48cb14a3feSDimitry Andric operator()(_Range&& __range, const _Type& __value, _Proj __proj = {}) { 49cb14a3feSDimitry Andric return ranges::find(ranges::begin(__range), ranges::end(__range), __value, std::ref(__proj)) != 50cb14a3feSDimitry Andric ranges::end(__range); 51cb14a3feSDimitry Andric } 52cb14a3feSDimitry Andric }; 53cb14a3feSDimitry Andric } // namespace __contains 54cb14a3feSDimitry Andric 55cb14a3feSDimitry Andric inline namespace __cpo { 56cb14a3feSDimitry Andric inline constexpr auto contains = __contains::__fn{}; 57cb14a3feSDimitry Andric } // namespace __cpo 58cb14a3feSDimitry Andric } // namespace ranges 59cb14a3feSDimitry Andric 60cb14a3feSDimitry Andric _LIBCPP_END_NAMESPACE_STD 61cb14a3feSDimitry Andric 62cb14a3feSDimitry Andric #endif // _LIBCPP_STD_VER >= 23 63cb14a3feSDimitry Andric 64b3edf446SDimitry Andric _LIBCPP_POP_MACROS 65b3edf446SDimitry Andric 66cb14a3feSDimitry Andric #endif // _LIBCPP___ALGORITHM_RANGES_CONTAINS_H 67