diff options
Diffstat (limited to 'options/value.hpp')
-rw-r--r-- | options/value.hpp | 136 |
1 files changed, 80 insertions, 56 deletions
diff --git a/options/value.hpp b/options/value.hpp index ea180b27..940e2a15 100644 --- a/options/value.hpp +++ b/options/value.hpp @@ -35,18 +35,17 @@ namespace options::detail { namespace options { -template<typename u> +template<typename t> class value final : public value_ { - using t = remove_cvref_t<u>; + static_assert(std::is_same_v<t, remove_cvref_t<t>>); const t def; - using traits = detail::value_traits<t>; - cc_noinline - t get() const + never_inline + auto get() const noexcept { - if (self_name.isEmpty() || !b->contains(self_name)) + if (!b->contains(self_name)) return traits::pass_value(def); QVariant variant = b->get_variant(self_name); @@ -57,18 +56,9 @@ class value final : public value_ return traits::pass_value(traits::value_with_default(traits::value_from_qvariant(variant), def)); } - friend class detail::connector; - void bundle_value_changed() const override - { - if (!self_name.isEmpty()) - emit valueChanged(traits::storage_from_value(get())); - } - - void store_variant(const QVariant& value) override + never_inline + void store_variant(QVariant&& value) noexcept override { - if (self_name.isEmpty()) - return; - if (traits::is_equal(get(), traits::value_from_qvariant(value))) return; @@ -78,76 +68,110 @@ class value final : public value_ b->store_kv(self_name, traits::qvariant_from_value(def)); } + never_inline + void store_variant(const QVariant& value) noexcept override + { + QVariant copy{value}; + store_variant(std::move(copy)); + } + + bool is_null() const + { + return self_name.isEmpty() || b->name().isEmpty(); + } + public: - cc_noinline - value<u>& operator=(const t& datum) + QVariant get_variant() const noexcept override + { + if (QVariant ret{b->get_variant(self_name)}; ret.isValid() && !ret.isNull()) + return ret; + + return traits::qvariant_from_value(def); + } + + void notify() const override + { + if (!is_null()) + emit valueChanged(traits::storage_from_value(get())); + } + + auto& operator=(t&& datum) noexcept { store_variant(traits::qvariant_from_value(traits::pass_value(datum))); + return *this; + } + auto& operator=(const t& datum) noexcept + { + t copy{datum}; + *this = std::move(copy); return *this; } - static constexpr inline Qt::ConnectionType DIRECT_CONNTYPE = Qt::DirectConnection; - static constexpr inline Qt::ConnectionType SAFE_CONNTYPE = Qt::QueuedConnection; + auto& operator=(const value<t>& datum) noexcept + { + *this = *datum; + return *this; + } + + static constexpr Qt::ConnectionType DIRECT_CONNTYPE = Qt::DirectConnection; + static constexpr Qt::ConnectionType SAFE_CONNTYPE = Qt::QueuedConnection; - cc_noinline - value(bundle b, const QString& name, t def) : - value_(b, name), def(std::move(def)) + value(bundle b, const QString& name, t def) noexcept : value_(b, name), def(std::move(def)) { } - cc_noinline + value(const value<t>& other) noexcept : value{other.b, other.self_name, other.def} {} + t default_value() const { return def; } - cc_noinline - void set_to_default() override + void set_to_default() noexcept override { *this = def; } - operator t() const { return get(); } // NOLINT + operator t() const { return get(); } - template<typename w, typename = decltype(static_cast<w>(std::declval<t>()))> - explicit cc_forceinline operator w() const { return to<w>(); } + template<typename u> + explicit force_inline operator u() const { return to<u>(); } - auto operator->() const + auto operator->() const noexcept { - return detail::dereference_wrapper<t>{get()}; + return detail::dereference_wrapper{get()}; } - cc_forceinline t operator()() const { return get(); } - cc_forceinline t operator*() const { return get(); } + force_inline auto operator()() const noexcept { return get(); } + force_inline auto operator*() const noexcept { return get(); } - template<typename w> - w to() const + template<typename u> + u to() const noexcept { - return static_cast<w>(get()); + return static_cast<u>(get()); } }; -// some linker problems -#if !defined OTR_INST_VALUE -# define OTR_INST_VALUE OTR_TEMPLATE_IMPORT +#if !defined OTR_OPTIONS_INST_VALUE +# define OTR_OPTIONS_INST_VALUE OTR_TEMPLATE_IMPORT #endif -OTR_INST_VALUE(value<double>) -OTR_INST_VALUE(value<float>) -OTR_INST_VALUE(value<int>) -OTR_INST_VALUE(value<bool>) -OTR_INST_VALUE(value<QString>) -OTR_INST_VALUE(value<slider_value>) -OTR_INST_VALUE(value<QPointF>) -OTR_INST_VALUE(value<QVariant>) -OTR_INST_VALUE(value<QList<double>>) -OTR_INST_VALUE(value<QList<float>>) -OTR_INST_VALUE(value<QList<int>>) -OTR_INST_VALUE(value<QList<bool>>) -OTR_INST_VALUE(value<QList<QString>>) -OTR_INST_VALUE(value<QList<slider_value>>) -OTR_INST_VALUE(value<QList<QPointF>>) -OTR_INST_VALUE(value<QList<QVariant>>) +OTR_OPTIONS_INST_VALUE(value<double>) +OTR_OPTIONS_INST_VALUE(value<float>) +OTR_OPTIONS_INST_VALUE(value<int>) +OTR_OPTIONS_INST_VALUE(value<bool>) +OTR_OPTIONS_INST_VALUE(value<QString>) +OTR_OPTIONS_INST_VALUE(value<slider_value>) +OTR_OPTIONS_INST_VALUE(value<QPointF>) +OTR_OPTIONS_INST_VALUE(value<QVariant>) +OTR_OPTIONS_INST_VALUE(value<QList<double>>) +OTR_OPTIONS_INST_VALUE(value<QList<float>>) +OTR_OPTIONS_INST_VALUE(value<QList<int>>) +OTR_OPTIONS_INST_VALUE(value<QList<bool>>) +OTR_OPTIONS_INST_VALUE(value<QList<QString>>) +OTR_OPTIONS_INST_VALUE(value<QList<slider_value>>) +OTR_OPTIONS_INST_VALUE(value<QList<QPointF>>) +OTR_OPTIONS_INST_VALUE(value<QList<QVariant>>) } // ns options |