diff options
author | Stanislaw Halik <sthalik@misaki.pl> | 2016-08-25 11:58:24 +0200 |
---|---|---|
committer | Stanislaw Halik <sthalik@misaki.pl> | 2016-08-25 13:37:23 +0200 |
commit | 39169acf3bc2bc43cc32a6455d43e9588765c84a (patch) | |
tree | 3e0cbee0c68e15c87fe34746d1e9eb148ddd7bd1 /options/connector.hpp | |
parent | c7532ed82f57e4281d3f5ecded59a95a4f756b04 (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.hpp | 11 |
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; |