di 0.1.0
Loading...
Searching...
No Matches
clamp.h
Go to the documentation of this file.
1#pragma once
2
7
8namespace di::util {
9namespace detail {
10 struct ClampFunction {
11 template<typename T, typename Proj = function::Identity,
12 concepts::IndirectStrictWeakOrder<meta::Projected<T const*, Proj>> Comp = function::Compare>
13 constexpr auto operator()(T const& value, T const& min, T const& max, Comp comp = {}, Proj proj = {}) const
14 -> T const& {
15 auto&& projected_value = function::invoke(proj, value);
16
17 // NOLINTBEGIN(bugprone-return-const-ref-from-parameter)
18 if (function::invoke(comp, projected_value, function::invoke(proj, min)) < 0) {
19 return min;
20 }
21 if (function::invoke(comp, projected_value, function::invoke(proj, max)) > 0) {
22 return max;
23 }
24 return value;
25 // NOLINTEND(bugprone-return-const-ref-from-parameter)
26 }
27 };
28}
29
30constexpr inline auto clamp = detail::ClampFunction {};
31}
32
33namespace di {
34using util::clamp;
35}
constexpr auto invoke
Definition invoke.h:100
constexpr auto value
Definition value.h:34
Definition vocab.h:96
constexpr auto clamp
Definition clamp.h:30
Definition any_storable.h:9
constexpr auto min
Definition min.h:49
constexpr auto proj
Definition proj.h:59
constexpr auto max
Definition max.h:49