swift
Loading...
Searching...
No Matches
propertyindexvariantmap.cpp
1// SPDX-FileCopyrightText: Copyright (C) 2013 swift Project Community / Contributors
2// SPDX-License-Identifier: GPL-3.0-or-later OR LicenseRef-swift-pilot-client-1
3
5
7
8#include <QHash>
9
10#include "misc/dictionary.h"
11
12namespace swift::misc
13{
14 CPropertyIndexVariantMap::CPropertyIndexVariantMap(bool wildcard) : m_wildcard(wildcard) {}
15
16 CPropertyIndexVariantMap::CPropertyIndexVariantMap(const CPropertyIndex &index, const CVariant &value)
17 : m_wildcard(false)
18 {
19 this->addValue(index, value);
20 }
21
22 bool operator==(const CPropertyIndexVariantMap &a, const CPropertyIndexVariantMap &b)
23 {
24 return a.m_wildcard == b.m_wildcard && a.m_values == b.m_values;
25 }
26
27 bool operator!=(const CPropertyIndexVariantMap &a, const CPropertyIndexVariantMap &b) { return !(b == a); }
28
29 bool CPropertyIndexVariantMap::matchesVariant(const CVariant &variant) const
30 {
31 if (this->isEmpty())
32 {
33 return this->isWildcard();
34 }
35 const auto &map = this->map();
36 for (auto it = map.begin(); it != map.end(); ++it)
37 {
38 // QVariant cannot be compared directly
39 const CVariant p = variant.propertyByIndex(it.key()); // from value object
40 const CVariant v = it.value(); // from map
41 if (p != v) return false;
42 }
43 return true;
44 }
45
46 QString CPropertyIndexVariantMap::convertToQString(bool i18n) const
47 {
48 if (this->isEmpty()) return QStringLiteral("{wildcard: %1}").arg(m_wildcard ? "true" : "false");
49 QString s;
50 for (const CPropertyIndex &index : makeKeysRange(m_values))
51 {
52 CVariant v = m_values.value(index);
53
54 s.isEmpty() ? s.append("{wildcard: ").append(m_wildcard ? "true" : "false").append(" ") : s.append(", ");
55
56 s.append('{').append(index.toQString(i18n)).append(": ");
57 s.append("(").append(QString::number(v.userType())).append(") ");
58 QString vs = v.toQString(i18n);
59 s.append(vs);
60 s.append('}');
61 }
62 s = s.append("}");
63 return s;
64 }
65
66 void CPropertyIndexVariantMap::marshallToDbus(QDBusArgument &argument) const
67 {
68 argument << m_values.keys();
69 argument << m_values.values();
70 }
71
72 void CPropertyIndexVariantMap::unmarshallFromDbus(const QDBusArgument &argument)
73 {
75 QList<CVariant> values;
76 argument >> indexes;
77 argument >> values;
78 Q_ASSERT(indexes.size() == values.size());
80 for (int i = 0; i < indexes.size(); i++)
81 {
82 newMap.insert(indexes[i], values[i]);
83 }
84 // replace values in one step
85 m_values.swap(newMap);
86 }
87
88 void CPropertyIndexVariantMap::marshalToDataStream(QDataStream &stream) const
89 {
90 stream << m_values.keys();
91 stream << m_values.values();
92 }
93
94 void CPropertyIndexVariantMap::unmarshalFromDataStream(QDataStream &stream)
95 {
97 QList<CVariant> values;
98 stream >> indexes;
99 stream >> values;
100 Q_ASSERT(indexes.size() == values.size());
102 for (int i = 0; i < indexes.size(); i++)
103 {
104 newMap.insert(indexes[i], values[i]);
105 }
106 // replace values in one step
107 m_values.swap(newMap);
108 }
109
110 void CPropertyIndexVariantMap::addValue(const CPropertyIndex &index, const CVariant &value)
111 {
112 m_values.insert(index, value);
113 }
114
115 void CPropertyIndexVariantMap::addValue(const CPropertyIndex &index, const char *str)
116 {
117 this->addValue(index, QString(str));
118 }
119
120 void CPropertyIndexVariantMap::prependIndex(int index)
121 {
123 for (const CPropertyIndex &pi : this->indexes())
124 {
125 CPropertyIndex newPi(pi);
126 newPi.prepend(index);
127 newMap.insert(newPi, m_values[pi]);
128 }
129 m_values = newMap;
130 }
131
132 CPropertyIndexList CPropertyIndexVariantMap::indexes() const { return m_values.keys(); }
133
134 int CPropertyIndexVariantMap::size() const { return m_values.size(); }
135
136 size_t CPropertyIndexVariantMap::getValueHash() const
137 {
138 // there is no hash for map, so I use this workaround here
139 return qHash(this->toQString(false));
140 }
141} // namespace swift::misc
142
bool operator!=(const AddAtc &lhs, const AddAtc &rhs)
Not equal operator.
Definition addatc.h:68
CPropertyIndexVariantMap(bool wildcard=false)
Constructor.
size_t qHash(const std::string &key, uint seed)
std::string qHash
Definition metaclass.h:84
Free functions in swift::misc.
auto makeKeysRange(const T &container)
Returns a const CRange for iterating over the keys of a Qt associative container.
Definition range.h:365
qsizetype size() const const
QMap< Key, T >::iterator insert(QMap< Key, T >::const_iterator pos, const Key &key, const T &value)
QList< Key > keys() const const
void swap(QMap< Key, T > &other)
QString & append(QChar ch)
QString arg(Args &&... args) const const
bool isEmpty() const const
QString number(double n, char format, int precision)
QFuture< void > map(Iterator begin, Iterator end, MapFunctor &&function)