xref: /llvm-project/libcxx/include/__algorithm/ranges_includes.h (revision d10dc5a06fac4dcabf2264c64c8672c6f6ae36fb)
173ebcabfSKonstantin Varlamov //===----------------------------------------------------------------------===//
273ebcabfSKonstantin Varlamov //
373ebcabfSKonstantin Varlamov // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
473ebcabfSKonstantin Varlamov // See https://llvm.org/LICENSE.txt for license information.
573ebcabfSKonstantin Varlamov // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
673ebcabfSKonstantin Varlamov //
773ebcabfSKonstantin Varlamov //===----------------------------------------------------------------------===//
873ebcabfSKonstantin Varlamov 
973ebcabfSKonstantin Varlamov #ifndef _LIBCPP___ALGORITHM_RANGES_INCLUDES_H
1073ebcabfSKonstantin Varlamov #define _LIBCPP___ALGORITHM_RANGES_INCLUDES_H
1173ebcabfSKonstantin Varlamov 
1273ebcabfSKonstantin Varlamov #include <__algorithm/includes.h>
13c559964dSHui Xie #include <__algorithm/make_projected.h>
1473ebcabfSKonstantin Varlamov #include <__config>
1573ebcabfSKonstantin Varlamov #include <__functional/identity.h>
1673ebcabfSKonstantin Varlamov #include <__functional/invoke.h>
1773ebcabfSKonstantin Varlamov #include <__functional/ranges_operations.h>
1873ebcabfSKonstantin Varlamov #include <__iterator/concepts.h>
1973ebcabfSKonstantin Varlamov #include <__iterator/iterator_traits.h>
2073ebcabfSKonstantin Varlamov #include <__iterator/projected.h>
2173ebcabfSKonstantin Varlamov #include <__ranges/access.h>
2273ebcabfSKonstantin Varlamov #include <__ranges/concepts.h>
2373ebcabfSKonstantin Varlamov #include <__utility/forward.h>
2473ebcabfSKonstantin Varlamov #include <__utility/move.h>
2573ebcabfSKonstantin Varlamov 
2673ebcabfSKonstantin Varlamov #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
2773ebcabfSKonstantin Varlamov #  pragma GCC system_header
2873ebcabfSKonstantin Varlamov #endif
2973ebcabfSKonstantin Varlamov 
307b462251SLouis Dionne _LIBCPP_PUSH_MACROS
317b462251SLouis Dionne #include <__undef_macros>
327b462251SLouis Dionne 
334f15267dSNikolas Klauser #if _LIBCPP_STD_VER >= 20
3473ebcabfSKonstantin Varlamov 
3573ebcabfSKonstantin Varlamov _LIBCPP_BEGIN_NAMESPACE_STD
3673ebcabfSKonstantin Varlamov 
3773ebcabfSKonstantin Varlamov namespace ranges {
38*d10dc5a0SChristopher Di Bella struct __includes {
395aa03b64SLouis Dionne   template <input_iterator _Iter1,
40c559964dSHui Xie             sentinel_for<_Iter1> _Sent1,
41c559964dSHui Xie             input_iterator _Iter2,
42c559964dSHui Xie             sentinel_for<_Iter2> _Sent2,
43c559964dSHui Xie             class _Proj1                                                                           = identity,
44c559964dSHui Xie             class _Proj2                                                                           = identity,
4573ebcabfSKonstantin Varlamov             indirect_strict_weak_order<projected<_Iter1, _Proj1>, projected<_Iter2, _Proj2>> _Comp = ranges::less>
4683bc7b57SNikolas Klauser   [[nodiscard]] _LIBCPP_HIDE_FROM_ABI constexpr bool operator()(
47c559964dSHui Xie       _Iter1 __first1,
48c559964dSHui Xie       _Sent1 __last1,
49c559964dSHui Xie       _Iter2 __first2,
50c559964dSHui Xie       _Sent2 __last2,
51c559964dSHui Xie       _Comp __comp   = {},
52c559964dSHui Xie       _Proj1 __proj1 = {},
53c559964dSHui Xie       _Proj2 __proj2 = {}) const {
54c559964dSHui Xie     return std::__includes(
55c559964dSHui Xie         std::move(__first1),
56c559964dSHui Xie         std::move(__last1),
57c559964dSHui Xie         std::move(__first2),
58c559964dSHui Xie         std::move(__last2),
59964aeb71SKonstantin Varlamov         std::move(__comp),
60964aeb71SKonstantin Varlamov         std::move(__proj1),
61964aeb71SKonstantin Varlamov         std::move(__proj2));
6273ebcabfSKonstantin Varlamov   }
6373ebcabfSKonstantin Varlamov 
645aa03b64SLouis Dionne   template <input_range _Range1,
65c559964dSHui Xie             input_range _Range2,
66c559964dSHui Xie             class _Proj1 = identity,
67c559964dSHui Xie             class _Proj2 = identity,
68c559964dSHui Xie             indirect_strict_weak_order<projected<iterator_t<_Range1>, _Proj1>, projected<iterator_t<_Range2>, _Proj2>>
69c559964dSHui Xie                 _Comp = ranges::less>
7083bc7b57SNikolas Klauser   [[nodiscard]] _LIBCPP_HIDE_FROM_ABI constexpr bool operator()(
71c559964dSHui Xie       _Range1&& __range1, _Range2&& __range2, _Comp __comp = {}, _Proj1 __proj1 = {}, _Proj2 __proj2 = {}) const {
72c559964dSHui Xie     return std::__includes(
73c559964dSHui Xie         ranges::begin(__range1),
74c559964dSHui Xie         ranges::end(__range1),
75c559964dSHui Xie         ranges::begin(__range2),
76c559964dSHui Xie         ranges::end(__range2),
77964aeb71SKonstantin Varlamov         std::move(__comp),
78964aeb71SKonstantin Varlamov         std::move(__proj1),
79964aeb71SKonstantin Varlamov         std::move(__proj2));
8073ebcabfSKonstantin Varlamov   }
8173ebcabfSKonstantin Varlamov };
8273ebcabfSKonstantin Varlamov 
8373ebcabfSKonstantin Varlamov inline namespace __cpo {
84*d10dc5a0SChristopher Di Bella inline constexpr auto includes = __includes{};
8573ebcabfSKonstantin Varlamov } // namespace __cpo
8673ebcabfSKonstantin Varlamov } // namespace ranges
8773ebcabfSKonstantin Varlamov 
8873ebcabfSKonstantin Varlamov _LIBCPP_END_NAMESPACE_STD
8973ebcabfSKonstantin Varlamov 
904f15267dSNikolas Klauser #endif // _LIBCPP_STD_VER >= 20
9173ebcabfSKonstantin Varlamov 
927b462251SLouis Dionne _LIBCPP_POP_MACROS
937b462251SLouis Dionne 
9473ebcabfSKonstantin Varlamov #endif // _LIBCPP___ALGORITHM_RANGES_INCLUDES_H
95