From 29043ce418f86229f7a71cc7cd2d6623163ce256 Mon Sep 17 00:00:00 2001 From: Stanislaw Halik Date: Sat, 19 Aug 2017 12:08:00 +0200 Subject: compat/util: implement clamp specialization for floats --- compat/util.hpp | 54 +++++++++++++++++++++++++++++++++++++----------------- 1 file changed, 37 insertions(+), 17 deletions(-) (limited to 'compat/util.hpp') diff --git a/compat/util.hpp b/compat/util.hpp index 5ae87632..6db5324b 100644 --- a/compat/util.hpp +++ b/compat/util.hpp @@ -68,31 +68,51 @@ inline unsigned uround(const t& val) namespace util_detail { template -inline auto clamp_(n val, n min, n max) -> n +inline auto clamp_float(n val, n min, n max) { - if (unlikely(val > max)) - return max; - if (unlikely(val < min)) - return min; - return val; + return std::fmin(std::fmax(val, min), max); } -} - -template -inline auto clamp(const t& val, const u& min, const w& max) -> decltype(val + min + max) +template +struct clamp final { - return ::util_detail::clamp_(val, min, max); -} + static inline auto clamp_(const n& val, const n& min, const n& max) + { + if (unlikely(val > max)) + return max; + if (unlikely(val < min)) + return min; + return val; + } +}; + +template<> +struct clamp +{ + static inline auto clamp_(float val, float min, float max) + { + return clamp_float(val, min, max); + } +}; + +template<> +struct clamp +{ + static inline auto clamp_(double val, double min, double max) + { + return clamp_float(val, min, max); + } +}; + +} // ns util_detail -template -auto qptr(xs... args) +template +inline auto clamp(const t& val, const u& min, const w& max) { - return QSharedPointer(new t(std::forward(args)...)); + using tp = decltype(val + min + max); + return ::util_detail::clamp::clamp_(val, min, max); } -template using qshared = QSharedPointer; - #if defined _MSC_VER # define never_inline __declspec(noinline) #elif defined __GNUG__ -- cgit v1.2.3