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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: bae0d7ff3b65a774b9704fd18a99e21ad22d119ca4dc95dde840babce0a0789c
4
- data.tar.gz: 84ead89aa999c9d0c8c018effb32a2ed65a948d234f950d339f2807720fc893e
3
+ metadata.gz: bdee6c0716e1d67f570bb2928822ed44d873493f9e4e26c0f8bf65dc567b8ffd
4
+ data.tar.gz: 2d651626e2d45ca02d46efe8d58a8408c5d5edcf96e53ef88b50fce5fb7d0ca3
5
5
  SHA512:
6
- metadata.gz: 5584aaf495b76f0839c4dfe5a8bd40be5d1721b6df550267ed70e335cb6e77b47841837bb458437d19ae9f0a549e42eb055c3255e5a1d7dfcfabad804629e16e
7
- data.tar.gz: 85c349b4aa229d0478c5b0fef72612866b1be433d65e98684d6d57a19ed405ad42bf4cf9527eeb2a2fa4ad1c11e3a1cbc61b2b32352884aff3393e72929bf59c
6
+ metadata.gz: a012cf09bc4406e780ac4520421dad74d217820ced888e126d1150f3a36f48d9ec71f197dc9cbee2a93b9ef30a9623a427e426c9585b4df739caafb9c503df9d
7
+ data.tar.gz: a1c76e5f67f0277be99914f8bbd07dfc06473da0aeb82cf576ed8da47918e037c1c5bf6eb9d8ee5253d85e6e5d918723aca613d72f6aa214e9640d254ee9c8b1
@@ -837,16 +837,14 @@ VALUE
837
837
  llrbtree_delete(VALUE self, VALUE key)
838
838
  {
839
839
  tree_t* tree = TREE(self);
840
- node_t* node;
841
- VALUE value;
840
+ void* deleted_data = NULL;
842
841
 
843
842
  llrbtree_modify(self);
844
- node = tree_lookup(tree, TO_KEY(key));
845
- if (node == NULL)
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
- value = GET_VAL(node);
848
- tree_delete(tree, TO_KEY(key));
849
- return value;
846
+
847
+ return (VALUE)deleted_data;
850
848
  }
851
849
 
852
850
  /*********************************************************************/
@@ -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
- tree->root_node = recursive_delete(tree, tree->root_node, key);
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
- tree->node_count--;
384
+ if (deleted_data != NULL) {
385
+ tree->node_count--;
386
+ }
387
+ return deleted_data;
381
388
  }
382
389
 
383
390
  node_t*
@@ -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 *);
@@ -1,3 +1,3 @@
1
1
  class LLRBTree
2
- VERSION = '0.0.2'
2
+ VERSION = '0.0.3'
3
3
  end
@@ -1,6 +1,6 @@
1
1
  Gem::Specification.new do |spec|
2
2
  spec.name = 'llrbtree'
3
- spec.version = '0.0.2'
3
+ spec.version = '0.0.3'
4
4
  spec.authors = ['kyuden']
5
5
  spec.email = ['msmsms.um@gmail.com']
6
6
 
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.2
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-01-31 00:00:00.000000000 Z
11
+ date: 2019-03-07 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler