From 9ee0390203c38e5921dac2e04905df449915775f Mon Sep 17 00:00:00 2001 From: Stanislaw Halik Date: Sat, 20 Nov 2021 18:33:27 +0100 Subject: options/value: use function specialization, kill ugly self-type --- options/value-traits.hpp | 72 +++++++++++++++++++++++++++--------------------- 1 file changed, 40 insertions(+), 32 deletions(-) diff --git a/options/value-traits.hpp b/options/value-traits.hpp index aeb34cfa..385983a4 100644 --- a/options/value-traits.hpp +++ b/options/value-traits.hpp @@ -10,96 +10,104 @@ namespace options::detail { -template -struct value_traits; - template struct default_value_traits { using value_type = t; using stored_type = u; - using self = value_traits; - static value_type value_with_default(const value_type& val, const value_type&) + static inline + value_type value_with_default(cv_qualified val, cv_qualified) { return val; } - static value_type value_from_storage(const stored_type& x) + static inline + value_type value_from_storage(cv_qualified x) { return static_cast(x); } - static stored_type storage_from_value(const value_type& val) + static inline + stored_type storage_from_value(cv_qualified val) { return static_cast(val); } - static value_type value_from_qvariant(const QVariant& x) + static inline + value_type value_from_qvariant(const QVariant& x) { - return self::value_from_storage(self::storage_from_qvariant(x)); + return value_from_storage(storage_from_qvariant(x)); } - static QVariant qvariant_from_value(const value_type& val) + static inline + QVariant qvariant_from_value(cv_qualified val) { - return self::qvariant_from_storage(self::storage_from_value(val)); + return qvariant_from_storage(storage_from_value(val)); } - static constexpr value_type pass_value(const value_type& x) + static constexpr inline + value_type pass_value(cv_qualified x) { if constexpr(std::is_same_v) return x; else - return self::value_from_storage(self::storage_from_value(x)); + return value_from_storage(storage_from_value(x)); } - static stored_type storage_from_qvariant(const QVariant& x) + static inline + stored_type storage_from_qvariant(const QVariant& x) { // XXX TODO return x.value(); } - static QVariant qvariant_from_storage(const stored_type& val) + static inline + QVariant qvariant_from_storage(cv_qualified val) { // XXX TODO return QVariant::fromValue(val); } - static bool is_equal(const value_type& x, const value_type& y) + static inline + bool is_equal(cv_qualified x, cv_qualified y) { return x == y; } }; -template +template struct value_traits : default_value_traits {}; template<> -struct value_traits : default_value_traits +inline +bool default_value_traits::is_equal(double x, double y) { - static bool is_equal(value_type x, value_type y) { return std::fabs(x - y) < 1e-6; } + return std::fabs(x - y) < 1e-6; }; +template<> struct value_traits : default_value_traits {}; + template<> -struct value_traits : default_value_traits +inline +bool default_value_traits::is_equal(float x, float y) { - static bool is_equal(value_type x, value_type y) { return std::fabs(x - y) < 1e-6f; } + return std::fabs(x - y) < 1e-6f; }; template<> -struct value_traits : default_value_traits +inline +slider_value default_value_traits::value_with_default(cv_qualified val, cv_qualified def) { - static slider_value value_with_default(const slider_value& val, const slider_value& def) - { - return { val.cur(), def.min(), def.max() }; - } + return { val.cur(), def.min(), def.max() }; +} - static bool is_equal(const slider_value& x, const slider_value& y) - { - using tr = value_traits; - return tr::is_equal(x.cur(), y.cur()); - } -}; +template<> +inline +bool default_value_traits::is_equal(cv_qualified x, cv_qualified y) +{ + return value_traits::is_equal(x.cur(), y.cur()); +} // Qt uses int a lot in slots so use it for all enums template -- cgit v1.2.3