llrbtree 0.0.2 → 0.0.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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
|