42 while (y && n == y
->left) {
72
73
74
75
76
77
78void SparseArray::rotateLeft(SparseArrayNode *x)
80 SparseArrayNode *&root = header.left;
81 SparseArrayNode *y = x->right;
83 if (y->left !=
nullptr)
84 y->left->setParent(x);
85 y->setParent(x->parent());
88 else if (x == x->parent()->left)
89 x->parent()->left = y;
91 x->parent()->right = y;
94 y->size_left += x->size_left;
99
100
101
102
103
104
105void SparseArray::rotateRight(SparseArrayNode *x)
107 SparseArrayNode *&root = header.left;
108 SparseArrayNode *y = x->left;
110 if (y->right !=
nullptr)
111 y->right->setParent(x);
112 y->setParent(x->parent());
115 else if (x == x->parent()->right)
116 x->parent()->right = y;
118 x->parent()->left = y;
121 x->size_left -= y->size_left;
125void SparseArray::rebalance(SparseArrayNode *x)
127 SparseArrayNode *&root = header.left;
128 x->setColor(SparseArrayNode::Red);
129 while (x != root && x->parent()->color() == SparseArrayNode::Red) {
130 if (x->parent() == x->parent()->parent()->left) {
131 SparseArrayNode *y = x->parent()->parent()->right;
132 if (y && y->color() == SparseArrayNode::Red) {
133 x->parent()->setColor(SparseArrayNode::Black);
134 y->setColor(SparseArrayNode::Black);
135 x->parent()->parent()->setColor(SparseArrayNode::Red);
136 x = x->parent()->parent();
138 if (x == x->parent()->right) {
142 x->parent()->setColor(SparseArrayNode::Black);
143 x->parent()->parent()->setColor(SparseArrayNode::Red);
144 rotateRight (x->parent()->parent());
147 SparseArrayNode *y = x->parent()->parent()->left;
148 if (y && y->color() == SparseArrayNode::Red) {
149 x->parent()->setColor(SparseArrayNode::Black);
150 y->setColor(SparseArrayNode::Black);
151 x->parent()->parent()->setColor(SparseArrayNode::Red);
152 x = x->parent()->parent();
154 if (x == x->parent()->left) {
158 x->parent()->setColor(SparseArrayNode::Black);
159 x->parent()->parent()->setColor(SparseArrayNode::Red);
160 rotateLeft(x->parent()->parent());
164 root->setColor(SparseArrayNode::Black);
167void SparseArray::deleteNode(SparseArrayNode *z)
169 SparseArrayNode *&root = header.left;
170 SparseArrayNode *y = z;
172 SparseArrayNode *x_parent;
173 if (y->left ==
nullptr) {
175 if (y == mostLeftNode) {
179 mostLeftNode = y->parent();
181 }
else if (y->right ==
nullptr) {
185 while (y->left !=
nullptr)
192 z->size_left += y->size_left;
193 SparseArrayNode *n = y->parent();
195 n->size_left -= y->size_left;
202 x_parent = y->parent();
203 y->parent()->left = x;
209 x->setParent(x_parent);
211 x_parent = y->parent();
213 x->setParent(y->parent());
216 else if (y->parent()->left == y)
217 y->parent()->left = x;
219 y->parent()->right = x;
220 if (x && x == y->right)
221 x->size_left += y->size_left;
224 if (y->color() != SparseArrayNode::Red) {
225 while (x != root && (x ==
nullptr || x->color() == SparseArrayNode::Black)) {
226 if (x == x_parent->left) {
227 SparseArrayNode *w = x_parent->right;
228 if (w->color() == SparseArrayNode::Red) {
229 w->setColor(SparseArrayNode::Black);
230 x_parent->setColor(SparseArrayNode::Red);
231 rotateLeft(x_parent);
234 if ((w->left ==
nullptr || w->left->color() == SparseArrayNode::Black) &&
235 (w->right ==
nullptr || w->right->color() == SparseArrayNode::Black)) {
236 w->setColor(SparseArrayNode::Red);
238 x_parent = x_parent->parent();
240 if (w->right ==
nullptr || w->right->color() == SparseArrayNode::Black) {
242 w->left->setColor(SparseArrayNode::Black);
243 w->setColor(SparseArrayNode::Red);
247 w->setColor(x_parent->color());
248 x_parent->setColor(SparseArrayNode::Black);
250 w->right->setColor(SparseArrayNode::Black);
251 rotateLeft(x_parent);
255 SparseArrayNode *w = x_parent->left;
256 if (w->color() == SparseArrayNode::Red) {
257 w->setColor(SparseArrayNode::Black);
258 x_parent->setColor(SparseArrayNode::Red);
259 rotateRight(x_parent);
262 if ((w->right ==
nullptr || w->right->color() == SparseArrayNode::Black) &&
263 (w->left ==
nullptr || w->left->color() == SparseArrayNode::Black)) {
264 w->setColor(SparseArrayNode::Red);
266 x_parent = x_parent->parent();
268 if (w->left ==
nullptr || w->left->color() == SparseArrayNode::Black) {
270 w->right->setColor(SparseArrayNode::Black);
271 w->setColor(SparseArrayNode::Red);
275 w->setColor(x_parent->color());
276 x_parent->setColor(SparseArrayNode::Black);
278 w->left->setColor(SparseArrayNode::Black);
279 rotateRight(x_parent);
285 x->setColor(SparseArrayNode::Black);
291void SparseArray::recalcMostLeftNode()
293 mostLeftNode = &header;
294 while (mostLeftNode->left)
295 mostLeftNode = mostLeftNode->left;
303 return 2 *
sizeof(
void*);
309 ? qMallocAligned(alloc, alignment)
321SparseArrayNode *SparseArray::createNode(uint sl, SparseArrayNode *parent,
bool left)
323 SparseArrayNode *node =
static_cast<SparseArrayNode *>(qMapAllocate(
sizeof(SparseArrayNode),
alignof(SparseArrayNode)));
326 node->p = (quintptr)parent;
327 node->left =
nullptr;
328 node->right =
nullptr;
329 node->size_left = sl;
330 node->value = UINT_MAX;
336 if (parent == mostLeftNode)
339 parent->right = node;
341 node->setParent(parent);
347void SparseArray::freeTree(SparseArrayNode *root,
int alignment)
350 freeTree(root->left, alignment);
352 freeTree(root->right, alignment);
353 qMapDeallocate(root, alignment);
356SparseArray::SparseArray()
359 freeList = Encode(-1);
361 header.left =
nullptr;
362 header.right =
nullptr;
363 mostLeftNode = &header;
366SparseArray::SparseArray(
const SparseArray &other)
369 header.right =
nullptr;
370 if (other.header.left) {
371 header.left = other.header.left->copy(
this);
372 header.left->setParent(&header);
373 recalcMostLeftNode();
375 freeList = other.freeList;
378SparseArrayNode *SparseArray::insert(uint akey)
380 SparseArrayNode *n = root();
381 SparseArrayNode *y = end();
386 if (s == n->size_left) {
388 }
else if (s < n->size_left) {
398 return createNode(s, y, left);
static void qMapDeallocate(SparseArrayNode *node, int alignment)
static int qMapAlignmentThreshold()
static void * qMapAllocate(int alloc, int alignment)
SparseArrayNode * copy(SparseArray *d) const
const SparseArrayNode * previousNode() const
SparseArrayNode * parent() const
const SparseArrayNode * nextNode() const
void setParent(SparseArrayNode *pp)