xref: /llvm-project/libcxx/include/__algorithm/ranges_minmax_element.h (revision d10dc5a06fac4dcabf2264c64c8672c6f6ae36fb)
158d9ab70SNikolas Klauser //===----------------------------------------------------------------------===//
258d9ab70SNikolas Klauser //
358d9ab70SNikolas Klauser // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
458d9ab70SNikolas Klauser // See https://llvm.org/LICENSE.txt for license information.
558d9ab70SNikolas Klauser // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
658d9ab70SNikolas Klauser //
758d9ab70SNikolas Klauser //===----------------------------------------------------------------------===//
858d9ab70SNikolas Klauser 
958d9ab70SNikolas Klauser #ifndef _LIBCPP___ALGORITHM_RANGES_MINMAX_ELEMENT_H
1058d9ab70SNikolas Klauser #define _LIBCPP___ALGORITHM_RANGES_MINMAX_ELEMENT_H
1158d9ab70SNikolas Klauser 
1258d9ab70SNikolas Klauser #include <__algorithm/min_max_result.h>
1358d9ab70SNikolas Klauser #include <__algorithm/minmax_element.h>
1458d9ab70SNikolas Klauser #include <__config>
1558d9ab70SNikolas Klauser #include <__functional/identity.h>
1658d9ab70SNikolas Klauser #include <__functional/invoke.h>
1758d9ab70SNikolas Klauser #include <__functional/ranges_operations.h>
1858d9ab70SNikolas Klauser #include <__iterator/concepts.h>
1958d9ab70SNikolas Klauser #include <__iterator/projected.h>
2058d9ab70SNikolas Klauser #include <__ranges/access.h>
2158d9ab70SNikolas Klauser #include <__ranges/concepts.h>
2258d9ab70SNikolas Klauser #include <__ranges/dangling.h>
2358d9ab70SNikolas Klauser #include <__utility/forward.h>
2458d9ab70SNikolas Klauser #include <__utility/move.h>
2558d9ab70SNikolas Klauser #include <__utility/pair.h>
2658d9ab70SNikolas Klauser 
2758d9ab70SNikolas Klauser #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
2858d9ab70SNikolas Klauser #  pragma GCC system_header
2958d9ab70SNikolas Klauser #endif
3058d9ab70SNikolas Klauser 
317b462251SLouis Dionne _LIBCPP_PUSH_MACROS
327b462251SLouis Dionne #include <__undef_macros>
337b462251SLouis Dionne 
344f15267dSNikolas Klauser #if _LIBCPP_STD_VER >= 20
3558d9ab70SNikolas Klauser 
3658d9ab70SNikolas Klauser _LIBCPP_BEGIN_NAMESPACE_STD
3758d9ab70SNikolas Klauser 
3858d9ab70SNikolas Klauser namespace ranges {
3958d9ab70SNikolas Klauser 
4058d9ab70SNikolas Klauser template <class _T1>
4158d9ab70SNikolas Klauser using minmax_element_result = min_max_result<_T1>;
4258d9ab70SNikolas Klauser 
43*d10dc5a0SChristopher Di Bella struct __minmax_element {
445aa03b64SLouis Dionne   template <forward_iterator _Ip,
455aa03b64SLouis Dionne             sentinel_for<_Ip> _Sp,
465aa03b64SLouis Dionne             class _Proj                                             = identity,
4758d9ab70SNikolas Klauser             indirect_strict_weak_order<projected<_Ip, _Proj>> _Comp = ranges::less>
4883bc7b57SNikolas Klauser   [[nodiscard]] _LIBCPP_HIDE_FROM_ABI constexpr ranges::minmax_element_result<_Ip>
495aa03b64SLouis Dionne   operator()(_Ip __first, _Sp __last, _Comp __comp = {}, _Proj __proj = {}) const {
5058d9ab70SNikolas Klauser     auto __ret = std::__minmax_element_impl(std::move(__first), std::move(__last), __comp, __proj);
5158d9ab70SNikolas Klauser     return {__ret.first, __ret.second};
5258d9ab70SNikolas Klauser   }
5358d9ab70SNikolas Klauser 
545aa03b64SLouis Dionne   template <forward_range _Rp,
555aa03b64SLouis Dionne             class _Proj                                                         = identity,
5658d9ab70SNikolas Klauser             indirect_strict_weak_order<projected<iterator_t<_Rp>, _Proj>> _Comp = ranges::less>
5783bc7b57SNikolas Klauser   [[nodiscard]] _LIBCPP_HIDE_FROM_ABI constexpr ranges::minmax_element_result<borrowed_iterator_t<_Rp>>
5858d9ab70SNikolas Klauser   operator()(_Rp&& __r, _Comp __comp = {}, _Proj __proj = {}) const {
5958d9ab70SNikolas Klauser     auto __ret = std::__minmax_element_impl(ranges::begin(__r), ranges::end(__r), __comp, __proj);
6058d9ab70SNikolas Klauser     return {__ret.first, __ret.second};
6158d9ab70SNikolas Klauser   }
6258d9ab70SNikolas Klauser };
6358d9ab70SNikolas Klauser 
6458d9ab70SNikolas Klauser inline namespace __cpo {
65*d10dc5a0SChristopher Di Bella inline constexpr auto minmax_element = __minmax_element{};
6658d9ab70SNikolas Klauser } // namespace __cpo
6758d9ab70SNikolas Klauser 
6858d9ab70SNikolas Klauser } // namespace ranges
6958d9ab70SNikolas Klauser 
7058d9ab70SNikolas Klauser _LIBCPP_END_NAMESPACE_STD
7158d9ab70SNikolas Klauser 
724f15267dSNikolas Klauser #endif // _LIBCPP_STD_VER >= 20
7358d9ab70SNikolas Klauser 
747b462251SLouis Dionne _LIBCPP_POP_MACROS
757b462251SLouis Dionne 
7658d9ab70SNikolas Klauser #endif // _LIBCPP___ALGORITHM_RANGES_MINMAX_H
77