106c3fb27SDimitry Andric //===----------------------------------------------------------------------===// 206c3fb27SDimitry Andric // 306c3fb27SDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 406c3fb27SDimitry Andric // See https://llvm.org/LICENSE.txt for license information. 506c3fb27SDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 606c3fb27SDimitry Andric // 706c3fb27SDimitry Andric //===----------------------------------------------------------------------===// 806c3fb27SDimitry Andric 906c3fb27SDimitry Andric #ifndef _LIBCPP___ALGORITHM_RANGES_STARTS_WITH_H 1006c3fb27SDimitry Andric #define _LIBCPP___ALGORITHM_RANGES_STARTS_WITH_H 1106c3fb27SDimitry Andric 1206c3fb27SDimitry Andric #include <__algorithm/in_in_result.h> 1306c3fb27SDimitry Andric #include <__algorithm/ranges_mismatch.h> 1406c3fb27SDimitry Andric #include <__config> 1506c3fb27SDimitry Andric #include <__functional/identity.h> 1606c3fb27SDimitry Andric #include <__functional/ranges_operations.h> 1706c3fb27SDimitry Andric #include <__iterator/concepts.h> 1806c3fb27SDimitry Andric #include <__iterator/indirectly_comparable.h> 1906c3fb27SDimitry Andric #include <__ranges/access.h> 2006c3fb27SDimitry Andric #include <__ranges/concepts.h> 2106c3fb27SDimitry Andric #include <__utility/move.h> 2206c3fb27SDimitry Andric 2306c3fb27SDimitry Andric #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) 2406c3fb27SDimitry Andric # pragma GCC system_header 2506c3fb27SDimitry Andric #endif 2606c3fb27SDimitry Andric 27b3edf446SDimitry Andric _LIBCPP_PUSH_MACROS 28b3edf446SDimitry Andric #include <__undef_macros> 29b3edf446SDimitry Andric 3006c3fb27SDimitry Andric #if _LIBCPP_STD_VER >= 23 3106c3fb27SDimitry Andric 3206c3fb27SDimitry Andric _LIBCPP_BEGIN_NAMESPACE_STD 3306c3fb27SDimitry Andric 3406c3fb27SDimitry Andric namespace ranges { 3506c3fb27SDimitry Andric namespace __starts_with { 3606c3fb27SDimitry Andric struct __fn { 3706c3fb27SDimitry Andric template <input_iterator _Iter1, 3806c3fb27SDimitry Andric sentinel_for<_Iter1> _Sent1, 3906c3fb27SDimitry Andric input_iterator _Iter2, 4006c3fb27SDimitry Andric sentinel_for<_Iter2> _Sent2, 4106c3fb27SDimitry Andric class _Pred = ranges::equal_to, 4206c3fb27SDimitry Andric class _Proj1 = identity, 4306c3fb27SDimitry Andric class _Proj2 = identity> 4406c3fb27SDimitry Andric requires indirectly_comparable<_Iter1, _Iter2, _Pred, _Proj1, _Proj2> 45*0fca6ea1SDimitry Andric [[nodiscard]] _LIBCPP_HIDE_FROM_ABI static constexpr bool operator()( 4606c3fb27SDimitry Andric _Iter1 __first1, 4706c3fb27SDimitry Andric _Sent1 __last1, 4806c3fb27SDimitry Andric _Iter2 __first2, 4906c3fb27SDimitry Andric _Sent2 __last2, 5006c3fb27SDimitry Andric _Pred __pred = {}, 5106c3fb27SDimitry Andric _Proj1 __proj1 = {}, 52*0fca6ea1SDimitry Andric _Proj2 __proj2 = {}) { 5306c3fb27SDimitry Andric return __mismatch::__fn::__go( 5406c3fb27SDimitry Andric std::move(__first1), 5506c3fb27SDimitry Andric std::move(__last1), 5606c3fb27SDimitry Andric std::move(__first2), 5706c3fb27SDimitry Andric std::move(__last2), 5806c3fb27SDimitry Andric __pred, 5906c3fb27SDimitry Andric __proj1, 6006c3fb27SDimitry Andric __proj2) 6106c3fb27SDimitry Andric .in2 == __last2; 6206c3fb27SDimitry Andric } 6306c3fb27SDimitry Andric 6406c3fb27SDimitry Andric template <input_range _Range1, 6506c3fb27SDimitry Andric input_range _Range2, 6606c3fb27SDimitry Andric class _Pred = ranges::equal_to, 6706c3fb27SDimitry Andric class _Proj1 = identity, 6806c3fb27SDimitry Andric class _Proj2 = identity> 6906c3fb27SDimitry Andric requires indirectly_comparable<iterator_t<_Range1>, iterator_t<_Range2>, _Pred, _Proj1, _Proj2> 70*0fca6ea1SDimitry Andric [[nodiscard]] _LIBCPP_HIDE_FROM_ABI static constexpr bool 71*0fca6ea1SDimitry Andric operator()(_Range1&& __range1, _Range2&& __range2, _Pred __pred = {}, _Proj1 __proj1 = {}, _Proj2 __proj2 = {}) { 7206c3fb27SDimitry Andric return __mismatch::__fn::__go( 7306c3fb27SDimitry Andric ranges::begin(__range1), 7406c3fb27SDimitry Andric ranges::end(__range1), 7506c3fb27SDimitry Andric ranges::begin(__range2), 7606c3fb27SDimitry Andric ranges::end(__range2), 7706c3fb27SDimitry Andric __pred, 7806c3fb27SDimitry Andric __proj1, 7906c3fb27SDimitry Andric __proj2) 8006c3fb27SDimitry Andric .in2 == ranges::end(__range2); 8106c3fb27SDimitry Andric } 8206c3fb27SDimitry Andric }; 8306c3fb27SDimitry Andric } // namespace __starts_with 8406c3fb27SDimitry Andric inline namespace __cpo { 8506c3fb27SDimitry Andric inline constexpr auto starts_with = __starts_with::__fn{}; 8606c3fb27SDimitry Andric } // namespace __cpo 8706c3fb27SDimitry Andric } // namespace ranges 8806c3fb27SDimitry Andric 8906c3fb27SDimitry Andric _LIBCPP_END_NAMESPACE_STD 9006c3fb27SDimitry Andric 9106c3fb27SDimitry Andric #endif // _LIBCPP_STD_VER >= 23 9206c3fb27SDimitry Andric 93b3edf446SDimitry Andric _LIBCPP_POP_MACROS 94b3edf446SDimitry Andric 9506c3fb27SDimitry Andric #endif // _LIBCPP___ALGORITHM_RANGES_STARTS_WITH_H 96