Akonadi

imapset.cpp
1 /*
2  SPDX-FileCopyrightText: 2007 Volker Krause <[email protected]>
3 
4  SPDX-License-Identifier: LGPL-2.0-or-later
5 */
6 
7 #include "datastream_p_p.h"
8 #include "imapset_p.h"
9 
10 #include <QSharedData>
11 
12 #include <limits>
13 
14 namespace Akonadi
15 {
16 class ImapIntervalPrivate : public QSharedData
17 {
18 public:
19  ImapInterval::Id begin = 0;
20  ImapInterval::Id end = 0;
21 };
22 
23 class ImapSetPrivate : public QSharedData
24 {
25 public:
26  template<typename T> void add(const T &values)
27  {
28  T vals = values;
29  std::sort(vals.begin(), vals.end());
30  for (int i = 0; i < vals.count(); ++i) {
31  const int begin = vals[i];
32  Q_ASSERT(begin >= 0);
33  if (i == vals.count() - 1) {
34  intervals << ImapInterval(begin, begin);
35  break;
36  }
37  do {
38  ++i;
39  Q_ASSERT(vals[i] >= 0);
40  if (vals[i] != (vals[i - 1] + 1)) {
41  --i;
42  break;
43  }
44  } while (i < vals.count() - 1);
45  intervals << ImapInterval(begin, vals[i]);
46  }
47  }
48 
49  ImapInterval::List intervals;
50 };
51 
52 ImapInterval::ImapInterval()
53  : d(new ImapIntervalPrivate)
54 {
55 }
56 
57 ImapInterval::ImapInterval(const ImapInterval &other)
58  : d(other.d)
59 {
60 }
61 
62 ImapInterval::ImapInterval(Id begin, Id end)
63  : d(new ImapIntervalPrivate)
64 {
65  d->begin = begin;
66  d->end = end;
67 }
68 
69 ImapInterval::~ImapInterval() = default;
70 
71 ImapInterval &ImapInterval::operator=(const ImapInterval &other)
72 {
73  if (this != &other) {
74  d = other.d;
75  }
76 
77  return *this;
78 }
79 
80 bool ImapInterval::operator==(const ImapInterval &other) const
81 {
82  return (d->begin == other.d->begin && d->end == other.d->end);
83 }
84 
85 ImapInterval::Id ImapInterval::size() const
86 {
87  if (!d->begin && !d->end) {
88  return 0;
89  }
90 
91  return (d->end - d->begin + 1);
92 }
93 
94 bool ImapInterval::hasDefinedBegin() const
95 {
96  return (d->begin != 0);
97 }
98 
99 ImapInterval::Id ImapInterval::begin() const
100 {
101  return d->begin;
102 }
103 
104 bool ImapInterval::hasDefinedEnd() const
105 {
106  return (d->end != 0);
107 }
108 
109 ImapInterval::Id ImapInterval::end() const
110 {
111  if (hasDefinedEnd()) {
112  return d->end;
113  }
114 
115  return std::numeric_limits<Id>::max();
116 }
117 
118 void ImapInterval::setBegin(Id value)
119 {
120  Q_ASSERT(value >= 0);
121  Q_ASSERT(value <= d->end || !hasDefinedEnd());
122  d->begin = value;
123 }
124 
125 void ImapInterval::setEnd(Id value)
126 {
127  Q_ASSERT(value >= 0);
128  Q_ASSERT(value >= d->begin || !hasDefinedBegin());
129  d->end = value;
130 }
131 
132 QByteArray Akonadi::ImapInterval::toImapSequence() const
133 {
134  if (size() == 0) {
135  return QByteArray();
136  }
137 
138  if (size() == 1) {
139  return QByteArray::number(d->begin);
140  }
141 
142  QByteArray rv = QByteArray::number(d->begin) + ':';
143 
144  if (hasDefinedEnd()) {
145  rv += QByteArray::number(d->end);
146  } else {
147  rv += '*';
148  }
149 
150  return rv;
151 }
152 
153 ImapSet::ImapSet()
154  : d(new ImapSetPrivate)
155 {
156 }
157 
158 ImapSet::ImapSet(Id id)
159  : d(new ImapSetPrivate)
160 {
161  add(QVector<Id>() << id);
162 }
163 #if QT_VERSION < QT_VERSION_CHECK(6, 0, 0)
164 ImapSet::ImapSet(const QVector<qint64> &ids)
165  : d(new ImapSetPrivate)
166 {
167  add(ids);
168 }
169 #endif
170 ImapSet::ImapSet(const QList<qint64> &ids)
171  : d(new ImapSetPrivate)
172 {
173  add(ids);
174 }
175 
176 ImapSet::ImapSet(const ImapInterval &interval)
177  : d(new ImapSetPrivate)
178 {
179  add(interval);
180 }
181 
182 ImapSet::ImapSet(const ImapSet &other)
183  : d(other.d)
184 {
185 }
186 
187 ImapSet::~ImapSet()
188 {
189 }
190 
191 ImapSet ImapSet::all()
192 {
193  ImapSet set;
194  set.add(ImapInterval(1, 0));
195  return set;
196 }
197 
198 ImapSet &ImapSet::operator=(const ImapSet &other)
199 {
200  if (this != &other) {
201  d = other.d;
202  }
203 
204  return *this;
205 }
206 
207 bool ImapSet::operator==(const ImapSet &other) const
208 {
209  return d->intervals == other.d->intervals;
210 }
211 #if QT_VERSION < QT_VERSION_CHECK(6, 0, 0)
212 void ImapSet::add(const QVector<Id> &values)
213 {
214  d->add(values);
215 }
216 #endif
217 void ImapSet::add(const QList<Id> &values)
218 {
219  d->add(values);
220 }
221 
222 void ImapSet::add(const QSet<Id> &values)
223 {
224  QVector<Id> v;
225  v.reserve(values.size());
226  for (QSet<Id>::ConstIterator iter = values.constBegin(); iter != values.constEnd(); ++iter) {
227  v.push_back(*iter);
228  }
229 
230  add(v);
231 }
232 
233 void ImapSet::add(const ImapInterval &interval)
234 {
235  d->intervals << interval;
236 }
237 
238 QByteArray ImapSet::toImapSequenceSet() const
239 {
240  QByteArray rv;
241  for (auto iter = d->intervals.cbegin(), end = d->intervals.cend(); iter != end; ++iter) {
242  if (iter != d->intervals.cbegin()) {
243  rv += ',';
244  }
245  rv += iter->toImapSequence();
246  }
247 
248  return rv;
249 }
250 
251 ImapInterval::List ImapSet::intervals() const
252 {
253  return d->intervals;
254 }
255 
256 bool ImapSet::isEmpty() const
257 {
258  return d->intervals.isEmpty() || (d->intervals.size() == 1 && d->intervals.at(0).size() == 0);
259 }
260 
261 Protocol::DataStream &operator<<(Protocol::DataStream &stream, const Akonadi::ImapInterval &interval)
262 {
263  return stream << interval.d->begin << interval.d->end;
264 }
265 
266 Protocol::DataStream &operator>>(Protocol::DataStream &stream, Akonadi::ImapInterval &interval)
267 {
268  return stream >> interval.d->begin >> interval.d->end;
269 }
270 
271 Protocol::DataStream &operator<<(Protocol::DataStream &stream, const Akonadi::ImapSet &set)
272 {
273  return stream << set.d->intervals;
274 }
275 
276 Protocol::DataStream &operator>>(Protocol::DataStream &stream, Akonadi::ImapSet &set)
277 {
278  return stream >> set.d->intervals;
279 }
280 
281 } // namespace Akonadi
282 
283 using namespace Akonadi;
284 
285 QDebug operator<<(QDebug d, const Akonadi::ImapInterval &interval)
286 {
287  d << interval.toImapSequence();
288  return d;
289 }
290 
291 QDebug operator<<(QDebug d, const Akonadi::ImapSet &set)
292 {
293  d << set.toImapSequenceSet();
294  return d;
295 }
void push_back(const T &value)
QByteArray number(int n, int base)
QDataStream & operator<<(QDataStream &out, const KDateTime &dateTime)
const QList< QKeySequence > & begin()
Definition: item.h:32
KGuiItem add()
void reserve(int size)
bool isEmpty() const const
QDataStream & operator>>(QDataStream &in, KDateTime &dateTime)
QVector< V > values(const QMultiHash< K, V > &c)
const QList< QKeySequence > & end()
Helper integration between Akonadi and Qt.
This file is part of the KDE documentation.
Documentation copyright © 1996-2022 The KDE developers.
Generated on Thu Jun 30 2022 03:51:46 by doxygen 1.8.17 written by Dimitri van Heesch, © 1997-2006

KDE's Doxygen guidelines are available online.