summaryrefslogtreecommitdiffhomepage
path: root/options/connector.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'options/connector.cpp')
-rw-r--r--options/connector.cpp125
1 files changed, 39 insertions, 86 deletions
diff --git a/options/connector.cpp b/options/connector.cpp
index 6031d9ed..e86958f7 100644
--- a/options/connector.cpp
+++ b/options/connector.cpp
@@ -9,132 +9,85 @@
#include "connector.hpp"
#include "value.hpp"
-#include <utility>
+namespace options::detail {
-namespace options {
-namespace detail {
+connector::connector() = default;
+connector::~connector() = default;
-static bool generic_is_equal(const QVariant& val1, const QVariant& val2)
-{
- return val1 == val2;
-}
-
-connector::~connector() {}
-
-bool connector::is_equal(const QString& name, const QVariant& val1, const QVariant& val2) const
-{
- QMutexLocker l(get_mtx());
-
- auto it = connected_values.find(name);
-
- if (it != connected_values.cend() && std::get<0>((*it).second).size() != 0)
- return std::get<1>((*it).second)(val1, val2);
- else
- return generic_is_equal(val1, val2);
-}
-
-bool connector::on_value_destructed_impl(const QString& name, value_type val)
+void connector::on_value_destructed(value_type val)
{
+ const QString& name = val->name();
QMutexLocker l(get_mtx());
- const bool ok = progn(
- auto it = connected_values.find(name);
+ const auto it = connected_values.find(name);
- if (it != connected_values.end())
+ if (it != connected_values.end())
+ {
+ value_vec& values = it->second;
+ for (auto it = values.begin(); it != values.end(); )
{
- std::vector<value_type>& values = std::get<0>((*it).second);
- for (auto it = values.begin(); it != values.end(); it++)
- {
- if (*it == val)
- {
- values.erase(it);
- return true;
- }
- }
+ if (*it == val)
+ it = values.erase(it);
+ else
+ it++;
}
- return false;
- );
+ }
- return ok;
+ if (it != connected_values.end() && it->second.empty())
+ connected_values.erase(it);
}
-
-
-void connector::on_value_destructed(const QString& name, value_type val)
+void connector::on_value_created(value_type val)
{
- if (!name.size())
- return;
+ const QString& name = val->name();
- const bool ok = on_value_destructed_impl(name, val);
-
- if (!ok)
- qWarning() << "options/connector: value destructed without creating;"
- << "bundle"
- << val->b->name()
- << "value-name" << name
- << "value-ptr" << quintptr(val);
-}
-
-void connector::on_value_created(const QString& name, value_type val)
-{
- if (!name.size())
+ if (name.isEmpty())
return;
QMutexLocker l(get_mtx());
- int i = 1;
- while (on_value_destructed_impl(name, val))
- {
- qWarning() << "options/connector: value created twice;"
- << "cnt" << i++
- << "bundle" << val->b->name()
- << "value-name" << name
- << "value-ptr" << quintptr(val);
- }
-
auto it = connected_values.find(name);
if (it != connected_values.end())
{
- tt& tmp = (*it).second;
- std::type_index& typeidx = std::get<2>(tmp);
- std::vector<value_type>& values = std::get<0>(tmp);
-
- if (typeidx != val->type_index)
- std::get<1>((*it).second) = generic_is_equal;
+ value_vec& values = it->second;
values.push_back(val);
}
else
{
- std::vector<value_type> vec;
+ value_vec vec;
+ vec.reserve(4);
vec.push_back(val);
- connected_values.emplace(name, tt(vec, val->cmp, val->type_index));
+ connected_values.emplace(name, vec);
}
}
void connector::notify_values(const QString& name) const
{
+ QMutexLocker l(get_mtx());
+
auto it = connected_values.find(name);
if (it != connected_values.cend())
- {
- for (value_type val : std::get<0>((*it).second))
- {
- val->bundle_value_changed();
- }
- }
+ for (value_type val : it->second)
+ val->notify();
}
void connector::notify_all_values() const
{
- for (auto& pair : connected_values)
- for (value_type val : std::get<0>(pair.second))
- val->bundle_value_changed();
+ QMutexLocker l(get_mtx());
+
+ for (const auto& [k, v] : connected_values)
+ for (value_type val : v)
+ val->notify();
}
-connector::connector()
+void connector::set_all_to_default_()
{
-}
+ QMutexLocker l(get_mtx());
+ for (auto& pair : connected_values)
+ for (auto& val : pair.second)
+ val->set_to_default();
}
-}
+} // ns options::detail