rbtree 0.4.2 → 0.4.3

Sign up to get free protection for your applications and to get access to all the features.
Files changed (6) hide show
  1. checksums.yaml +5 -5
  2. data/README +2 -15
  3. data/extconf.rb +1 -0
  4. data/rbtree.c +62 -60
  5. data/test.rb +1 -1
  6. metadata +7 -8
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
- SHA1:
3
- metadata.gz: 35a51532a317785f995191b86990fd197d3a08d7
4
- data.tar.gz: fc58dc292ed9763c6b8731ca2998c6affe591007
2
+ SHA256:
3
+ metadata.gz: 46dbcc33616abd5c8b981b8b6e7da4c5cb6c72335dcdf3bc58b853fc64183808
4
+ data.tar.gz: 901e36a110e792a3b62bf6daf0969edae792a061620d7e1a3ee97c8773a2aaf3
5
5
  SHA512:
6
- metadata.gz: 75b7c55bd29b9341ae5969742855aa15893af18574d7c5ff734ea8e52b3e25f1ccb290c72bb27b58ae8e61db533b2d04b15cab80ff3e64239aee02f63591be35
7
- data.tar.gz: d1b1c0def86af19fd6b6a2bdcf7e2147b3f0e1ea340276d283884ee50b7fe3bd91c5f55e7495dcda3652fd9443b55d930044ce007ab707dc196cca3f45834011
6
+ metadata.gz: 2c0698f5c54abd965e390104d2b3bc08959b04ac903f25dd02b6d9019b02945b6ba53f425e182bdf3291e3793b23b1ca86b7fde9216cd86492b14bd1fb85fa9c
7
+ data.tar.gz: 0c7e76b305604f3bea800d642287b82316331d909d68811285c8d05348712f886904603f3cf43e954920c3e2ae5d3dbdac1c9342c6759e3f0c70bbf78d08e4d3
data/README CHANGED
@@ -57,21 +57,8 @@ Run the following command.
57
57
  $ sudo gem install rbtree
58
58
 
59
59
  == Changes
60
- === 0.4.2
61
- * Fixed build failure with Ruby 2.1.0.
62
-
63
- === 0.4.1
64
- * Fixed a crash that could be triggered when GC happened.
65
-
66
- === 0.4.0
67
-
68
- * Fixed build failure with Ruby 2.0.0.
69
- * \#bound now returns an enumerator if no block is given.
70
- * \#select now returns a new MultiRBTree / RBTree.
71
- * Fixed a bug where \#reject could return nil.
72
- * \#to_s is now equivalent to \#inspect.
73
- * \#each now passes a two elements array as an argument to the given block.
74
- * Added new methods: \#default_proc=, \#flatten, \#keep_if, \#key, \#select! and \#to_h.
60
+ === 0.4.3
61
+ * Quick bug fixes for Ruby 3.
75
62
 
76
63
  == License
77
64
 
data/extconf.rb CHANGED
@@ -10,6 +10,7 @@ have_func('rb_exec_recursive_paired', 'ruby.h')
10
10
  have_func('rb_proc_lambda_p', 'ruby.h')
11
11
  have_func('rb_ary_resize', 'ruby.h')
12
12
  have_func('rb_obj_hide', 'ruby.h')
13
+ have_func('rb_safe_level', 'ruby.h')
13
14
  if Hash.method_defined?(:flatten)
14
15
  $defs << '-DHAVE_HASH_FLATTEN'
15
16
  end
data/rbtree.c CHANGED
@@ -176,8 +176,10 @@ rbtree_modify(VALUE self)
176
176
  if (ITER_LEV(self) > 0)
177
177
  rb_raise(rb_eTypeError, "can't modify rbtree during iteration");
178
178
  rb_check_frozen(self);
179
+ #ifdef HAVE_RB_SAFE_LEVEL
179
180
  if (!OBJ_TAINTED(self) && rb_safe_level() >= 4)
180
181
  rb_raise(rb_eSecurityError, "Insecure: can't modify rbtree");
182
+ #endif
181
183
  }
182
184
 
183
185
  static VALUE
@@ -187,14 +189,14 @@ rbtree_alloc(VALUE klass)
187
189
  VALUE rbtree = Data_Wrap_Struct(klass, rbtree_mark, rbtree_free, NULL);
188
190
  RBTREE(rbtree) = ALLOC(rbtree_t);
189
191
  MEMZERO(RBTREE(rbtree), rbtree_t, 1);
190
-
192
+
191
193
  dict = ALLOC(dict_t);
192
194
  dict_init(dict, rbtree_cmp);
193
195
  dict_set_allocator(dict, rbtree_alloc_node, rbtree_free_node,
194
196
  RBTREE(rbtree));
195
197
  if (!RTEST(rb_class_inherited_p(klass, RBTree)))
196
198
  dict_allow_dupes(dict);
197
-
199
+
198
200
  DICT(rbtree) = dict;
199
201
  IFNONE(rbtree) = Qnil;
200
202
  CMP_PROC(rbtree) = Qnil;
@@ -224,29 +226,29 @@ rbtree_s_create(int argc, VALUE* argv, VALUE klass)
224
226
  {
225
227
  long i;
226
228
  VALUE rbtree;
227
-
229
+
228
230
  if (argc == 1) {
229
231
  VALUE temp;
230
-
232
+
231
233
  if (rb_obj_is_kind_of(argv[0], klass)) {
232
234
  rbtree = rbtree_alloc(klass);
233
235
  rbtree_update(rbtree, argv[0]);
234
236
  return rbtree;
235
237
  }
236
-
238
+
237
239
  if (RTEST(rb_class_inherited_p(klass, RBTree)) &&
238
240
  (rb_obj_is_kind_of(argv[0], MultiRBTree) && !rb_obj_is_kind_of(argv[0], RBTree))) {
239
-
241
+
240
242
  rb_raise(rb_eTypeError, "wrong argument type MultiRBTree (expected RBTree)");
241
243
  }
242
-
244
+
243
245
  temp = rb_check_convert_type(argv[0], T_HASH, "Hash", "to_hash");
244
246
  if (!NIL_P(temp)) {
245
247
  rbtree = rbtree_alloc(klass);
246
248
  rb_hash_foreach(temp, hash_to_rbtree_i, rbtree);
247
249
  return rbtree;
248
250
  }
249
-
251
+
250
252
  temp = rb_check_array_type(argv[0]);
251
253
  if (!NIL_P(temp)) {
252
254
  rbtree = rbtree_alloc(klass);
@@ -272,7 +274,7 @@ rbtree_s_create(int argc, VALUE* argv, VALUE klass)
272
274
  return rbtree;
273
275
  }
274
276
  }
275
-
277
+
276
278
  if (argc % 2 != 0)
277
279
  rb_raise(rb_eArgError, "odd number of arguments for %s", rb_class2name(klass));
278
280
 
@@ -325,7 +327,7 @@ insert_node_body(rbtree_insert_arg_t* arg)
325
327
  {
326
328
  dict_t* dict = arg->dict;
327
329
  dnode_t* node = arg->node;
328
-
330
+
329
331
  if (dict_insert(dict, node, dnode_getkey(node))) {
330
332
  if (TYPE(GET_KEY(node)) == T_STRING) {
331
333
  arg->result = KeyAllocationFailed;
@@ -343,7 +345,7 @@ insert_node_ensure(rbtree_insert_arg_t* arg)
343
345
  {
344
346
  dict_t* dict = arg->dict;
345
347
  dnode_t* node = arg->node;
346
-
348
+
347
349
  switch (arg->result) {
348
350
  case InsertionSucceeded:
349
351
  break;
@@ -366,7 +368,7 @@ rbtree_insert(VALUE self, VALUE key, VALUE value)
366
368
 
367
369
  dnode_init(node, TO_VAL(value));
368
370
  node->dict_key = TO_KEY(key);
369
-
371
+
370
372
  arg.dict = dict;
371
373
  arg.node = node;
372
374
  arg.result = NoNodeInserted;
@@ -501,14 +503,14 @@ VALUE
501
503
  rbtree_set_default_proc(VALUE self, VALUE proc)
502
504
  {
503
505
  VALUE temp;
504
-
506
+
505
507
  rbtree_modify(self);
506
508
  if (NIL_P(proc)) {
507
509
  IFNONE(self) = Qnil;
508
510
  FL_UNSET(self, RBTREE_PROC_DEFAULT);
509
511
  return Qnil;
510
512
  }
511
-
513
+
512
514
  temp = rb_check_convert_type(proc, T_DATA, "Proc", "to_proc");
513
515
  if (NIL_P(temp)) {
514
516
  rb_raise(rb_eTypeError,
@@ -528,16 +530,16 @@ rbtree_recursive_equal(VALUE self, VALUE other, int recursive)
528
530
  dict_t* dict2 = DICT(other);
529
531
  dnode_t* node1;
530
532
  dnode_t* node2;
531
-
533
+
532
534
  if (recursive)
533
535
  return Qtrue;
534
536
  for (node1 = dict_first(dict1), node2 = dict_first(dict2);
535
537
  node1 != NULL && node2 != NULL;
536
538
  node1 = dict_next(dict1, node1), node2 = dict_next(dict2, node2)) {
537
-
539
+
538
540
  if (!rb_equal(GET_KEY(node1), GET_KEY(node2)) ||
539
541
  !rb_equal(GET_VAL(node1), GET_VAL(node2))) {
540
-
542
+
541
543
  return Qfalse;
542
544
  }
543
545
  }
@@ -557,7 +559,7 @@ rbtree_equal(VALUE self, VALUE other)
557
559
  if (dict_count(DICT(self)) != dict_count(DICT(other)) ||
558
560
  DICT(self)->dict_compare != DICT(other)->dict_compare ||
559
561
  CMP_PROC(self) != CMP_PROC(other)) {
560
-
562
+
561
563
  return Qfalse;
562
564
  }
563
565
  #if defined(HAVE_RB_EXEC_RECURSIVE_PAIRED)
@@ -599,7 +601,7 @@ rbtree_each_body(rbtree_each_arg_t* arg)
599
601
  dnode_t* node;
600
602
  dnode_t* first_node;
601
603
  dnode_t* (*next_func)(dict_t*, dnode_t*);
602
-
604
+
603
605
  if (arg->reverse) {
604
606
  first_node = dict_last(dict);
605
607
  next_func = dict_prev;
@@ -607,12 +609,12 @@ rbtree_each_body(rbtree_each_arg_t* arg)
607
609
  first_node = dict_first(dict);
608
610
  next_func = dict_next;
609
611
  }
610
-
612
+
611
613
  ITER_LEV(self)++;
612
614
  for (node = first_node;
613
615
  node != NULL;
614
616
  node = next_func(dict, node)) {
615
-
617
+
616
618
  if (arg->func(node, arg->arg) == EACH_STOP)
617
619
  break;
618
620
  }
@@ -776,7 +778,7 @@ VALUE
776
778
  rbtree_initialize_copy(VALUE self, VALUE other)
777
779
  {
778
780
  rbtree_modify(self);
779
-
781
+
780
782
  if (self == other)
781
783
  return self;
782
784
  if (!rb_obj_is_kind_of(other, CLASS_OF(self))) {
@@ -784,9 +786,9 @@ rbtree_initialize_copy(VALUE self, VALUE other)
784
786
  rb_obj_classname(other),
785
787
  rb_obj_classname(self));
786
788
  }
787
-
789
+
788
790
  copy_dict(other, self, DICT(other)->dict_compare, CMP_PROC(other));
789
-
791
+
790
792
  IFNONE(self) = IFNONE(other);
791
793
  if (FL_TEST(other, RBTREE_PROC_DEFAULT))
792
794
  FL_SET(self, RBTREE_PROC_DEFAULT);
@@ -803,7 +805,7 @@ rbtree_values_at(int argc, VALUE* argv, VALUE self)
803
805
  {
804
806
  long i;
805
807
  VALUE ary = rb_ary_new2(argc);
806
-
808
+
807
809
  for (i = 0; i < argc; i++)
808
810
  rb_ary_push(ary, rbtree_aref(self, argv[i]));
809
811
  return ary;
@@ -937,7 +939,7 @@ static VALUE
937
939
  rbtree_remove_if(VALUE self, const int if_true)
938
940
  {
939
941
  rbtree_remove_if_arg_t arg;
940
-
942
+
941
943
  RETURN_SIZED_ENUMERATOR(self, 0, NULL, rbtree_size);
942
944
  rbtree_modify(self);
943
945
  arg.self = self;
@@ -974,7 +976,7 @@ VALUE
974
976
  rbtree_reject_bang(VALUE self)
975
977
  {
976
978
  dictcount_t count;
977
-
979
+
978
980
  RETURN_SIZED_ENUMERATOR(self, 0, NULL, rbtree_size);
979
981
  count = dict_count(DICT(self));
980
982
  rbtree_delete_if(self);
@@ -990,14 +992,14 @@ VALUE
990
992
  rbtree_select_bang(VALUE self)
991
993
  {
992
994
  dictcount_t count;
993
-
995
+
994
996
  RETURN_SIZED_ENUMERATOR(self, 0, NULL, rbtree_size);
995
997
  count = dict_count(DICT(self));
996
998
  rbtree_keep_if(self);
997
999
  if (count == dict_count(DICT(self)))
998
1000
  return Qnil;
999
1001
  return self;
1000
-
1002
+
1001
1003
  }
1002
1004
 
1003
1005
  /*********************************************************************/
@@ -1013,7 +1015,7 @@ select_i(dnode_t* node, void* arg_)
1013
1015
  VALUE key = GET_KEY(node);
1014
1016
  VALUE value = GET_VAL(node);
1015
1017
  rbtree_select_if_arg_t* arg = arg_;
1016
-
1018
+
1017
1019
  if (RTEST(rb_yield_values(2, key, value)) == arg->if_true) {
1018
1020
  rbtree_aset(arg->result, key, value);
1019
1021
  }
@@ -1024,7 +1026,7 @@ static VALUE
1024
1026
  rbtree_select_if(VALUE self, const int if_true)
1025
1027
  {
1026
1028
  rbtree_select_if_arg_t arg;
1027
-
1029
+
1028
1030
  RETURN_SIZED_ENUMERATOR(self, 0, NULL, rbtree_size);
1029
1031
  arg.result = rbtree_alloc(CLASS_OF(self));
1030
1032
  arg.if_true = if_true;
@@ -1063,7 +1065,7 @@ rbtree_shift_pop(VALUE self, const int shift)
1063
1065
 
1064
1066
  if (dict_isempty(dict))
1065
1067
  return rb_funcall(self, id_default, 1, Qnil);
1066
-
1068
+
1067
1069
  if (shift)
1068
1070
  node = dict_last(dict);
1069
1071
  else
@@ -1145,7 +1147,7 @@ rbtree_update(VALUE self, VALUE other)
1145
1147
  rb_obj_classname(other),
1146
1148
  rb_obj_classname(self));
1147
1149
  }
1148
-
1150
+
1149
1151
  if (rb_block_given_p())
1150
1152
  rbtree_for_each(other, update_block_i, (void*)self);
1151
1153
  else
@@ -1295,7 +1297,7 @@ rbtree_to_hash(VALUE self)
1295
1297
  VALUE hash;
1296
1298
  if (!rb_obj_is_kind_of(self, RBTree))
1297
1299
  rb_raise(rb_eTypeError, "can't convert MultiRBTree to Hash");
1298
-
1300
+
1299
1301
  hash = rb_hash_new();
1300
1302
  rbtree_for_each(self, to_hash_i, (void*)hash);
1301
1303
  RHASH_SET_IFNONE(hash, IFNONE(self));
@@ -1351,7 +1353,7 @@ static VALUE
1351
1353
  inspect_rbtree(VALUE self, VALUE result)
1352
1354
  {
1353
1355
  VALUE str;
1354
-
1356
+
1355
1357
  rb_str_cat2(result, "{");
1356
1358
  RSTRING_PTR(result)[0] = '-';
1357
1359
  rbtree_for_each(self, inspect_i, (void*)result);
@@ -1362,7 +1364,7 @@ inspect_rbtree(VALUE self, VALUE result)
1362
1364
  rb_str_cat2(result, ", default=");
1363
1365
  rb_str_append(result, str);
1364
1366
  OBJ_INFECT(result, str);
1365
-
1367
+
1366
1368
  str = rb_inspect(CMP_PROC(self));
1367
1369
  rb_str_cat2(result, ", cmp_proc=");
1368
1370
  rb_str_append(result, str);
@@ -1495,18 +1497,18 @@ rbtree_bound_size(VALUE self, VALUE args)
1495
1497
  dnode_t* upper_node = dict_upper_bound(DICT(self), TO_KEY(key2));
1496
1498
  dictcount_t count = 0;
1497
1499
  dnode_t* node;
1498
-
1500
+
1499
1501
  if (lower_node == NULL || upper_node == NULL ||
1500
1502
  DICT(self)->dict_compare(dnode_getkey(lower_node),
1501
1503
  dnode_getkey(upper_node),
1502
1504
  DICT(self)->dict_context) > 0) {
1503
1505
  return INT2FIX(0);
1504
1506
  }
1505
-
1507
+
1506
1508
  for (node = lower_node;
1507
1509
  node != NULL;
1508
1510
  node = dict_next(DICT(self), node)) {
1509
-
1511
+
1510
1512
  count++;
1511
1513
  if (node == upper_node) {
1512
1514
  break;
@@ -1533,7 +1535,7 @@ rbtree_bound_size(VALUE self, VALUE args)
1533
1535
  * mrbtree = MultiRBTree["az", 10, "ba", 20, "ba", 30, "bz", 40]
1534
1536
  * mrbtree.bound("ba").to_a # => [["ba", 20], ["ba", 30]]
1535
1537
  * mrbtree.bound("b", "c").to_a # => [["ba", 20], ["ba", 30], ["bz", 40]]
1536
- *
1538
+ *
1537
1539
  * # the lower bound ("ba") exceeds the upper bound ("az")
1538
1540
  * mrbtree.bound("b").to_a # => []
1539
1541
  */
@@ -1544,15 +1546,15 @@ rbtree_bound(int argc, VALUE* argv, VALUE self)
1544
1546
  dnode_t* lower_node;
1545
1547
  dnode_t* upper_node;
1546
1548
  VALUE result;
1547
-
1549
+
1548
1550
  rbtree_check_argument_count(argc, 1, 2);
1549
-
1551
+
1550
1552
  RETURN_SIZED_ENUMERATOR(self, argc, argv, rbtree_bound_size);
1551
-
1553
+
1552
1554
  lower_node = dict_lower_bound(dict, TO_KEY(argv[0]));
1553
1555
  upper_node = dict_upper_bound(dict, TO_KEY(argv[argc - 1]));
1554
1556
  result = rb_block_given_p() ? self : rb_ary_new();
1555
-
1557
+
1556
1558
  if (lower_node == NULL || upper_node == NULL ||
1557
1559
  DICT(self)->dict_compare(dnode_getkey(lower_node),
1558
1560
  dnode_getkey(upper_node),
@@ -1577,7 +1579,7 @@ rbtree_first_last(VALUE self, const int first)
1577
1579
 
1578
1580
  if (dict_isempty(dict))
1579
1581
  return rb_funcall(self, id_default, 1, Qnil);
1580
-
1582
+
1581
1583
  if (first)
1582
1584
  node = dict_first(dict);
1583
1585
  else
@@ -1627,7 +1629,7 @@ rbtree_last(VALUE self)
1627
1629
  * rbtree = RBTree["a", 10, "b", 20]
1628
1630
  * rbtree.readjust {|a, b| b <=> a }
1629
1631
  * rbtree.first # => ["b", 20]
1630
- *
1632
+ *
1631
1633
  * rbtree.readjust(nil)
1632
1634
  * rbtree.first # => ["a", 10]
1633
1635
  */
@@ -1636,7 +1638,7 @@ rbtree_readjust(int argc, VALUE* argv, VALUE self)
1636
1638
  {
1637
1639
  dict_comp_t cmp_func = NULL;
1638
1640
  VALUE cmp_proc = Qnil;
1639
-
1641
+
1640
1642
  rbtree_modify(self);
1641
1643
 
1642
1644
  if (rb_block_given_p()) {
@@ -1728,7 +1730,7 @@ pp_pair(VALUE nil, pp_pair_arg_t* pair_arg)
1728
1730
  group_args[1] = INT2FIX(1);
1729
1731
  group_args[2] = rb_str_new(NULL, 0);
1730
1732
  group_args[3] = rb_str_new(NULL, 0);
1731
-
1733
+
1732
1734
  rb_funcall(pp, id_pp, 1, GET_KEY(pair_arg->node));
1733
1735
  rb_funcall(pp, id_text, 1, rb_str_new2("=>"));
1734
1736
  return rb_iterate(pp_group, (VALUE)&group_args, pp_value, (VALUE)pair_arg);
@@ -1745,21 +1747,21 @@ pp_each_pair_i(dnode_t* node, void* each_pair_arg_)
1745
1747
  pp_each_pair_arg_t* each_pair_arg = (pp_each_pair_arg_t*)each_pair_arg_;
1746
1748
  VALUE group_args[4];
1747
1749
  pp_pair_arg_t pair_arg;
1748
-
1750
+
1749
1751
  if (each_pair_arg->first) {
1750
1752
  each_pair_arg->first = 0;
1751
1753
  } else {
1752
1754
  rb_funcall(each_pair_arg->pp, id_comma_breakable, 0);
1753
1755
  }
1754
-
1756
+
1755
1757
  group_args[0] = each_pair_arg->pp;
1756
1758
  group_args[1] = INT2FIX(0);
1757
1759
  group_args[2] = rb_str_new(NULL, 0);
1758
1760
  group_args[3] = rb_str_new(NULL, 0);
1759
-
1761
+
1760
1762
  pair_arg.pp = each_pair_arg->pp;
1761
1763
  pair_arg.node = node;
1762
-
1764
+
1763
1765
  rb_iterate(pp_group, (VALUE)&group_args, pp_pair, (VALUE)&pair_arg);
1764
1766
  return EACH_NEXT;
1765
1767
  }
@@ -1783,13 +1785,13 @@ pp_rbtree(VALUE nil, pp_rbtree_arg_t* rbtree_arg)
1783
1785
  {
1784
1786
  VALUE pp = rbtree_arg->pp;
1785
1787
  VALUE rbtree = rbtree_arg->rbtree;
1786
-
1788
+
1787
1789
  VALUE group_args[4];
1788
1790
  group_args[0] = pp;
1789
1791
  group_args[1] = INT2FIX(1);
1790
1792
  group_args[2] = rb_str_new2("{");
1791
1793
  group_args[3] = rb_str_new2("}");
1792
-
1794
+
1793
1795
  rb_funcall(pp, id_text, 1, rb_str_new2(": "));
1794
1796
  rb_iterate(pp_group, (VALUE)&group_args, pp_each_pair, (VALUE)rbtree_arg);
1795
1797
  rb_funcall(pp, id_comma_breakable, 0);
@@ -1840,17 +1842,17 @@ rbtree_dump(VALUE self, VALUE limit)
1840
1842
  {
1841
1843
  VALUE ary;
1842
1844
  VALUE result;
1843
-
1845
+
1844
1846
  if (FL_TEST(self, RBTREE_PROC_DEFAULT))
1845
1847
  rb_raise(rb_eTypeError, "can't dump rbtree with default proc");
1846
1848
  if (CMP_PROC(self) != Qnil)
1847
1849
  rb_raise(rb_eTypeError, "can't dump rbtree with comparison proc");
1848
-
1850
+
1849
1851
  ary = rb_ary_new2(dict_count(DICT(self)) * 2 + 1);
1850
1852
  rbtree_for_each(self, to_flat_ary_i, (void*)ary);
1851
1853
  rb_ary_push(ary, IFNONE(self));
1852
1854
 
1853
- result = rb_marshal_dump(ary, limit);
1855
+ result = rb_marshal_dump(ary, Qnil);
1854
1856
  #ifdef HAVE_RB_ARY_RESIZE
1855
1857
  rb_ary_resize(ary, 0);
1856
1858
  #else
@@ -1869,11 +1871,11 @@ rbtree_s_load(VALUE klass, VALUE str)
1869
1871
  VALUE ary = rb_marshal_load(str);
1870
1872
  long len = RARRAY_LEN(ary) - 1;
1871
1873
  long i;
1872
-
1874
+
1873
1875
  for (i = 0; i < len; i += 2)
1874
1876
  rbtree_aset(rbtree, RARRAY_AREF(ary, i), RARRAY_AREF(ary, i + 1));
1875
1877
  IFNONE(rbtree) = RARRAY_AREF(ary, len);
1876
-
1878
+
1877
1879
  #ifdef HAVE_RB_ARY_RESIZE
1878
1880
  rb_ary_resize(ary, 0);
1879
1881
  #else
@@ -1975,7 +1977,7 @@ void Init_rbtree()
1975
1977
 
1976
1978
  rb_define_method(MultiRBTree, "_dump", rbtree_dump, 1);
1977
1979
  rb_define_singleton_method(MultiRBTree, "_load", rbtree_s_load, 1);
1978
-
1980
+
1979
1981
  id_cmp = rb_intern("<=>");
1980
1982
  id_call = rb_intern("call");
1981
1983
  id_default = rb_intern("default");
data/test.rb CHANGED
@@ -620,7 +620,7 @@ class RBTreeTest < Test::Unit::TestCase
620
620
  tree, default, cmp_proc = match.to_a[1..-1]
621
621
  assert_equal(%({"a"=>"A", "b"=>"B", "c"=>"C", "d"=>"D"}), tree)
622
622
  assert_equal(%("e"), default)
623
- assert_match(/#<Proc:\w+(@#{__FILE__}:\d+)?>/o, cmp_proc)
623
+ assert_match(/#<Proc:\w+([@ ]#{__FILE__}:\d+)?>/o, cmp_proc)
624
624
 
625
625
  rbtree = RBTree.new
626
626
  assert_match(re, rbtree.send(method))
metadata CHANGED
@@ -1,21 +1,21 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rbtree
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.4.2
4
+ version: 0.4.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - OZAWA Takuma
8
- autorequire:
8
+ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2013-12-26 00:00:00.000000000 Z
11
+ date: 2020-12-31 00:00:00.000000000 Z
12
12
  dependencies: []
13
13
  description: |
14
14
  A RBTree is a sorted associative collection that is implemented with a
15
15
  Red-Black Tree. It maps keys to values like a Hash, but maintains its
16
16
  elements in ascending key order. The interface is the almost identical
17
17
  to that of Hash.
18
- email:
18
+ email:
19
19
  executables: []
20
20
  extensions:
21
21
  - extconf.rb
@@ -36,7 +36,7 @@ homepage: http://rbtree.rubyforge.org/
36
36
  licenses:
37
37
  - MIT
38
38
  metadata: {}
39
- post_install_message:
39
+ post_install_message:
40
40
  rdoc_options:
41
41
  - "--title"
42
42
  - Ruby/RBTree
@@ -57,9 +57,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
57
57
  - !ruby/object:Gem::Version
58
58
  version: '0'
59
59
  requirements: []
60
- rubyforge_project: rbtree
61
- rubygems_version: 2.2.0
62
- signing_key:
60
+ rubygems_version: 3.2.3
61
+ signing_key:
63
62
  specification_version: 4
64
63
  summary: A sorted associative collection.
65
64
  test_files: