xref: /llvm-project/libcxx/include/__algorithm/copy_if.h (revision eab7be5d42ad30c9992ff72c3be9298702001dc8)
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_COPY_IF_H
10134723edSLouis Dionne #define _LIBCPP___ALGORITHM_COPY_IF_H
11134723edSLouis Dionne 
12134723edSLouis Dionne #include <__config>
13*eab7be5dSNikolas Klauser #include <__functional/identity.h>
14*eab7be5dSNikolas Klauser #include <__type_traits/invoke.h>
15*eab7be5dSNikolas Klauser #include <__utility/move.h>
16*eab7be5dSNikolas Klauser #include <__utility/pair.h>
17134723edSLouis Dionne 
18134723edSLouis Dionne #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
19134723edSLouis Dionne #  pragma GCC system_header
20134723edSLouis Dionne #endif
21134723edSLouis Dionne 
22*eab7be5dSNikolas Klauser _LIBCPP_PUSH_MACROS
23*eab7be5dSNikolas Klauser #include <__undef_macros>
24*eab7be5dSNikolas Klauser 
25134723edSLouis Dionne _LIBCPP_BEGIN_NAMESPACE_STD
26134723edSLouis Dionne 
27*eab7be5dSNikolas Klauser template <class _InIter, class _Sent, class _OutIter, class _Proj, class _Pred>
28*eab7be5dSNikolas Klauser _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX14 pair<_InIter, _OutIter>
29*eab7be5dSNikolas Klauser __copy_if(_InIter __first, _Sent __last, _OutIter __result, _Pred& __pred, _Proj& __proj) {
309783f28cSLouis Dionne   for (; __first != __last; ++__first) {
31*eab7be5dSNikolas Klauser     if (std::__invoke(__pred, std::__invoke(__proj, *__first))) {
32134723edSLouis Dionne       *__result = *__first;
33134723edSLouis Dionne       ++__result;
34134723edSLouis Dionne     }
35134723edSLouis Dionne   }
36*eab7be5dSNikolas Klauser   return std::make_pair(std::move(__first), std::move(__result));
37*eab7be5dSNikolas Klauser }
38*eab7be5dSNikolas Klauser 
39*eab7be5dSNikolas Klauser template <class _InputIterator, class _OutputIterator, class _Predicate>
40*eab7be5dSNikolas Klauser inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 _OutputIterator
41*eab7be5dSNikolas Klauser copy_if(_InputIterator __first, _InputIterator __last, _OutputIterator __result, _Predicate __pred) {
42*eab7be5dSNikolas Klauser   __identity __proj;
43*eab7be5dSNikolas Klauser   return std::__copy_if(__first, __last, __result, __pred, __proj).second;
44134723edSLouis Dionne }
45134723edSLouis Dionne 
46134723edSLouis Dionne _LIBCPP_END_NAMESPACE_STD
47134723edSLouis Dionne 
48*eab7be5dSNikolas Klauser _LIBCPP_POP_MACROS
49*eab7be5dSNikolas Klauser 
50134723edSLouis Dionne #endif // _LIBCPP___ALGORITHM_COPY_IF_H
51