xref: /freebsd/contrib/llvm-project/libcxx/include/__algorithm/remove_if.h (revision a8d9bd3fa5855fe7583ed05946296ab6b9937d69)
1  //===----------------------------------------------------------------------===//
2  //
3  // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4  // See https://llvm.org/LICENSE.txt for license information.
5  // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6  //
7  //===----------------------------------------------------------------------===//
8  
9  #ifndef _LIBCPP___ALGORITHM_REMOVE_IF_H
10  #define _LIBCPP___ALGORITHM_REMOVE_IF_H
11  
12  #include <__algorithm/find_if.h>
13  #include <__config>
14  #include <__utility/move.h>
15  
16  #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
17  #  pragma GCC system_header
18  #endif
19  
20  _LIBCPP_PUSH_MACROS
21  #include <__undef_macros>
22  
23  _LIBCPP_BEGIN_NAMESPACE_STD
24  
25  template <class _ForwardIterator, class _Predicate>
26  _LIBCPP_NODISCARD _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 _ForwardIterator
27  remove_if(_ForwardIterator __first, _ForwardIterator __last, _Predicate __pred) {
28    __first = std::find_if<_ForwardIterator, _Predicate&>(__first, __last, __pred);
29    if (__first != __last) {
30      _ForwardIterator __i = __first;
31      while (++__i != __last) {
32        if (!__pred(*__i)) {
33          *__first = std::move(*__i);
34          ++__first;
35        }
36      }
37    }
38    return __first;
39  }
40  
41  _LIBCPP_END_NAMESPACE_STD
42  
43  _LIBCPP_POP_MACROS
44  
45  #endif // _LIBCPP___ALGORITHM_REMOVE_IF_H
46