xref: /freebsd/contrib/llvm-project/libcxx/include/__algorithm/max_element.h (revision d14c38ceb8aa10bd94913d0456ec0f726693379b)
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_MAX_ELEMENT_H
10  #define _LIBCPP___ALGORITHM_MAX_ELEMENT_H
11  
12  #include <__algorithm/comp.h>
13  #include <__algorithm/comp_ref_type.h>
14  #include <__config>
15  #include <__iterator/iterator_traits.h>
16  
17  #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
18  #  pragma GCC system_header
19  #endif
20  
21  _LIBCPP_BEGIN_NAMESPACE_STD
22  
23  template <class _Compare, class _ForwardIterator>
24  inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX14 _ForwardIterator
25  __max_element(_ForwardIterator __first, _ForwardIterator __last, _Compare __comp) {
26    static_assert(
27        __has_forward_iterator_category<_ForwardIterator>::value, "std::max_element requires a ForwardIterator");
28    if (__first != __last) {
29      _ForwardIterator __i = __first;
30      while (++__i != __last)
31        if (__comp(*__first, *__i))
32          __first = __i;
33    }
34    return __first;
35  }
36  
37  template <class _ForwardIterator, class _Compare>
38  _LIBCPP_NODISCARD inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX14 _ForwardIterator
39  max_element(_ForwardIterator __first, _ForwardIterator __last, _Compare __comp) {
40    return std::__max_element<__comp_ref_type<_Compare> >(__first, __last, __comp);
41  }
42  
43  template <class _ForwardIterator>
44  _LIBCPP_NODISCARD inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX14 _ForwardIterator
45  max_element(_ForwardIterator __first, _ForwardIterator __last) {
46    return std::max_element(__first, __last, __less<>());
47  }
48  
49  _LIBCPP_END_NAMESPACE_STD
50  
51  #endif // _LIBCPP___ALGORITHM_MAX_ELEMENT_H
52