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_MAX_ELEMENT_H 10134723edSLouis Dionne #define _LIBCPP___ALGORITHM_MAX_ELEMENT_H 11134723edSLouis Dionne 12134723edSLouis Dionne #include <__algorithm/comp.h> 13b07b5bd7SArthur O'Dwyer #include <__algorithm/comp_ref_type.h> 144d81a46fSArthur O'Dwyer #include <__config> 15134723edSLouis Dionne #include <__iterator/iterator_traits.h> 1625783158SLouis Dionne #include <__type_traits/is_callable.h> 17134723edSLouis Dionne 18134723edSLouis Dionne #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) 19134723edSLouis Dionne # pragma GCC system_header 20134723edSLouis Dionne #endif 21134723edSLouis Dionne 22134723edSLouis Dionne _LIBCPP_BEGIN_NAMESPACE_STD 23134723edSLouis Dionne 24b07b5bd7SArthur O'Dwyer template <class _Compare, class _ForwardIterator> 255146b57bSNikolas Klauser inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX14 _ForwardIterator 269783f28cSLouis Dionne __max_element(_ForwardIterator __first, _ForwardIterator __last, _Compare __comp) { 279783f28cSLouis Dionne static_assert( 289783f28cSLouis Dionne __has_forward_iterator_category<_ForwardIterator>::value, "std::max_element requires a ForwardIterator"); 299783f28cSLouis Dionne if (__first != __last) { 30134723edSLouis Dionne _ForwardIterator __i = __first; 31134723edSLouis Dionne while (++__i != __last) 32134723edSLouis Dionne if (__comp(*__first, *__i)) 33134723edSLouis Dionne __first = __i; 34134723edSLouis Dionne } 35134723edSLouis Dionne return __first; 36134723edSLouis Dionne } 37134723edSLouis Dionne 38b07b5bd7SArthur O'Dwyer template <class _ForwardIterator, class _Compare> 39*17e0686aSNikolas Klauser [[__nodiscard__]] inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX14 _ForwardIterator 409783f28cSLouis Dionne max_element(_ForwardIterator __first, _ForwardIterator __last, _Compare __comp) { 4125783158SLouis Dionne static_assert( 4225783158SLouis Dionne __is_callable<_Compare&, decltype(*__first), decltype(*__first)>::value, "The comparator has to be callable"); 4377a00c0dSLouis Dionne return std::__max_element<__comp_ref_type<_Compare> >(__first, __last, __comp); 44b07b5bd7SArthur O'Dwyer } 45b07b5bd7SArthur O'Dwyer 46134723edSLouis Dionne template <class _ForwardIterator> 47*17e0686aSNikolas Klauser [[__nodiscard__]] inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX14 _ForwardIterator 489783f28cSLouis Dionne max_element(_ForwardIterator __first, _ForwardIterator __last) { 4977a00c0dSLouis Dionne return std::max_element(__first, __last, __less<>()); 50134723edSLouis Dionne } 51134723edSLouis Dionne 52134723edSLouis Dionne _LIBCPP_END_NAMESPACE_STD 53134723edSLouis Dionne 54134723edSLouis Dionne #endif // _LIBCPP___ALGORITHM_MAX_ELEMENT_H 55