swift
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 
12 namespace 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()) { return this->isWildcard(); }
32  const auto &map = this->map();
33  for (auto it = map.begin(); it != map.end(); ++it)
34  {
35  // QVariant cannot be compared directly
36  const CVariant p = variant.propertyByIndex(it.key()); // from value object
37  const CVariant v = it.value(); // from map
38  if (p != v) return false;
39  }
40  return true;
41  }
42 
43  QString CPropertyIndexVariantMap::convertToQString(bool i18n) const
44  {
45  if (this->isEmpty()) return QStringLiteral("{wildcard: %1}").arg(m_wildcard ? "true" : "false");
46  QString s;
47  for (const CPropertyIndex &index : makeKeysRange(m_values))
48  {
49  CVariant v = m_values.value(index);
50 
51  s.isEmpty() ? s.append("{wildcard: ").append(m_wildcard ? "true" : "false").append(" ") : s.append(", ");
52 
53  s.append('{').append(index.toQString(i18n)).append(": ");
54  s.append("(").append(QString::number(v.userType())).append(") ");
55  QString vs = v.toQString(i18n);
56  s.append(vs);
57  s.append('}');
58  }
59  s = s.append("}");
60  return s;
61  }
62 
63  void CPropertyIndexVariantMap::marshallToDbus(QDBusArgument &argument) const
64  {
65  argument << m_values.keys();
66  argument << m_values.values();
67  }
68 
69  void CPropertyIndexVariantMap::unmarshallFromDbus(const QDBusArgument &argument)
70  {
71  QList<CPropertyIndex> indexes;
72  QList<CVariant> values;
73  argument >> indexes;
74  argument >> values;
75  Q_ASSERT(indexes.size() == values.size());
77  for (int i = 0; i < indexes.size(); i++) { newMap.insert(indexes[i], values[i]); }
78  // replace values in one step
79  m_values.swap(newMap);
80  }
81 
82  void CPropertyIndexVariantMap::marshalToDataStream(QDataStream &stream) const
83  {
84  stream << m_values.keys();
85  stream << m_values.values();
86  }
87 
88  void CPropertyIndexVariantMap::unmarshalFromDataStream(QDataStream &stream)
89  {
90  QList<CPropertyIndex> indexes;
91  QList<CVariant> values;
92  stream >> indexes;
93  stream >> values;
94  Q_ASSERT(indexes.size() == values.size());
96  for (int i = 0; i < indexes.size(); i++) { newMap.insert(indexes[i], values[i]); }
97  // replace values in one step
98  m_values.swap(newMap);
99  }
100 
101  void CPropertyIndexVariantMap::addValue(const CPropertyIndex &index, const CVariant &value)
102  {
103  m_values.insert(index, value);
104  }
105 
106  void CPropertyIndexVariantMap::addValue(const CPropertyIndex &index, const char *str)
107  {
108  this->addValue(index, QString(str));
109  }
110 
111  void CPropertyIndexVariantMap::prependIndex(int index)
112  {
114  for (const CPropertyIndex &pi : this->indexes())
115  {
116  CPropertyIndex newPi(pi);
117  newPi.prepend(index);
118  newMap.insert(newPi, m_values[pi]);
119  }
120  m_values = newMap;
121  }
122 
123  CPropertyIndexList CPropertyIndexVariantMap::indexes() const { return m_values.keys(); }
124 
125  int CPropertyIndexVariantMap::size() const { return m_values.size(); }
126 
127  size_t CPropertyIndexVariantMap::getValueHash() const
128  {
129  // there is no hash for map, so I use this workaround here
130  return qHash(this->toQString(false));
131  }
132 } // namespace swift::misc
133 
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:86
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:353