xref: /llvm-project/libcxx/include/__algorithm/adjacent_find.h (revision b905bcc5090cde734e8b7bbceae13bd5a606cc14)
1134723edSLouis Dionne // -*- C++ -*-
2134723edSLouis Dionne //===----------------------------------------------------------------------===//
3134723edSLouis Dionne //
4134723edSLouis Dionne // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
5134723edSLouis Dionne // See https://llvm.org/LICENSE.txt for license information.
6134723edSLouis Dionne // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
7134723edSLouis Dionne //
8134723edSLouis Dionne //===----------------------------------------------------------------------===//
9134723edSLouis Dionne 
10134723edSLouis Dionne #ifndef _LIBCPP___ALGORITHM_ADJACENT_FIND_H
11134723edSLouis Dionne #define _LIBCPP___ALGORITHM_ADJACENT_FIND_H
12134723edSLouis Dionne 
13134723edSLouis Dionne #include <__algorithm/comp.h>
144d81a46fSArthur O'Dwyer #include <__config>
15*eab7be5dSNikolas Klauser #include <__functional/identity.h>
16*eab7be5dSNikolas Klauser #include <__type_traits/invoke.h>
1772f57e3aSHui Xie #include <__utility/move.h>
18134723edSLouis Dionne 
19134723edSLouis Dionne #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
20134723edSLouis Dionne #  pragma GCC system_header
21134723edSLouis Dionne #endif
22134723edSLouis Dionne 
2392e4d679SNicole Rabjohn _LIBCPP_PUSH_MACROS
2492e4d679SNicole Rabjohn #include <__undef_macros>
2592e4d679SNicole Rabjohn 
26134723edSLouis Dionne _LIBCPP_BEGIN_NAMESPACE_STD
27134723edSLouis Dionne 
28*eab7be5dSNikolas Klauser template <class _Iter, class _Sent, class _Pred, class _Proj>
2917e0686aSNikolas Klauser [[__nodiscard__]] _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 _Iter
30*eab7be5dSNikolas Klauser __adjacent_find(_Iter __first, _Sent __last, _Pred& __pred, _Proj& __proj) {
3172f57e3aSHui Xie   if (__first == __last)
3272f57e3aSHui Xie     return __first;
33*eab7be5dSNikolas Klauser 
3472f57e3aSHui Xie   _Iter __i = __first;
35134723edSLouis Dionne   while (++__i != __last) {
36*eab7be5dSNikolas Klauser     if (std::__invoke(__pred, std::__invoke(__proj, *__first), std::__invoke(__proj, *__i)))
37134723edSLouis Dionne       return __first;
38134723edSLouis Dionne     __first = __i;
39134723edSLouis Dionne   }
4072f57e3aSHui Xie   return __i;
41134723edSLouis Dionne }
4272f57e3aSHui Xie 
4372f57e3aSHui Xie template <class _ForwardIterator, class _BinaryPredicate>
4417e0686aSNikolas Klauser [[__nodiscard__]] inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 _ForwardIterator
4572f57e3aSHui Xie adjacent_find(_ForwardIterator __first, _ForwardIterator __last, _BinaryPredicate __pred) {
46*eab7be5dSNikolas Klauser   __identity __proj;
47*eab7be5dSNikolas Klauser   return std::__adjacent_find(std::move(__first), std::move(__last), __pred, __proj);
48134723edSLouis Dionne }
49134723edSLouis Dionne 
50134723edSLouis Dionne template <class _ForwardIterator>
5117e0686aSNikolas Klauser [[__nodiscard__]] inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 _ForwardIterator
52134723edSLouis Dionne adjacent_find(_ForwardIterator __first, _ForwardIterator __last) {
53e07ca2aeSAlvin Wong   return std::adjacent_find(std::move(__first), std::move(__last), __equal_to());
54134723edSLouis Dionne }
55134723edSLouis Dionne 
56134723edSLouis Dionne _LIBCPP_END_NAMESPACE_STD
57134723edSLouis Dionne 
5892e4d679SNicole Rabjohn _LIBCPP_POP_MACROS
5992e4d679SNicole Rabjohn 
60134723edSLouis Dionne #endif // _LIBCPP___ALGORITHM_ADJACENT_FIND_H
61