summaryrefslogtreecommitdiffhomepage
path: root/options/value.hpp
diff options
context:
space:
mode:
Diffstat (limited to 'options/value.hpp')
-rw-r--r--options/value.hpp136
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