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