1134723edSLouis Dionne //===----------------------------------------------------------------------===// 2134723edSLouis Dionne // 3134723edSLouis Dionne // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4134723edSLouis Dionne // See https://llvm.org/LICENSE.txt for license information. 5134723edSLouis Dionne // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6134723edSLouis Dionne // 7134723edSLouis Dionne //===----------------------------------------------------------------------===// 8134723edSLouis Dionne 9134723edSLouis Dionne #ifndef _LIBCPP___ALGORITHM_MERGE_H 10134723edSLouis Dionne #define _LIBCPP___ALGORITHM_MERGE_H 11134723edSLouis Dionne 12134723edSLouis Dionne #include <__algorithm/comp.h> 13134723edSLouis Dionne #include <__algorithm/comp_ref_type.h> 14134723edSLouis Dionne #include <__algorithm/copy.h> 154d81a46fSArthur O'Dwyer #include <__config> 16134723edSLouis Dionne 17134723edSLouis Dionne #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) 18134723edSLouis Dionne # pragma GCC system_header 19134723edSLouis Dionne #endif 20134723edSLouis Dionne 21134723edSLouis Dionne _LIBCPP_BEGIN_NAMESPACE_STD 22134723edSLouis Dionne 23134723edSLouis Dionne template <class _Compare, class _InputIterator1, class _InputIterator2, class _OutputIterator> 24*9783f28cSLouis Dionne _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 _OutputIterator __merge( 25*9783f28cSLouis Dionne _InputIterator1 __first1, 26*9783f28cSLouis Dionne _InputIterator1 __last1, 27*9783f28cSLouis Dionne _InputIterator2 __first2, 28*9783f28cSLouis Dionne _InputIterator2 __last2, 29*9783f28cSLouis Dionne _OutputIterator __result, 30*9783f28cSLouis Dionne _Compare __comp) { 31*9783f28cSLouis Dionne for (; __first1 != __last1; ++__result) { 32134723edSLouis Dionne if (__first2 == __last2) 3377a00c0dSLouis Dionne return std::copy(__first1, __last1, __result); 34*9783f28cSLouis Dionne if (__comp(*__first2, *__first1)) { 35134723edSLouis Dionne *__result = *__first2; 36134723edSLouis Dionne ++__first2; 37*9783f28cSLouis Dionne } else { 38134723edSLouis Dionne *__result = *__first1; 39134723edSLouis Dionne ++__first1; 40134723edSLouis Dionne } 41134723edSLouis Dionne } 4277a00c0dSLouis Dionne return std::copy(__first2, __last2, __result); 43134723edSLouis Dionne } 44134723edSLouis Dionne 45134723edSLouis Dionne template <class _InputIterator1, class _InputIterator2, class _OutputIterator, class _Compare> 46*9783f28cSLouis Dionne inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 _OutputIterator 47*9783f28cSLouis Dionne merge(_InputIterator1 __first1, 48*9783f28cSLouis Dionne _InputIterator1 __last1, 49*9783f28cSLouis Dionne _InputIterator2 __first2, 50*9783f28cSLouis Dionne _InputIterator2 __last2, 51*9783f28cSLouis Dionne _OutputIterator __result, 52*9783f28cSLouis Dionne _Compare __comp) { 5377a00c0dSLouis Dionne return std::__merge<__comp_ref_type<_Compare> >(__first1, __last1, __first2, __last2, __result, __comp); 54134723edSLouis Dionne } 55134723edSLouis Dionne 56134723edSLouis Dionne template <class _InputIterator1, class _InputIterator2, class _OutputIterator> 57*9783f28cSLouis Dionne inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 _OutputIterator 58*9783f28cSLouis Dionne merge(_InputIterator1 __first1, 59*9783f28cSLouis Dionne _InputIterator1 __last1, 60*9783f28cSLouis Dionne _InputIterator2 __first2, 61*9783f28cSLouis Dionne _InputIterator2 __last2, 62*9783f28cSLouis Dionne _OutputIterator __result) { 6377a00c0dSLouis Dionne return std::merge(__first1, __last1, __first2, __last2, __result, __less<>()); 64134723edSLouis Dionne } 65134723edSLouis Dionne 66134723edSLouis Dionne _LIBCPP_END_NAMESPACE_STD 67134723edSLouis Dionne 68134723edSLouis Dionne #endif // _LIBCPP___ALGORITHM_MERGE_H 69