1e78f53d1SNikolas Klauser //===----------------------------------------------------------------------===// 2e78f53d1SNikolas Klauser // 3e78f53d1SNikolas Klauser // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4e78f53d1SNikolas Klauser // See https://llvm.org/LICENSE.txt for license information. 5e78f53d1SNikolas Klauser // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6e78f53d1SNikolas Klauser // 7e78f53d1SNikolas Klauser //===----------------------------------------------------------------------===// 8e78f53d1SNikolas Klauser 9*ce777190SNikolas Klauser #ifndef _LIBCPP___CXX03___ALGORITHM_INCLUDES_H 10*ce777190SNikolas Klauser #define _LIBCPP___CXX03___ALGORITHM_INCLUDES_H 11e78f53d1SNikolas Klauser 1273fbae83SNikolas Klauser #include <__cxx03/__algorithm/comp.h> 1373fbae83SNikolas Klauser #include <__cxx03/__algorithm/comp_ref_type.h> 1473fbae83SNikolas Klauser #include <__cxx03/__config> 1573fbae83SNikolas Klauser #include <__cxx03/__functional/identity.h> 1673fbae83SNikolas Klauser #include <__cxx03/__functional/invoke.h> 1773fbae83SNikolas Klauser #include <__cxx03/__iterator/iterator_traits.h> 1873fbae83SNikolas Klauser #include <__cxx03/__type_traits/is_callable.h> 1973fbae83SNikolas Klauser #include <__cxx03/__utility/move.h> 20e78f53d1SNikolas Klauser 21e78f53d1SNikolas Klauser #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) 22e78f53d1SNikolas Klauser # pragma GCC system_header 23e78f53d1SNikolas Klauser #endif 24e78f53d1SNikolas Klauser 25e78f53d1SNikolas Klauser _LIBCPP_PUSH_MACROS 2673fbae83SNikolas Klauser #include <__cxx03/__undef_macros> 27e78f53d1SNikolas Klauser 28e78f53d1SNikolas Klauser _LIBCPP_BEGIN_NAMESPACE_STD 29e78f53d1SNikolas Klauser 30e78f53d1SNikolas Klauser template <class _Iter1, class _Sent1, class _Iter2, class _Sent2, class _Comp, class _Proj1, class _Proj2> 31e78f53d1SNikolas Klauser _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 bool __includes( 32e78f53d1SNikolas Klauser _Iter1 __first1, 33e78f53d1SNikolas Klauser _Sent1 __last1, 34e78f53d1SNikolas Klauser _Iter2 __first2, 35e78f53d1SNikolas Klauser _Sent2 __last2, 36e78f53d1SNikolas Klauser _Comp&& __comp, 37e78f53d1SNikolas Klauser _Proj1&& __proj1, 38e78f53d1SNikolas Klauser _Proj2&& __proj2) { 39e78f53d1SNikolas Klauser for (; __first2 != __last2; ++__first1) { 40e78f53d1SNikolas Klauser if (__first1 == __last1 || 41e78f53d1SNikolas Klauser std::__invoke(__comp, std::__invoke(__proj2, *__first2), std::__invoke(__proj1, *__first1))) 42e78f53d1SNikolas Klauser return false; 43e78f53d1SNikolas Klauser if (!std::__invoke(__comp, std::__invoke(__proj1, *__first1), std::__invoke(__proj2, *__first2))) 44e78f53d1SNikolas Klauser ++__first2; 45e78f53d1SNikolas Klauser } 46e78f53d1SNikolas Klauser return true; 47e78f53d1SNikolas Klauser } 48e78f53d1SNikolas Klauser 49e78f53d1SNikolas Klauser template <class _InputIterator1, class _InputIterator2, class _Compare> 50e78f53d1SNikolas Klauser _LIBCPP_NODISCARD inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 bool 51e78f53d1SNikolas Klauser includes(_InputIterator1 __first1, 52e78f53d1SNikolas Klauser _InputIterator1 __last1, 53e78f53d1SNikolas Klauser _InputIterator2 __first2, 54e78f53d1SNikolas Klauser _InputIterator2 __last2, 55e78f53d1SNikolas Klauser _Compare __comp) { 56e78f53d1SNikolas Klauser static_assert( 57e78f53d1SNikolas Klauser __is_callable<_Compare, decltype(*__first1), decltype(*__first2)>::value, "Comparator has to be callable"); 58e78f53d1SNikolas Klauser 59e78f53d1SNikolas Klauser return std::__includes( 60e78f53d1SNikolas Klauser std::move(__first1), 61e78f53d1SNikolas Klauser std::move(__last1), 62e78f53d1SNikolas Klauser std::move(__first2), 63e78f53d1SNikolas Klauser std::move(__last2), 64e78f53d1SNikolas Klauser static_cast<__comp_ref_type<_Compare> >(__comp), 65e78f53d1SNikolas Klauser __identity(), 66e78f53d1SNikolas Klauser __identity()); 67e78f53d1SNikolas Klauser } 68e78f53d1SNikolas Klauser 69e78f53d1SNikolas Klauser template <class _InputIterator1, class _InputIterator2> 70e78f53d1SNikolas Klauser _LIBCPP_NODISCARD inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 bool 71e78f53d1SNikolas Klauser includes(_InputIterator1 __first1, _InputIterator1 __last1, _InputIterator2 __first2, _InputIterator2 __last2) { 72e78f53d1SNikolas Klauser return std::includes(std::move(__first1), std::move(__last1), std::move(__first2), std::move(__last2), __less<>()); 73e78f53d1SNikolas Klauser } 74e78f53d1SNikolas Klauser 75e78f53d1SNikolas Klauser _LIBCPP_END_NAMESPACE_STD 76e78f53d1SNikolas Klauser 77e78f53d1SNikolas Klauser _LIBCPP_POP_MACROS 78e78f53d1SNikolas Klauser 79*ce777190SNikolas Klauser #endif // _LIBCPP___CXX03___ALGORITHM_INCLUDES_H 80