llrbtree 0.0.2 → 0.0.3
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/ext/llrbtree/llrbtree.c +5 -7
- data/ext/llrbtree/tree.c +17 -10
- data/ext/llrbtree/tree.h +1 -1
- data/lib/llrbtree/version.rb +1 -1
- data/llrbtree.gemspec +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: bdee6c0716e1d67f570bb2928822ed44d873493f9e4e26c0f8bf65dc567b8ffd
|
4
|
+
data.tar.gz: 2d651626e2d45ca02d46efe8d58a8408c5d5edcf96e53ef88b50fce5fb7d0ca3
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: a012cf09bc4406e780ac4520421dad74d217820ced888e126d1150f3a36f48d9ec71f197dc9cbee2a93b9ef30a9623a427e426c9585b4df739caafb9c503df9d
|
7
|
+
data.tar.gz: a1c76e5f67f0277be99914f8bbd07dfc06473da0aeb82cf576ed8da47918e037c1c5bf6eb9d8ee5253d85e6e5d918723aca613d72f6aa214e9640d254ee9c8b1
|
data/ext/llrbtree/llrbtree.c
CHANGED
@@ -837,16 +837,14 @@ VALUE
|
|
837
837
|
llrbtree_delete(VALUE self, VALUE key)
|
838
838
|
{
|
839
839
|
tree_t* tree = TREE(self);
|
840
|
-
|
841
|
-
VALUE value;
|
840
|
+
void* deleted_data = NULL;
|
842
841
|
|
843
842
|
llrbtree_modify(self);
|
844
|
-
|
845
|
-
if (
|
843
|
+
deleted_data = tree_delete(tree, TO_KEY(key));
|
844
|
+
if (deleted_data == NULL)
|
846
845
|
return rb_block_given_p() ? rb_yield(key) : Qnil;
|
847
|
-
|
848
|
-
|
849
|
-
return value;
|
846
|
+
|
847
|
+
return (VALUE)deleted_data;
|
850
848
|
}
|
851
849
|
|
852
850
|
/*********************************************************************/
|
data/ext/llrbtree/tree.c
CHANGED
@@ -332,7 +332,7 @@ tree_insert(tree_t *tree, node_t *node, const void *key)
|
|
332
332
|
}
|
333
333
|
|
334
334
|
static node_t*
|
335
|
-
recursive_delete(tree_t *tree, node_t *node, const void *key)
|
335
|
+
recursive_delete(tree_t *tree, node_t *node, const void *key, void *deleted_data)
|
336
336
|
{
|
337
337
|
node_t *min_node;
|
338
338
|
|
@@ -342,42 +342,49 @@ recursive_delete(tree_t *tree, node_t *node, const void *key)
|
|
342
342
|
if (is_black(node->left) && (node->left->left == NULL || is_black(node->left->left))) {
|
343
343
|
node = move_red_left(node);
|
344
344
|
}
|
345
|
-
node->left = recursive_delete(tree, node->left, key);
|
345
|
+
node->left = recursive_delete(tree, node->left, key, deleted_data);
|
346
346
|
} else {
|
347
347
|
if (is_red(node->left)) {
|
348
348
|
node = rotate_right(node);
|
349
349
|
}
|
350
350
|
|
351
|
+
if (tree->compare(key, node->key, tree->context) == 0 && node->right == NULL) {
|
352
|
+
*(void **)deleted_data = node->data;
|
353
|
+
tree->free_node(node, tree->context);
|
354
|
+
return NULL;
|
355
|
+
}
|
356
|
+
|
351
357
|
if (is_black(node->right) && (node->right->left == NULL || is_black(node->right->left))) {
|
352
358
|
node = move_red_right(node);
|
353
359
|
}
|
354
360
|
|
355
361
|
if (tree->compare(key, node->key, tree->context) == 0) {
|
356
|
-
if (node->right == NULL) {
|
357
|
-
tree->free_node(node, tree->context);
|
358
|
-
return NULL;
|
359
|
-
}
|
360
362
|
|
361
363
|
min_node = min(node->right);
|
362
364
|
node->key = min_node->key;
|
365
|
+
*(void **)deleted_data = node->data;
|
363
366
|
node->data = min_node->data;
|
364
367
|
node->right = delete_min(tree, node->right);
|
365
368
|
} else {
|
366
|
-
node->right = recursive_delete(tree, node->right, key);
|
369
|
+
node->right = recursive_delete(tree, node->right, key, deleted_data);
|
367
370
|
}
|
368
371
|
}
|
369
372
|
|
370
373
|
return fix_up(node);
|
371
374
|
}
|
372
375
|
|
373
|
-
void
|
376
|
+
void*
|
374
377
|
tree_delete(tree_t *tree, const void *key)
|
375
378
|
{
|
376
|
-
|
379
|
+
void* deleted_data = NULL;
|
380
|
+
tree->root_node = recursive_delete(tree, tree->root_node, key, &deleted_data);
|
377
381
|
if (tree->root_node != NULL) {
|
378
382
|
tree->root_node->color = node_black;
|
379
383
|
}
|
380
|
-
|
384
|
+
if (deleted_data != NULL) {
|
385
|
+
tree->node_count--;
|
386
|
+
}
|
387
|
+
return deleted_data;
|
381
388
|
}
|
382
389
|
|
383
390
|
node_t*
|
data/ext/llrbtree/tree.h
CHANGED
@@ -47,7 +47,7 @@ extern node_t *tree_lookup(tree_t *, const void *);
|
|
47
47
|
extern node_t *tree_lower_bound(tree_t *, const void *);
|
48
48
|
extern node_t *tree_upper_bound(tree_t *, const void *);
|
49
49
|
extern int tree_insert(tree_t *, node_t *, const void *);
|
50
|
-
extern void tree_delete(tree_t *, const void *);
|
50
|
+
extern void *tree_delete(tree_t *, const void *);
|
51
51
|
extern node_t *tree_first(tree_t *);
|
52
52
|
extern node_t *tree_last(tree_t *);
|
53
53
|
extern node_t *tree_next(tree_t *, node_t *);
|
data/lib/llrbtree/version.rb
CHANGED
data/llrbtree.gemspec
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: llrbtree
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- kyuden
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2019-
|
11
|
+
date: 2019-03-07 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|