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 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