xref: /llvm-project/libcxx/include/__algorithm/ranges_set_union.h (revision a2042521a0387d7d7b80b2987f4b21f5a50bc7bb)
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_SET_UNION_H
1073ebcabfSKonstantin Varlamov #define _LIBCPP___ALGORITHM_RANGES_SET_UNION_H
1173ebcabfSKonstantin Varlamov 
1273ebcabfSKonstantin Varlamov #include <__algorithm/in_in_out_result.h>
1373ebcabfSKonstantin Varlamov #include <__algorithm/make_projected.h>
1473ebcabfSKonstantin Varlamov #include <__algorithm/set_union.h>
1573ebcabfSKonstantin Varlamov #include <__config>
1673ebcabfSKonstantin Varlamov #include <__functional/identity.h>
1773ebcabfSKonstantin Varlamov #include <__functional/invoke.h>
1873ebcabfSKonstantin Varlamov #include <__functional/ranges_operations.h>
1973ebcabfSKonstantin Varlamov #include <__iterator/concepts.h>
2073ebcabfSKonstantin Varlamov #include <__iterator/iterator_traits.h>
2173ebcabfSKonstantin Varlamov #include <__iterator/mergeable.h>
2273ebcabfSKonstantin Varlamov #include <__iterator/projected.h>
2373ebcabfSKonstantin Varlamov #include <__ranges/access.h>
2473ebcabfSKonstantin Varlamov #include <__ranges/concepts.h>
2573ebcabfSKonstantin Varlamov #include <__ranges/dangling.h>
2673ebcabfSKonstantin Varlamov #include <__utility/forward.h>
2773ebcabfSKonstantin Varlamov #include <__utility/move.h>
2873ebcabfSKonstantin Varlamov 
2973ebcabfSKonstantin Varlamov #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
3073ebcabfSKonstantin Varlamov #  pragma GCC system_header
3173ebcabfSKonstantin Varlamov #endif
3273ebcabfSKonstantin Varlamov 
337b462251SLouis Dionne _LIBCPP_PUSH_MACROS
347b462251SLouis Dionne #include <__undef_macros>
357b462251SLouis Dionne 
364f15267dSNikolas Klauser #if _LIBCPP_STD_VER >= 20
3773ebcabfSKonstantin Varlamov 
3873ebcabfSKonstantin Varlamov _LIBCPP_BEGIN_NAMESPACE_STD
3973ebcabfSKonstantin Varlamov 
4073ebcabfSKonstantin Varlamov namespace ranges {
4173ebcabfSKonstantin Varlamov 
4273ebcabfSKonstantin Varlamov template <class _InIter1, class _InIter2, class _OutIter>
4373ebcabfSKonstantin Varlamov using set_union_result = in_in_out_result<_InIter1, _InIter2, _OutIter>;
4473ebcabfSKonstantin Varlamov 
45d10dc5a0SChristopher Di Bella struct __set_union {
465aa03b64SLouis Dionne   template <input_iterator _InIter1,
473151b95dSHui Xie             sentinel_for<_InIter1> _Sent1,
483151b95dSHui Xie             input_iterator _InIter2,
493151b95dSHui Xie             sentinel_for<_InIter2> _Sent2,
503151b95dSHui Xie             weakly_incrementable _OutIter,
513151b95dSHui Xie             class _Comp  = ranges::less,
523151b95dSHui Xie             class _Proj1 = identity,
533151b95dSHui Xie             class _Proj2 = identity>
5473ebcabfSKonstantin Varlamov     requires mergeable<_InIter1, _InIter2, _OutIter, _Comp, _Proj1, _Proj2>
553151b95dSHui Xie   _LIBCPP_HIDE_FROM_ABI constexpr set_union_result<_InIter1, _InIter2, _OutIter> operator()(
563151b95dSHui Xie       _InIter1 __first1,
573151b95dSHui Xie       _Sent1 __last1,
583151b95dSHui Xie       _InIter2 __first2,
593151b95dSHui Xie       _Sent2 __last2,
603151b95dSHui Xie       _OutIter __result,
613151b95dSHui Xie       _Comp __comp   = {},
623151b95dSHui Xie       _Proj1 __proj1 = {},
633151b95dSHui Xie       _Proj2 __proj2 = {}) const {
64*a2042521SNikolas Klauser     auto __ret = std::__set_union(
653151b95dSHui Xie         std::move(__first1),
663151b95dSHui Xie         std::move(__last1),
673151b95dSHui Xie         std::move(__first2),
683151b95dSHui Xie         std::move(__last2),
693151b95dSHui Xie         std::move(__result),
703151b95dSHui Xie         ranges::__make_projected_comp(__comp, __proj1, __proj2));
713151b95dSHui Xie     return {std::move(__ret.__in1_), std::move(__ret.__in2_), std::move(__ret.__out_)};
7273ebcabfSKonstantin Varlamov   }
7373ebcabfSKonstantin Varlamov 
745aa03b64SLouis Dionne   template <input_range _Range1,
753151b95dSHui Xie             input_range _Range2,
763151b95dSHui Xie             weakly_incrementable _OutIter,
773151b95dSHui Xie             class _Comp  = ranges::less,
783151b95dSHui Xie             class _Proj1 = identity,
793151b95dSHui Xie             class _Proj2 = identity>
805aa03b64SLouis Dionne     requires mergeable<iterator_t<_Range1>, iterator_t<_Range2>, _OutIter, _Comp, _Proj1, _Proj2>
815aa03b64SLouis Dionne   _LIBCPP_HIDE_FROM_ABI constexpr set_union_result<borrowed_iterator_t<_Range1>, borrowed_iterator_t<_Range2>, _OutIter>
825aa03b64SLouis Dionne   operator()(_Range1&& __range1,
833151b95dSHui Xie              _Range2&& __range2,
843151b95dSHui Xie              _OutIter __result,
853151b95dSHui Xie              _Comp __comp   = {},
863151b95dSHui Xie              _Proj1 __proj1 = {},
873151b95dSHui Xie              _Proj2 __proj2 = {}) const {
88*a2042521SNikolas Klauser     auto __ret = std::__set_union(
893151b95dSHui Xie         ranges::begin(__range1),
903151b95dSHui Xie         ranges::end(__range1),
913151b95dSHui Xie         ranges::begin(__range2),
923151b95dSHui Xie         ranges::end(__range2),
933151b95dSHui Xie         std::move(__result),
943151b95dSHui Xie         ranges::__make_projected_comp(__comp, __proj1, __proj2));
953151b95dSHui Xie     return {std::move(__ret.__in1_), std::move(__ret.__in2_), std::move(__ret.__out_)};
9673ebcabfSKonstantin Varlamov   }
9773ebcabfSKonstantin Varlamov };
9873ebcabfSKonstantin Varlamov 
9973ebcabfSKonstantin Varlamov inline namespace __cpo {
100d10dc5a0SChristopher Di Bella inline constexpr auto set_union = __set_union{};
10173ebcabfSKonstantin Varlamov } // namespace __cpo
10273ebcabfSKonstantin Varlamov } // namespace ranges
10373ebcabfSKonstantin Varlamov 
10473ebcabfSKonstantin Varlamov _LIBCPP_END_NAMESPACE_STD
10573ebcabfSKonstantin Varlamov 
1064f15267dSNikolas Klauser #endif // _LIBCPP_STD_VER >= 20
10773ebcabfSKonstantin Varlamov 
1087b462251SLouis Dionne _LIBCPP_POP_MACROS
1097b462251SLouis Dionne 
11073ebcabfSKonstantin Varlamov #endif // _LIBCPP___ALGORITHM_RANGES_SET_UNION_H
111