rbtree 0.4.5 → 0.4.6

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.
Files changed (5) hide show
  1. checksums.yaml +4 -4
  2. data/README +3 -0
  3. data/extconf.rb +1 -0
  4. data/rbtree.c +72 -24
  5. metadata +6 -6
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: d5bc8dc390afc34242d6cd951136f2d86c9a0bafc809ed93d39d0fdf6c8ea9c0
4
- data.tar.gz: '059f888a97995d9bc64edcdafb504817b570e07df03c3385e5c5fe3e8bbc8f72'
3
+ metadata.gz: a5ec1fb39918d82821706cea18cb63b25fd4d20a989579664f7b95774f43881f
4
+ data.tar.gz: 3795d33cbbf811cdfd7b92664eca4156760c8d3bb36fa28a9854720279c6c1dd
5
5
  SHA512:
6
- metadata.gz: 9a27e36148fab48e03777b3151dc70ee69262da497263bf83cc25c3b9c6b8c7080857cd75c0d2ac8b3837f511d8a448565f1ae64b1da7740dd26b6ec4fca955a
7
- data.tar.gz: 9f682a9ce24a0cd3ff101d91cc145fbed066de4788cbb5b25abecfc1604c0e0065d1dc5d35d0f35d10df911bde971ab9f18edafd84030ae5309ce578be6cbc35
6
+ metadata.gz: 3df17e8770de0b0e7396b454905ca5a1d1de24d2dc006de0283a29c9a0805b772442f510dd9ce66bbe590499128d5375da4e61ae7e8396abed455833204af79d
7
+ data.tar.gz: ba6402624a047e104e2ddb70a37b19f1d01c2ce7b88752f19c9396fd197c8b58c8e3e3daa21974038b1a44676ee2af40c220dfc1fd300ad6796590fecdca5e30
data/README CHANGED
@@ -57,6 +57,9 @@ Run the following command.
57
57
  $ sudo gem install rbtree
58
58
 
59
59
  == Changes
60
+ === 0.4.6
61
+ * Make it work with clang 15.
62
+
60
63
  === 0.4.5
61
64
  * Support Ruby 3.2.0-dev (development branch).
62
65
 
data/extconf.rb CHANGED
@@ -5,6 +5,7 @@ if enable_config('debug')
5
5
  else
6
6
  $defs << '-DNDEBUG'
7
7
  end
8
+ have_header('ruby/version.h')
8
9
  have_func('rb_exec_recursive', 'ruby.h')
9
10
  have_func('rb_exec_recursive_paired', 'ruby.h')
10
11
  have_func('rb_proc_lambda_p', 'ruby.h')
data/rbtree.c CHANGED
@@ -3,6 +3,9 @@
3
3
  * Copyright (c) 2002-2013 OZAWA Takuma
4
4
  */
5
5
  #include <ruby.h>
6
+ #ifdef HAVE_RUBY_VERSION_H
7
+ #include <ruby/version.h>
8
+ #endif
6
9
  #ifdef HAVE_RUBY_ST_H
7
10
  #include <ruby/st.h>
8
11
  #else
@@ -134,22 +137,24 @@ static int
134
137
  rbtree_cmp(const void* key1, const void* key2, void* context)
135
138
  {
136
139
  VALUE result;
137
- if (TYPE(key1) == T_STRING && TYPE(key2) == T_STRING)
140
+ if (TYPE((VALUE)key1) == T_STRING && TYPE((VALUE)key2) == T_STRING)
138
141
  return rb_str_cmp((VALUE)key1, (VALUE)key2);
139
142
  result = rb_funcall2((VALUE)key1, id_cmp, 1, (VALUE*)&key2);
140
143
  return rb_cmpint(result, (VALUE)key1, (VALUE)key2);
141
144
  }
142
145
 
143
146
  static VALUE
144
- rbtree_user_cmp_ensure(rbtree_t* rbtree)
147
+ rbtree_user_cmp_ensure(VALUE arg)
145
148
  {
149
+ rbtree_t* rbtree = (rbtree_t*)arg;
146
150
  rbtree->iter_lev--;
147
151
  return Qnil;
148
152
  }
149
153
 
150
154
  static VALUE
151
- rbtree_user_cmp_body(VALUE* args)
155
+ rbtree_user_cmp_body(VALUE arg)
152
156
  {
157
+ VALUE *args = (VALUE*)arg;
153
158
  rbtree_t* rbtree = (rbtree_t*)args[2];
154
159
  rbtree->iter_lev++;
155
160
  return rb_funcall2(rbtree->cmp_proc, id_call, 2, args);
@@ -323,8 +328,9 @@ typedef struct {
323
328
  } rbtree_insert_arg_t;
324
329
 
325
330
  static VALUE
326
- insert_node_body(rbtree_insert_arg_t* arg)
331
+ insert_node_body(VALUE arg_)
327
332
  {
333
+ rbtree_insert_arg_t* arg = (rbtree_insert_arg_t*)arg_;
328
334
  dict_t* dict = arg->dict;
329
335
  dnode_t* node = arg->node;
330
336
 
@@ -341,8 +347,9 @@ insert_node_body(rbtree_insert_arg_t* arg)
341
347
  }
342
348
 
343
349
  static VALUE
344
- insert_node_ensure(rbtree_insert_arg_t* arg)
350
+ insert_node_ensure(VALUE arg_)
345
351
  {
352
+ rbtree_insert_arg_t* arg = (rbtree_insert_arg_t*)arg_;
346
353
  dict_t* dict = arg->dict;
347
354
  dnode_t* node = arg->node;
348
355
 
@@ -594,8 +601,9 @@ rbtree_each_ensure(VALUE self)
594
601
  }
595
602
 
596
603
  static VALUE
597
- rbtree_each_body(rbtree_each_arg_t* arg)
604
+ rbtree_each_body(VALUE arg_)
598
605
  {
606
+ rbtree_each_arg_t* arg = (rbtree_each_arg_t*)arg_;
599
607
  VALUE self = arg->self;
600
608
  dict_t* dict = DICT(self);
601
609
  dnode_t* node;
@@ -765,7 +773,11 @@ copy_dict(VALUE src, VALUE dest, dict_comp_t cmp_func, VALUE cmp_proc)
765
773
  }
766
774
  rbtree_free(RBTREE(temp));
767
775
  RBTREE(temp) = NULL;
776
+ #if defined(RUBY_API_VERSION_CODE) && RUBY_API_VERSION_CODE >= 30100
777
+ /* do nothing */
778
+ #else
768
779
  rb_gc_force_recycle(temp);
780
+ #endif
769
781
 
770
782
  DICT(dest)->dict_context = RBTREE(dest);
771
783
  CMP_PROC(dest) = cmp_proc;
@@ -892,8 +904,9 @@ typedef struct {
892
904
  } rbtree_remove_if_arg_t;
893
905
 
894
906
  static VALUE
895
- rbtree_remove_if_ensure(rbtree_remove_if_arg_t* arg)
907
+ rbtree_remove_if_ensure(VALUE arg_)
896
908
  {
909
+ rbtree_remove_if_arg_t* arg = (rbtree_remove_if_arg_t*)arg_;
897
910
  dict_t* dict = DICT(arg->self);
898
911
  dnode_list_t* list = arg->list;
899
912
 
@@ -910,8 +923,9 @@ rbtree_remove_if_ensure(rbtree_remove_if_arg_t* arg)
910
923
  }
911
924
 
912
925
  static VALUE
913
- rbtree_remove_if_body(rbtree_remove_if_arg_t* arg)
926
+ rbtree_remove_if_body(VALUE arg_)
914
927
  {
928
+ rbtree_remove_if_arg_t* arg = (rbtree_remove_if_arg_t*)arg_;
915
929
  VALUE self = arg->self;
916
930
  dict_t* dict = DICT(self);
917
931
  dnode_t* node;
@@ -1269,6 +1283,13 @@ to_a_i(dnode_t* node, void* ary)
1269
1283
  return EACH_NEXT;
1270
1284
  }
1271
1285
 
1286
+
1287
+ #if defined(RUBY_API_VERSION_CODE) && RUBY_API_VERSION_CODE >= 30100
1288
+ # define RBTREE_OBJ_INFECT(obj1, obj2)
1289
+ #else
1290
+ # define RBTREE_OBJ_INFECT(obj1, obj2) OBJ_INFECT(obj1, obj2)
1291
+ #endif
1292
+
1272
1293
  /*
1273
1294
  *
1274
1295
  */
@@ -1277,7 +1298,7 @@ rbtree_to_a(VALUE self)
1277
1298
  {
1278
1299
  VALUE ary = rb_ary_new2(dict_count(DICT(self)));
1279
1300
  rbtree_for_each(self, to_a_i, (void*)ary);
1280
- OBJ_INFECT(ary, self);
1301
+ RBTREE_OBJ_INFECT(ary, self);
1281
1302
  return ary;
1282
1303
  }
1283
1304
 
@@ -1303,7 +1324,7 @@ rbtree_to_hash(VALUE self)
1303
1324
  RHASH_SET_IFNONE(hash, IFNONE(self));
1304
1325
  if (FL_TEST(self, RBTREE_PROC_DEFAULT))
1305
1326
  FL_SET(hash, HASH_PROC_DEFAULT);
1306
- OBJ_INFECT(hash, self);
1327
+ RBTREE_OBJ_INFECT(hash, self);
1307
1328
  return hash;
1308
1329
  }
1309
1330
 
@@ -1338,13 +1359,13 @@ inspect_i(dnode_t* node, void* result_)
1338
1359
 
1339
1360
  str = rb_inspect(GET_KEY(node));
1340
1361
  rb_str_append(result, str);
1341
- OBJ_INFECT(result, str);
1362
+ RBTREE_OBJ_INFECT(result, str);
1342
1363
 
1343
1364
  rb_str_cat2(result, "=>");
1344
1365
 
1345
1366
  str = rb_inspect(GET_VAL(node));
1346
1367
  rb_str_append(result, str);
1347
- OBJ_INFECT(result, str);
1368
+ RBTREE_OBJ_INFECT(result, str);
1348
1369
 
1349
1370
  return EACH_NEXT;
1350
1371
  }
@@ -1363,15 +1384,15 @@ inspect_rbtree(VALUE self, VALUE result)
1363
1384
  str = rb_inspect(IFNONE(self));
1364
1385
  rb_str_cat2(result, ", default=");
1365
1386
  rb_str_append(result, str);
1366
- OBJ_INFECT(result, str);
1387
+ RBTREE_OBJ_INFECT(result, str);
1367
1388
 
1368
1389
  str = rb_inspect(CMP_PROC(self));
1369
1390
  rb_str_cat2(result, ", cmp_proc=");
1370
1391
  rb_str_append(result, str);
1371
- OBJ_INFECT(result, str);
1392
+ RBTREE_OBJ_INFECT(result, str);
1372
1393
 
1373
1394
  rb_str_cat2(result, ">");
1374
- OBJ_INFECT(result, self);
1395
+ RBTREE_OBJ_INFECT(result, self);
1375
1396
  return result;
1376
1397
  }
1377
1398
 
@@ -1462,8 +1483,9 @@ typedef struct {
1462
1483
  } rbtree_bound_arg_t;
1463
1484
 
1464
1485
  static VALUE
1465
- rbtree_bound_body(rbtree_bound_arg_t* arg)
1486
+ rbtree_bound_body(VALUE arg_)
1466
1487
  {
1488
+ rbtree_bound_arg_t* arg = (rbtree_bound_arg_t*)arg_;
1467
1489
  VALUE self = arg->self;
1468
1490
  dict_t* dict = DICT(self);
1469
1491
  dnode_t* lower_node = arg->lower_node;
@@ -1701,12 +1723,28 @@ static ID id_object_group;
1701
1723
  static ID id_pp;
1702
1724
  static ID id_text;
1703
1725
 
1726
+ #if defined(RUBY_VERSION_MAJOR) && RUBY_VERSION_MAJOR == 1 && RUBY_VERSION_MINOR == 8
1727
+ #define RUBY_1_8
1728
+ #endif
1729
+
1730
+ #ifdef RUBY_1_8
1704
1731
  static VALUE
1705
1732
  pp_group(VALUE args_)
1706
1733
  {
1707
1734
  VALUE* args = (VALUE*)args_;
1708
1735
  return rb_funcall(args[0], id_group, 3, args[1], args[2], args[3]);
1709
1736
  }
1737
+ #endif
1738
+
1739
+ static VALUE
1740
+ call_group_with_block(VALUE *group_args, VALUE (*blk)(RB_BLOCK_CALL_FUNC_ARGLIST(nil, arg)), VALUE data)
1741
+ {
1742
+ #ifdef RUBY_1_8
1743
+ return rb_iterate(pp_group, (VALUE)&group_args, blk, data);
1744
+ #else
1745
+ return rb_block_call(group_args[0], id_group, 3, group_args + 1, blk, data);
1746
+ #endif
1747
+ }
1710
1748
 
1711
1749
  typedef struct {
1712
1750
  VALUE pp;
@@ -1714,16 +1752,18 @@ typedef struct {
1714
1752
  } pp_pair_arg_t;
1715
1753
 
1716
1754
  static VALUE
1717
- pp_value(VALUE nil, pp_pair_arg_t* pair_arg)
1755
+ pp_value(RB_BLOCK_CALL_FUNC_ARGLIST(nil, arg))
1718
1756
  {
1757
+ pp_pair_arg_t* pair_arg = (pp_pair_arg_t*)arg;
1719
1758
  VALUE pp = pair_arg->pp;
1720
1759
  rb_funcall(pp, id_breakable, 1, rb_str_new(NULL, 0));
1721
1760
  return rb_funcall(pp, id_pp, 1, GET_VAL(pair_arg->node));
1722
1761
  }
1723
1762
 
1724
1763
  static VALUE
1725
- pp_pair(VALUE nil, pp_pair_arg_t* pair_arg)
1764
+ pp_pair(RB_BLOCK_CALL_FUNC_ARGLIST(nil, arg))
1726
1765
  {
1766
+ pp_pair_arg_t* pair_arg = (pp_pair_arg_t*)arg;
1727
1767
  VALUE pp = pair_arg->pp;
1728
1768
  VALUE group_args[4];
1729
1769
  group_args[0] = pp;
@@ -1733,7 +1773,7 @@ pp_pair(VALUE nil, pp_pair_arg_t* pair_arg)
1733
1773
 
1734
1774
  rb_funcall(pp, id_pp, 1, GET_KEY(pair_arg->node));
1735
1775
  rb_funcall(pp, id_text, 1, rb_str_new2("=>"));
1736
- return rb_iterate(pp_group, (VALUE)&group_args, pp_value, (VALUE)pair_arg);
1776
+ return call_group_with_block(group_args, pp_value, (VALUE)pair_arg);
1737
1777
  }
1738
1778
 
1739
1779
  typedef struct {
@@ -1762,7 +1802,7 @@ pp_each_pair_i(dnode_t* node, void* each_pair_arg_)
1762
1802
  pair_arg.pp = each_pair_arg->pp;
1763
1803
  pair_arg.node = node;
1764
1804
 
1765
- rb_iterate(pp_group, (VALUE)&group_args, pp_pair, (VALUE)&pair_arg);
1805
+ call_group_with_block(group_args, pp_pair, (VALUE)&pair_arg);
1766
1806
  return EACH_NEXT;
1767
1807
  }
1768
1808
 
@@ -1772,8 +1812,9 @@ typedef struct {
1772
1812
  } pp_rbtree_arg_t;
1773
1813
 
1774
1814
  static VALUE
1775
- pp_each_pair(VALUE nil, pp_rbtree_arg_t* rbtree_arg)
1815
+ pp_each_pair(RB_BLOCK_CALL_FUNC_ARGLIST(nil, arg))
1776
1816
  {
1817
+ pp_rbtree_arg_t* rbtree_arg = (pp_rbtree_arg_t*)arg;
1777
1818
  pp_each_pair_arg_t each_pair_arg;
1778
1819
  each_pair_arg.pp = rbtree_arg->pp;
1779
1820
  each_pair_arg.first = 1;
@@ -1781,8 +1822,9 @@ pp_each_pair(VALUE nil, pp_rbtree_arg_t* rbtree_arg)
1781
1822
  }
1782
1823
 
1783
1824
  static VALUE
1784
- pp_rbtree(VALUE nil, pp_rbtree_arg_t* rbtree_arg)
1825
+ pp_rbtree(RB_BLOCK_CALL_FUNC_ARGLIST(nil, arg))
1785
1826
  {
1827
+ pp_rbtree_arg_t* rbtree_arg = (pp_rbtree_arg_t*)arg;
1786
1828
  VALUE pp = rbtree_arg->pp;
1787
1829
  VALUE rbtree = rbtree_arg->rbtree;
1788
1830
 
@@ -1793,7 +1835,7 @@ pp_rbtree(VALUE nil, pp_rbtree_arg_t* rbtree_arg)
1793
1835
  group_args[3] = rb_str_new2("}");
1794
1836
 
1795
1837
  rb_funcall(pp, id_text, 1, rb_str_new2(": "));
1796
- rb_iterate(pp_group, (VALUE)&group_args, pp_each_pair, (VALUE)rbtree_arg);
1838
+ call_group_with_block(group_args, pp_each_pair, (VALUE)rbtree_arg);
1797
1839
  rb_funcall(pp, id_comma_breakable, 0);
1798
1840
  rb_funcall(pp, id_text, 1, rb_str_new2("default="));
1799
1841
  rb_funcall(pp, id_pp, 1, IFNONE(rbtree));
@@ -1802,12 +1844,14 @@ pp_rbtree(VALUE nil, pp_rbtree_arg_t* rbtree_arg)
1802
1844
  return rb_funcall(pp, id_pp, 1, CMP_PROC(rbtree));
1803
1845
  }
1804
1846
 
1847
+ #ifdef RUBY_1_8
1805
1848
  static VALUE
1806
1849
  pp_rbtree_group(VALUE arg_)
1807
1850
  {
1808
1851
  pp_rbtree_arg_t* arg = (pp_rbtree_arg_t*)arg_;
1809
1852
  return rb_funcall(arg->pp, id_object_group, 1, arg->rbtree);
1810
1853
  }
1854
+ #endif
1811
1855
 
1812
1856
  /*********************************************************************/
1813
1857
 
@@ -1820,7 +1864,11 @@ rbtree_pretty_print(VALUE self, VALUE pp)
1820
1864
  pp_rbtree_arg_t arg;
1821
1865
  arg.rbtree = self;
1822
1866
  arg.pp = pp;
1867
+ #ifdef RUBY_1_8
1823
1868
  return rb_iterate(pp_rbtree_group, (VALUE)&arg, pp_rbtree, (VALUE)&arg);
1869
+ #else
1870
+ return rb_block_call(arg.pp, id_object_group, 1, &self, pp_rbtree, (VALUE)&arg);
1871
+ #endif
1824
1872
  }
1825
1873
 
1826
1874
  /* :nodoc:
@@ -1895,7 +1943,7 @@ rbtree_s_load(VALUE klass, VALUE str)
1895
1943
  * A sorted associative collection that cannot contain duplicate
1896
1944
  * keys. RBTree is a subclass of MultiRBTree.
1897
1945
  */
1898
- void Init_rbtree()
1946
+ void Init_rbtree(void)
1899
1947
  {
1900
1948
  MultiRBTree = rb_define_class("MultiRBTree",
1901
1949
  #ifdef HAVE_RB_CDATA
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.5
4
+ version: 0.4.6
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: 2022-02-02 00:00:00.000000000 Z
11
+ date: 2022-12-10 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
@@ -58,7 +58,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
58
58
  version: '0'
59
59
  requirements: []
60
60
  rubygems_version: 3.4.0.dev
61
- signing_key:
61
+ signing_key:
62
62
  specification_version: 4
63
63
  summary: A sorted associative collection.
64
64
  test_files: []