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_SET_DIFFERENCE_H 10134723edSLouis Dionne #define _LIBCPP___ALGORITHM_SET_DIFFERENCE_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> 161cdec6c9SHui Xie #include <__functional/identity.h> 17134723edSLouis Dionne #include <__iterator/iterator_traits.h> 18e698c595SNikolas Klauser #include <__type_traits/remove_cvref.h> 191cdec6c9SHui Xie #include <__utility/move.h> 201cdec6c9SHui Xie #include <__utility/pair.h> 21134723edSLouis Dionne 22134723edSLouis Dionne #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) 23134723edSLouis Dionne # pragma GCC system_header 24134723edSLouis Dionne #endif 25134723edSLouis Dionne 267b462251SLouis Dionne _LIBCPP_PUSH_MACROS 277b462251SLouis Dionne #include <__undef_macros> 287b462251SLouis Dionne 29134723edSLouis Dionne _LIBCPP_BEGIN_NAMESPACE_STD 30134723edSLouis Dionne 31*a2042521SNikolas Klauser template <class _Comp, class _InIter1, class _Sent1, class _InIter2, class _Sent2, class _OutIter> 325fab33afSNikolas Klauser _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 pair<__remove_cvref_t<_InIter1>, __remove_cvref_t<_OutIter> > 331cdec6c9SHui Xie __set_difference( 341cdec6c9SHui Xie _InIter1&& __first1, _Sent1&& __last1, _InIter2&& __first2, _Sent2&& __last2, _OutIter&& __result, _Comp&& __comp) { 351cdec6c9SHui Xie while (__first1 != __last1 && __first2 != __last2) { 361cdec6c9SHui Xie if (__comp(*__first1, *__first2)) { 37134723edSLouis Dionne *__result = *__first1; 38134723edSLouis Dionne ++__first1; 391cdec6c9SHui Xie ++__result; 401cdec6c9SHui Xie } else if (__comp(*__first2, *__first1)) { 411cdec6c9SHui Xie ++__first2; 421cdec6c9SHui Xie } else { 43134723edSLouis Dionne ++__first1; 44134723edSLouis Dionne ++__first2; 45134723edSLouis Dionne } 46134723edSLouis Dionne } 47*a2042521SNikolas Klauser return std::__copy(std::move(__first1), std::move(__last1), std::move(__result)); 48134723edSLouis Dionne } 49134723edSLouis Dionne 50134723edSLouis Dionne template <class _InputIterator1, class _InputIterator2, class _OutputIterator, class _Compare> 515146b57bSNikolas Klauser inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 _OutputIterator set_difference( 521cdec6c9SHui Xie _InputIterator1 __first1, 531cdec6c9SHui Xie _InputIterator1 __last1, 541cdec6c9SHui Xie _InputIterator2 __first2, 551cdec6c9SHui Xie _InputIterator2 __last2, 561cdec6c9SHui Xie _OutputIterator __result, 571cdec6c9SHui Xie _Compare __comp) { 58*a2042521SNikolas Klauser return std::__set_difference<__comp_ref_type<_Compare> >(__first1, __last1, __first2, __last2, __result, __comp) 59ed2d3644SNikolas Klauser .second; 60134723edSLouis Dionne } 61134723edSLouis Dionne 62134723edSLouis Dionne template <class _InputIterator1, class _InputIterator2, class _OutputIterator> 635146b57bSNikolas Klauser inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 _OutputIterator set_difference( 641cdec6c9SHui Xie _InputIterator1 __first1, 651cdec6c9SHui Xie _InputIterator1 __last1, 661cdec6c9SHui Xie _InputIterator2 __first2, 671cdec6c9SHui Xie _InputIterator2 __last2, 681cdec6c9SHui Xie _OutputIterator __result) { 69*a2042521SNikolas Klauser return std::__set_difference(__first1, __last1, __first2, __last2, __result, __less<>()).second; 70134723edSLouis Dionne } 71134723edSLouis Dionne 72134723edSLouis Dionne _LIBCPP_END_NAMESPACE_STD 73134723edSLouis Dionne 747b462251SLouis Dionne _LIBCPP_POP_MACROS 757b462251SLouis Dionne 76134723edSLouis Dionne #endif // _LIBCPP___ALGORITHM_SET_DIFFERENCE_H 77