Absolute File Name: | /home/opencoverage/opencoverage/guest-scripts/qtdeclarative/src/qtdeclarative/src/qml/jsruntime/qv4sparsearray_p.h |
Source code | Switch to Preprocessed file |
Line | Source | Count | ||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
1 | /**************************************************************************** | - | ||||||||||||
2 | ** | - | ||||||||||||
3 | ** Copyright (C) 2016 The Qt Company Ltd. | - | ||||||||||||
4 | ** Contact: https://www.qt.io/licensing/ | - | ||||||||||||
5 | ** | - | ||||||||||||
6 | ** This file is part of the QtCore module of the Qt Toolkit. | - | ||||||||||||
7 | ** | - | ||||||||||||
8 | ** $QT_BEGIN_LICENSE:LGPL$ | - | ||||||||||||
9 | ** Commercial License Usage | - | ||||||||||||
10 | ** Licensees holding valid commercial Qt licenses may use this file in | - | ||||||||||||
11 | ** accordance with the commercial license agreement provided with the | - | ||||||||||||
12 | ** Software or, alternatively, in accordance with the terms contained in | - | ||||||||||||
13 | ** a written agreement between you and The Qt Company. For licensing terms | - | ||||||||||||
14 | ** and conditions see https://www.qt.io/terms-conditions. For further | - | ||||||||||||
15 | ** information use the contact form at https://www.qt.io/contact-us. | - | ||||||||||||
16 | ** | - | ||||||||||||
17 | ** GNU Lesser General Public License Usage | - | ||||||||||||
18 | ** Alternatively, this file may be used under the terms of the GNU Lesser | - | ||||||||||||
19 | ** General Public License version 3 as published by the Free Software | - | ||||||||||||
20 | ** Foundation and appearing in the file LICENSE.LGPL3 included in the | - | ||||||||||||
21 | ** packaging of this file. Please review the following information to | - | ||||||||||||
22 | ** ensure the GNU Lesser General Public License version 3 requirements | - | ||||||||||||
23 | ** will be met: https://www.gnu.org/licenses/lgpl-3.0.html. | - | ||||||||||||
24 | ** | - | ||||||||||||
25 | ** GNU General Public License Usage | - | ||||||||||||
26 | ** Alternatively, this file may be used under the terms of the GNU | - | ||||||||||||
27 | ** General Public License version 2.0 or (at your option) the GNU General | - | ||||||||||||
28 | ** Public license version 3 or any later version approved by the KDE Free | - | ||||||||||||
29 | ** Qt Foundation. The licenses are as published by the Free Software | - | ||||||||||||
30 | ** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3 | - | ||||||||||||
31 | ** included in the packaging of this file. Please review the following | - | ||||||||||||
32 | ** information to ensure the GNU General Public License requirements will | - | ||||||||||||
33 | ** be met: https://www.gnu.org/licenses/gpl-2.0.html and | - | ||||||||||||
34 | ** https://www.gnu.org/licenses/gpl-3.0.html. | - | ||||||||||||
35 | ** | - | ||||||||||||
36 | ** $QT_END_LICENSE$ | - | ||||||||||||
37 | ** | - | ||||||||||||
38 | ****************************************************************************/ | - | ||||||||||||
39 | - | |||||||||||||
40 | #ifndef QV4SPARSEARRAY_H | - | ||||||||||||
41 | #define QV4SPARSEARRAY_H | - | ||||||||||||
42 | - | |||||||||||||
43 | // | - | ||||||||||||
44 | // W A R N I N G | - | ||||||||||||
45 | // ------------- | - | ||||||||||||
46 | // | - | ||||||||||||
47 | // This file is not part of the Qt API. It exists purely as an | - | ||||||||||||
48 | // implementation detail. This header file may change from version to | - | ||||||||||||
49 | // version without notice, or even be removed. | - | ||||||||||||
50 | // | - | ||||||||||||
51 | // We mean it. | - | ||||||||||||
52 | // | - | ||||||||||||
53 | - | |||||||||||||
54 | #include "qv4global_p.h" | - | ||||||||||||
55 | #include "qv4value_p.h" | - | ||||||||||||
56 | #include <QtCore/qlist.h> | - | ||||||||||||
57 | - | |||||||||||||
58 | //#define Q_MAP_DEBUG | - | ||||||||||||
59 | #ifdef Q_MAP_DEBUG | - | ||||||||||||
60 | #include <QtCore/qdebug.h> | - | ||||||||||||
61 | #endif | - | ||||||||||||
62 | - | |||||||||||||
63 | #include <new> | - | ||||||||||||
64 | - | |||||||||||||
65 | QT_BEGIN_NAMESPACE | - | ||||||||||||
66 | - | |||||||||||||
67 | namespace QV4 { | - | ||||||||||||
68 | - | |||||||||||||
69 | struct SparseArray; | - | ||||||||||||
70 | - | |||||||||||||
71 | struct SparseArrayNode | - | ||||||||||||
72 | { | - | ||||||||||||
73 | quintptr p; | - | ||||||||||||
74 | SparseArrayNode *left; | - | ||||||||||||
75 | SparseArrayNode *right; | - | ||||||||||||
76 | uint size_left; | - | ||||||||||||
77 | uint value; | - | ||||||||||||
78 | - | |||||||||||||
79 | enum Color { Red = 0, Black = 1 }; | - | ||||||||||||
80 | enum { Mask = 3 }; // reserve the second bit as well | - | ||||||||||||
81 | - | |||||||||||||
82 | const SparseArrayNode *nextNode() const; | - | ||||||||||||
83 | SparseArrayNode *nextNode() { return const_cast<SparseArrayNode *>(const_cast<const SparseArrayNode *>(this)->nextNode()); } executed 1549 times by 2 tests: return const_cast<SparseArrayNode *>(const_cast<const SparseArrayNode *>(this)->nextNode()); Executed by:
| 1549 | ||||||||||||
84 | const SparseArrayNode *previousNode() const; | - | ||||||||||||
85 | SparseArrayNode *previousNode() { return const_cast<SparseArrayNode *>(const_cast<const SparseArrayNode *>(this)->previousNode()); } executed 362 times by 1 test: return const_cast<SparseArrayNode *>(const_cast<const SparseArrayNode *>(this)->previousNode()); Executed by:
| 362 | ||||||||||||
86 | - | |||||||||||||
87 | Color color() const { return Color(p & 1); } executed 5531 times by 2 tests: return Color(p & 1); Executed by:
| 5531 | ||||||||||||
88 | void setColor(Color c) { if (c == Black) p |= Black; else p &= ~Black; } executed 8308 times by 2 tests: p |= Black; Executed by:
executed 7823 times by 2 tests: p &= ~Black; Executed by:
| 7821-8309 | ||||||||||||
89 | SparseArrayNode *parent() const { return reinterpret_cast<SparseArrayNode *>(p & ~Mask); } executed 28724 times by 2 tests: return reinterpret_cast<SparseArrayNode *>(p & ~Mask); Executed by:
| 28724 | ||||||||||||
90 | void setParent(SparseArrayNode *pp) { p = (p & Mask) | quintptr(pp); } executed 8948 times by 2 tests: end of block Executed by:
| 8948 | ||||||||||||
91 | - | |||||||||||||
92 | uint key() const { | - | ||||||||||||
93 | uint k = size_left; | - | ||||||||||||
94 | const SparseArrayNode *n = this; | - | ||||||||||||
95 | while (SparseArrayNode *p = n->parent()) {
| 1004-1459 | ||||||||||||
96 | if (p && p->right == n)
| 0-1459 | ||||||||||||
97 | k += p->size_left; executed 240 times by 2 tests: k += p->size_left; Executed by:
| 240 | ||||||||||||
98 | n = p; | - | ||||||||||||
99 | } executed 1460 times by 2 tests: end of block Executed by:
| 1460 | ||||||||||||
100 | return k; executed 1005 times by 2 tests: return k; Executed by:
| 1005 | ||||||||||||
101 | } | - | ||||||||||||
102 | - | |||||||||||||
103 | SparseArrayNode *copy(SparseArray *d) const; | - | ||||||||||||
104 | - | |||||||||||||
105 | SparseArrayNode *lowerBound(uint key); | - | ||||||||||||
106 | SparseArrayNode *upperBound(uint key); | - | ||||||||||||
107 | }; | - | ||||||||||||
108 | - | |||||||||||||
109 | - | |||||||||||||
110 | inline SparseArrayNode *SparseArrayNode::lowerBound(uint akey) | - | ||||||||||||
111 | { | - | ||||||||||||
112 | SparseArrayNode *n = this; | - | ||||||||||||
113 | SparseArrayNode *last = nullptr; | - | ||||||||||||
114 | while (n) {
| 158-352 | ||||||||||||
115 | if (akey <= n->size_left) {
| 170-182 | ||||||||||||
116 | last = n; | - | ||||||||||||
117 | n = n->left; | - | ||||||||||||
118 | } else { executed 170 times by 1 test: end of block Executed by:
| 170 | ||||||||||||
119 | akey -= n->size_left; | - | ||||||||||||
120 | n = n->right; | - | ||||||||||||
121 | } executed 182 times by 1 test: end of block Executed by:
| 182 | ||||||||||||
122 | } | - | ||||||||||||
123 | return last; executed 158 times by 1 test: return last; Executed by:
| 158 | ||||||||||||
124 | } | - | ||||||||||||
125 | - | |||||||||||||
126 | - | |||||||||||||
127 | inline SparseArrayNode *SparseArrayNode::upperBound(uint akey) | - | ||||||||||||
128 | { | - | ||||||||||||
129 | SparseArrayNode *n = this; | - | ||||||||||||
130 | SparseArrayNode *last = nullptr; | - | ||||||||||||
131 | while (n) {
| 0 | ||||||||||||
132 | if (akey < n->size_left) {
| 0 | ||||||||||||
133 | last = n; | - | ||||||||||||
134 | n = n->left; | - | ||||||||||||
135 | } else { never executed: end of block | 0 | ||||||||||||
136 | akey -= n->size_left; | - | ||||||||||||
137 | n = n->right; | - | ||||||||||||
138 | } never executed: end of block | 0 | ||||||||||||
139 | } | - | ||||||||||||
140 | return last; never executed: return last; | 0 | ||||||||||||
141 | } | - | ||||||||||||
142 | - | |||||||||||||
143 | - | |||||||||||||
144 | - | |||||||||||||
145 | struct Q_QML_EXPORT SparseArray | - | ||||||||||||
146 | { | - | ||||||||||||
147 | SparseArray(); | - | ||||||||||||
148 | ~SparseArray() { | - | ||||||||||||
149 | if (root())
| 262-2944 | ||||||||||||
150 | freeTree(header.left, Q_ALIGNOF(SparseArrayNode)); executed 2944 times by 2 tests: freeTree(header.left, alignof(SparseArrayNode)); Executed by:
| 2944 | ||||||||||||
151 | } executed 3206 times by 2 tests: end of block Executed by:
| 3206 | ||||||||||||
152 | - | |||||||||||||
153 | SparseArray(const SparseArray &other); | - | ||||||||||||
154 | - | |||||||||||||
155 | Value freeList; | - | ||||||||||||
156 | private: | - | ||||||||||||
157 | SparseArray &operator=(const SparseArray &other); | - | ||||||||||||
158 | - | |||||||||||||
159 | int numEntries; | - | ||||||||||||
160 | SparseArrayNode header; | - | ||||||||||||
161 | SparseArrayNode *mostLeftNode; | - | ||||||||||||
162 | - | |||||||||||||
163 | void rotateLeft(SparseArrayNode *x); | - | ||||||||||||
164 | void rotateRight(SparseArrayNode *x); | - | ||||||||||||
165 | void rebalance(SparseArrayNode *x); | - | ||||||||||||
166 | void recalcMostLeftNode(); | - | ||||||||||||
167 | - | |||||||||||||
168 | SparseArrayNode *root() const { return header.left; } executed 27376298 times by 2 tests: return header.left; Executed by:
| 27376298 | ||||||||||||
169 | - | |||||||||||||
170 | void deleteNode(SparseArrayNode *z); | - | ||||||||||||
171 | - | |||||||||||||
172 | - | |||||||||||||
173 | public: | - | ||||||||||||
174 | SparseArrayNode *createNode(uint sl, SparseArrayNode *parent, bool left); | - | ||||||||||||
175 | void freeTree(SparseArrayNode *root, int alignment); | - | ||||||||||||
176 | - | |||||||||||||
177 | SparseArrayNode *findNode(uint akey) const; | - | ||||||||||||
178 | - | |||||||||||||
179 | uint nEntries() const { return numEntries; } never executed: return numEntries; | 0 | ||||||||||||
180 | - | |||||||||||||
181 | uint pop_front(); | - | ||||||||||||
182 | void push_front(uint at); | - | ||||||||||||
183 | uint pop_back(uint len); | - | ||||||||||||
184 | void push_back(uint at, uint len); | - | ||||||||||||
185 | - | |||||||||||||
186 | QList<int> keys() const; | - | ||||||||||||
187 | - | |||||||||||||
188 | const SparseArrayNode *end() const { return &header; } never executed: return &header; | 0 | ||||||||||||
189 | SparseArrayNode *end() { return &header; } executed 13756 times by 2 tests: return &header; Executed by:
| 13756 | ||||||||||||
190 | const SparseArrayNode *begin() const { if (root()) return mostLeftNode; return end(); } never executed: return mostLeftNode; never executed: return end();
| 0 | ||||||||||||
191 | SparseArrayNode *begin() { if (root()) return mostLeftNode; return end(); } executed 613 times by 2 tests: return mostLeftNode; Executed by:
executed 38 times by 1 test: return end(); Executed by:
| 38-613 | ||||||||||||
192 | - | |||||||||||||
193 | SparseArrayNode *erase(SparseArrayNode *n); | - | ||||||||||||
194 | - | |||||||||||||
195 | SparseArrayNode *lowerBound(uint key); | - | ||||||||||||
196 | const SparseArrayNode *lowerBound(uint key) const; | - | ||||||||||||
197 | SparseArrayNode *upperBound(uint key); | - | ||||||||||||
198 | const SparseArrayNode *upperBound(uint key) const; | - | ||||||||||||
199 | SparseArrayNode *insert(uint akey); | - | ||||||||||||
200 | - | |||||||||||||
201 | // STL compatibility | - | ||||||||||||
202 | typedef uint key_type; | - | ||||||||||||
203 | typedef int mapped_type; | - | ||||||||||||
204 | typedef qptrdiff difference_type; | - | ||||||||||||
205 | typedef int size_type; | - | ||||||||||||
206 | - | |||||||||||||
207 | #ifdef Q_MAP_DEBUG | - | ||||||||||||
208 | void dump() const; | - | ||||||||||||
209 | #endif | - | ||||||||||||
210 | }; | - | ||||||||||||
211 | - | |||||||||||||
212 | inline SparseArrayNode *SparseArray::findNode(uint akey) const | - | ||||||||||||
213 | { | - | ||||||||||||
214 | SparseArrayNode *n = root(); | - | ||||||||||||
215 | - | |||||||||||||
216 | while (n) {
| 27363093-101893349 | ||||||||||||
217 | if (akey == n->size_left) {
| 23275-101877363 | ||||||||||||
218 | return n; executed 23278 times by 2 tests: return n; Executed by:
| 23278 | ||||||||||||
219 | } else if (akey < n->size_left) {
| 27676901-74260435 | ||||||||||||
220 | n = n->left; | - | ||||||||||||
221 | } else { executed 27679471 times by 2 tests: end of block Executed by:
| 27679471 | ||||||||||||
222 | akey -= n->size_left; | - | ||||||||||||
223 | n = n->right; | - | ||||||||||||
224 | } executed 74263779 times by 2 tests: end of block Executed by:
| 74263779 | ||||||||||||
225 | } | - | ||||||||||||
226 | - | |||||||||||||
227 | return nullptr; executed 27369006 times by 2 tests: return nullptr; Executed by:
| 27369006 | ||||||||||||
228 | } | - | ||||||||||||
229 | - | |||||||||||||
230 | inline uint SparseArray::pop_front() | - | ||||||||||||
231 | { | - | ||||||||||||
232 | uint idx = UINT_MAX ; | - | ||||||||||||
233 | - | |||||||||||||
234 | SparseArrayNode *n = findNode(0); | - | ||||||||||||
235 | if (n) {
| 0 | ||||||||||||
236 | idx = n->value; | - | ||||||||||||
237 | deleteNode(n); | - | ||||||||||||
238 | // adjust all size_left indices on the path to leftmost item by 1 | - | ||||||||||||
239 | SparseArrayNode *n = root(); | - | ||||||||||||
240 | while (n) {
| 0 | ||||||||||||
241 | n->size_left -= 1; | - | ||||||||||||
242 | n = n->left; | - | ||||||||||||
243 | } never executed: end of block | 0 | ||||||||||||
244 | } never executed: end of block | 0 | ||||||||||||
245 | return idx; never executed: return idx; | 0 | ||||||||||||
246 | } | - | ||||||||||||
247 | - | |||||||||||||
248 | inline void SparseArray::push_front(uint value) | - | ||||||||||||
249 | { | - | ||||||||||||
250 | // adjust all size_left indices on the path to leftmost item by 1 | - | ||||||||||||
251 | SparseArrayNode *n = root(); | - | ||||||||||||
252 | while (n) {
| 0 | ||||||||||||
253 | n->size_left += 1; | - | ||||||||||||
254 | n = n->left; | - | ||||||||||||
255 | } never executed: end of block | 0 | ||||||||||||
256 | n = insert(0); | - | ||||||||||||
257 | n->value = value; | - | ||||||||||||
258 | } never executed: end of block | 0 | ||||||||||||
259 | - | |||||||||||||
260 | inline uint SparseArray::pop_back(uint len) | - | ||||||||||||
261 | { | - | ||||||||||||
262 | uint idx = UINT_MAX; | - | ||||||||||||
263 | if (!len)
| 0 | ||||||||||||
264 | return idx; never executed: return idx; | 0 | ||||||||||||
265 | - | |||||||||||||
266 | SparseArrayNode *n = findNode(len - 1); | - | ||||||||||||
267 | if (n) {
| 0 | ||||||||||||
268 | idx = n->value; | - | ||||||||||||
269 | deleteNode(n); | - | ||||||||||||
270 | } never executed: end of block | 0 | ||||||||||||
271 | return idx; never executed: return idx; | 0 | ||||||||||||
272 | } | - | ||||||||||||
273 | - | |||||||||||||
274 | inline void SparseArray::push_back(uint index, uint len) | - | ||||||||||||
275 | { | - | ||||||||||||
276 | SparseArrayNode *n = insert(len); | - | ||||||||||||
277 | n->value = index; | - | ||||||||||||
278 | } never executed: end of block | 0 | ||||||||||||
279 | - | |||||||||||||
280 | #ifdef Q_MAP_DEBUG | - | ||||||||||||
281 | inline void SparseArray::dump() const | - | ||||||||||||
282 | { | - | ||||||||||||
283 | const SparseArrayNode *it = begin(); | - | ||||||||||||
284 | qDebug() << "map dump:"; | - | ||||||||||||
285 | while (it != end()) { | - | ||||||||||||
286 | const SparseArrayNode *n = it; | - | ||||||||||||
287 | int depth = 0; | - | ||||||||||||
288 | while (n && n != root()) { | - | ||||||||||||
289 | ++depth; | - | ||||||||||||
290 | n = n->parent(); | - | ||||||||||||
291 | } | - | ||||||||||||
292 | QByteArray space(4*depth, ' '); | - | ||||||||||||
293 | qDebug() << space << (it->color() == SparseArrayNode::Red ? "Red " : "Black") << it << it->size_left << it->left << it->right | - | ||||||||||||
294 | << it->key() << it->value; | - | ||||||||||||
295 | it = it->nextNode(); | - | ||||||||||||
296 | } | - | ||||||||||||
297 | qDebug() << "---------"; | - | ||||||||||||
298 | } | - | ||||||||||||
299 | #endif | - | ||||||||||||
300 | - | |||||||||||||
301 | - | |||||||||||||
302 | inline SparseArrayNode *SparseArray::erase(SparseArrayNode *n) | - | ||||||||||||
303 | { | - | ||||||||||||
304 | if (n == end())
| 0-600 | ||||||||||||
305 | return n; never executed: return n; | 0 | ||||||||||||
306 | - | |||||||||||||
307 | SparseArrayNode *next = n->nextNode(); | - | ||||||||||||
308 | deleteNode(n); | - | ||||||||||||
309 | return next; executed 599 times by 2 tests: return next; Executed by:
| 599 | ||||||||||||
310 | } | - | ||||||||||||
311 | - | |||||||||||||
312 | inline QList<int> SparseArray::keys() const | - | ||||||||||||
313 | { | - | ||||||||||||
314 | QList<int> res; | - | ||||||||||||
315 | res.reserve(numEntries); | - | ||||||||||||
316 | SparseArrayNode *n = mostLeftNode; | - | ||||||||||||
317 | while (n != end()) {
| 0 | ||||||||||||
318 | res.append(n->key()); | - | ||||||||||||
319 | n = n->nextNode(); | - | ||||||||||||
320 | } never executed: end of block | 0 | ||||||||||||
321 | return res; never executed: return res; | 0 | ||||||||||||
322 | } | - | ||||||||||||
323 | - | |||||||||||||
324 | inline const SparseArrayNode *SparseArray::lowerBound(uint akey) const | - | ||||||||||||
325 | { | - | ||||||||||||
326 | const SparseArrayNode *lb = root()->lowerBound(akey); | - | ||||||||||||
327 | if (!lb)
| 0 | ||||||||||||
328 | lb = end(); never executed: lb = end(); | 0 | ||||||||||||
329 | return lb; never executed: return lb; | 0 | ||||||||||||
330 | } | - | ||||||||||||
331 | - | |||||||||||||
332 | - | |||||||||||||
333 | inline SparseArrayNode *SparseArray::lowerBound(uint akey) | - | ||||||||||||
334 | { | - | ||||||||||||
335 | SparseArrayNode *lb = root()->lowerBound(akey); | - | ||||||||||||
336 | if (!lb)
| 0-158 | ||||||||||||
337 | lb = end(); never executed: lb = end(); | 0 | ||||||||||||
338 | return lb; executed 158 times by 1 test: return lb; Executed by:
| 158 | ||||||||||||
339 | } | - | ||||||||||||
340 | - | |||||||||||||
341 | - | |||||||||||||
342 | inline const SparseArrayNode *SparseArray::upperBound(uint akey) const | - | ||||||||||||
343 | { | - | ||||||||||||
344 | const SparseArrayNode *ub = root()->upperBound(akey); | - | ||||||||||||
345 | if (!ub)
| 0 | ||||||||||||
346 | ub = end(); never executed: ub = end(); | 0 | ||||||||||||
347 | return ub; never executed: return ub; | 0 | ||||||||||||
348 | } | - | ||||||||||||
349 | - | |||||||||||||
350 | - | |||||||||||||
351 | inline SparseArrayNode *SparseArray::upperBound(uint akey) | - | ||||||||||||
352 | { | - | ||||||||||||
353 | SparseArrayNode *ub = root()->upperBound(akey); | - | ||||||||||||
354 | if (!ub)
| 0 | ||||||||||||
355 | ub = end(); never executed: ub = end(); | 0 | ||||||||||||
356 | return ub; never executed: return ub; | 0 | ||||||||||||
357 | } | - | ||||||||||||
358 | - | |||||||||||||
359 | } | - | ||||||||||||
360 | - | |||||||||||||
361 | QT_END_NAMESPACE | - | ||||||||||||
362 | - | |||||||||||||
363 | #endif | - | ||||||||||||
Source code | Switch to Preprocessed file |