Iros
 
Loading...
Searching...
No Matches
max.h
Go to the documentation of this file.
1#pragma once
2
10#include "di/meta/operations.h"
13
14namespace di::container {
15namespace detail {
16 struct MaxFunction {
17 template<typename T, typename Proj = function::Identity,
19 constexpr auto operator()(T const& a, T const& b, Comp comp = {}, Proj proj = {}) const -> T const& {
20 return function::invoke(comp, function::invoke(proj, a), function::invoke(proj, b)) >= 0 ? a : b;
21 }
22
23 template<concepts::Copyable T, typename Proj = function::Identity,
25 constexpr auto operator()(std::initializer_list<T> list, Comp comp = {}, Proj proj = {}) const -> T {
26 return *max_element(list, util::ref(comp), util::ref(proj));
27 }
28
29 template<concepts::InputContainer Con, typename Proj = function::Identity,
33 constexpr auto operator()(Con&& container, Comp comp = {}, Proj proj = {}) const -> meta::ContainerValue<Con> {
34 auto it = container::begin(container);
35 auto ed = container::end(container);
36 auto result = meta::ContainerValue<Con> { *it };
37 while (++it != ed) {
38 if (function::invoke(comp, function::invoke(proj, *it), function::invoke(proj, result)) > 0) {
39 result = *it;
40 }
41 }
42 return result;
43 }
44 };
45}
46
47constexpr inline auto max = detail::MaxFunction {};
48}
49
50namespace di {
51using container::max;
52}
Definition operations.h:40
Definition indirect_strict_weak_order.h:12
Definition indirectly_copyable_storable.h:10
Definition input_container.h:8
Definition sequence.h:13
Definition sequence.h:12
constexpr auto max_element
Definition max_element.h:39
constexpr auto end
Definition end.h:47
constexpr auto max
Definition max.h:47
constexpr auto begin
Definition begin.h:44
constexpr auto invoke
Definition invoke.h:100
IteratorValue< ContainerIterator< T > > ContainerValue
Definition container_value.h:8
constexpr auto ref
Definition reference_wrapper.h:98
Definition zstring_parser.h:9
constexpr auto proj
Definition proj.h:59
constexpr auto operator()(std::initializer_list< T > list, Comp comp={}, Proj proj={}) const -> T
Definition max.h:25
constexpr auto operator()(T const &a, T const &b, Comp comp={}, Proj proj={}) const -> T const &
Definition max.h:19
Definition compare.h:8
Definition identity.h:7