summaryrefslogtreecommitdiffhomepage
path: root/options/connector.hpp
diff options
context:
space:
mode:
authorStanislaw Halik <sthalik@misaki.pl>2016-08-25 11:58:24 +0200
committerStanislaw Halik <sthalik@misaki.pl>2016-08-25 13:37:23 +0200
commit39169acf3bc2bc43cc32a6455d43e9588765c84a (patch)
tree3e0cbee0c68e15c87fe34746d1e9eb148ddd7bd1 /options/connector.hpp
parentc7532ed82f57e4281d3f5ecded59a95a4f756b04 (diff)
options: use non-generic comparison for bundle modification check
The generic QVariant comparison works badly for QList<QPointF>. Create a comparator between two QVariants for base_value in value<tp> ctor, using QVariant::value<tp> which returns right results once it's converted to tp. If a value was registered for a name in a bundle, use that comparator as the comparator for that name. In case conflicting value types were registered always use generic comparison for that name. std::type_index needs to be used here since value<t> can be instantiated in different modules (libraries), resulting in different value for the comparator function pointer. Move group::operator== to bundle type to avoid circular include for connector.h. Also use element_type more consistently in value<tp>.
Diffstat (limited to 'options/connector.hpp')
-rw-r--r--options/connector.hpp11
1 files changed, 10 insertions, 1 deletions
diff --git a/options/connector.hpp b/options/connector.hpp
index b9b1259f..6aba79e2 100644
--- a/options/connector.hpp
+++ b/options/connector.hpp
@@ -2,6 +2,10 @@
#include <map>
#include <vector>
+#include <tuple>
+#include <typeinfo>
+#include <typeindex>
+#include <QVariant>
#include <QString>
#include <QMutex>
#include <QMutexLocker>
@@ -18,7 +22,10 @@ class OPENTRACK_OPTIONS_EXPORT connector
{
friend class ::options::base_value;
- std::map<QString, std::vector<const base_value*>> connected_values;
+ using value_vec = std::vector<const base_value*>;
+ using comparator = bool(*)(const QVariant&, const QVariant&);
+ using tt = std::tuple<value_vec, comparator, std::type_index>;
+ std::map<QString, tt> connected_values;
void on_value_destructed(const QString& name, const base_value* val);
void on_value_created(const QString& name, const base_value* val);
@@ -33,6 +40,8 @@ public:
connector();
virtual ~connector();
+ bool is_equal(const QString& name, const QVariant& val1, const QVariant& val2) const;
+
connector(const connector&) = default;
connector& operator=(const connector&) = default;
connector(connector&&) = default;