From 3423f5023fe2204cb3085f43d5a8a5f9c8cd08bb Mon Sep 17 00:00:00 2001 From: 0xFEEDC0DE64 Date: Tue, 5 Jan 2021 17:08:33 +0100 Subject: [PATCH] More utils --- esputils.h | 81 ++++++++++++++++++++++++++++++++++++++++++++++-------- 1 file changed, 69 insertions(+), 12 deletions(-) diff --git a/esputils.h b/esputils.h index e6f1b0f..c200033 100644 --- a/esputils.h +++ b/esputils.h @@ -65,18 +65,6 @@ } // namespace namespace espcpputils { -template -constexpr const T& clamp( const T& v, const T& lo, const T& hi ) -{ - // assert( !(hi < lo) ); - return (v < lo) ? lo : (hi < v) ? hi : v; -} - -template -T mapValue(T x, T in_min, T in_max, T out_min, T out_max) -{ - return (x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min; -} template class Signal @@ -106,4 +94,73 @@ public: private: std::vector m_slots; }; + +namespace { +template +T vmin(T&&t) +{ + return std::forward(t); +} + +template +typename std::common_type::type vmin(T0&& val1, T1&& val2, Ts&&... vs) +{ + if (val1 < val2) + return vmin(val1, std::forward(vs)...); + else + return vmin(val2, std::forward(vs)...); +} + +template +constexpr const T& clamp( const T& v, const T& lo, const T& hi ) +{ + // assert( !(hi < lo) ); + return (v < lo) ? lo : (hi < v) ? hi : v; +} + +template +T mapValue(T x, T in_min, T in_max, T out_min, T out_max) +{ + return (x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min; +} + +template +struct EspNonConstOverload +{ + template + constexpr auto operator()(R (T::*ptr)(Args...)) const noexcept -> decltype(ptr) + { return ptr; } + template + static constexpr auto of(R (T::*ptr)(Args...)) noexcept -> decltype(ptr) + { return ptr; } +}; +template +struct EspConstOverload +{ + template + constexpr auto operator()(R (T::*ptr)(Args...) const) const noexcept -> decltype(ptr) + { return ptr; } + template + static constexpr auto of(R (T::*ptr)(Args...) const) noexcept -> decltype(ptr) + { return ptr; } +}; +template +struct EspOverload : EspConstOverload, EspNonConstOverload +{ + using EspConstOverload::of; + using EspConstOverload::operator(); + using EspNonConstOverload::of; + using EspNonConstOverload::operator(); + template + constexpr auto operator()(R (*ptr)(Args...)) const noexcept -> decltype(ptr) + { return ptr; } + template + static constexpr auto of(R (*ptr)(Args...)) noexcept -> decltype(ptr) + { return ptr; } +}; + +template constexpr __attribute__((__unused__)) EspOverload espOverload = {}; +template constexpr __attribute__((__unused__)) EspConstOverload espConstOverload = {}; +template constexpr __attribute__((__unused__)) EspNonConstOverload espNonConstOverload = {}; +} // namespace } // namespace espcpputils