diff options
Diffstat (limited to 'options')
-rw-r--r-- | options/connector.cpp | 54 | ||||
-rw-r--r-- | options/connector.hpp | 1 | ||||
-rw-r--r-- | options/value.hpp | 1 |
3 files changed, 40 insertions, 16 deletions
diff --git a/options/connector.cpp b/options/connector.cpp index ba460b1f..c1bbce39 100644 --- a/options/connector.cpp +++ b/options/connector.cpp @@ -1,3 +1,4 @@ +#include "compat/util.hpp" #include "connector.hpp" #include "value.hpp" @@ -6,37 +7,58 @@ namespace detail { connector::~connector() {} -void connector::on_value_destructed(const QString& name, const base_value* val) +bool connector::on_value_destructed_impl(const QString& name, const base_value* val) { QMutexLocker l(get_mtx()); - auto it = connected_values.find(name); - - bool ok = false; + const bool ok = progn( + auto it = connected_values.find(name); - if (it != connected_values.end()) - { - std::vector<const base_value*>& values = (*it).second; - for (auto it = values.begin(); it != values.end(); it++) + if (it != connected_values.end()) { - if (*it == val) + std::vector<const base_value*>& values = (*it).second; + for (auto it = values.begin(); it != values.end(); it++) { - values.erase(it); - ok = true; - break; + if (*it == val) + { + values.erase(it); + return true; + } } } - } + return false; + ); + + return ok; +} + + + +void connector::on_value_destructed(const QString& name, const base_value* val) +{ + const bool ok = on_value_destructed_impl(name, val); if (!ok) - qWarning() << "connector: bundle destructed without creating;" - << "name" << name - << "ptr" << quintptr(val); + qWarning() << "options/connector: value destructed without creating;" + << "bundle" + << (val && val->b ? val->b->name() : "<NULL>") + << "value-name" << name + << "value-ptr" << quintptr(val); } void connector::on_value_created(const QString& name, const base_value* val) { QMutexLocker l(get_mtx()); + + if (on_value_destructed_impl(name, val)) + { + qWarning() << "options/connector: value created twice;" + << "bundle" + << (val && val->b ? val->b->name() : "<NULL>") + << "value-name" << name + << "value-ptr" << quintptr(val); + } + auto it = connected_values.find(name); if (it != connected_values.end()) diff --git a/options/connector.hpp b/options/connector.hpp index ef9e4dbf..504c636d 100644 --- a/options/connector.hpp +++ b/options/connector.hpp @@ -22,6 +22,7 @@ class OPENTRACK_OPTIONS_EXPORT connector void on_value_destructed(const QString& name, const base_value* val); void on_value_created(const QString& name, const base_value* val); + bool on_value_destructed_impl(const QString& name, const base_value* val); protected: void notify_values(const QString& name) const; diff --git a/options/value.hpp b/options/value.hpp index f0ecf0c7..4ed61f1c 100644 --- a/options/value.hpp +++ b/options/value.hpp @@ -27,6 +27,7 @@ template<typename t> using value_type_t = typename value_type_traits<t>::type; class OPENTRACK_OPTIONS_EXPORT base_value : public QObject { Q_OBJECT + friend class ::options::detail::connector; public: QString name() const { return self_name; } base_value(bundle b, const QString& name) : b(b), self_name(name) |