rbtree 0.4.4 → 0.4.6

Sign up to get free protection for your applications and to get access to all the features.
Files changed (5) hide show
  1. checksums.yaml +4 -4
  2. data/README +6 -0
  3. data/extconf.rb +2 -0
  4. data/rbtree.c +79 -25
  5. metadata +4 -5
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: '068088a72443fb756ebedf00226f9e628552528fdb6a02a904bd984a9ab961b5'
4
- data.tar.gz: 58c816a9433efa6680e7469db60810b6c9754949463143787bcc0979ad54a86a
3
+ metadata.gz: a5ec1fb39918d82821706cea18cb63b25fd4d20a989579664f7b95774f43881f
4
+ data.tar.gz: 3795d33cbbf811cdfd7b92664eca4156760c8d3bb36fa28a9854720279c6c1dd
5
5
  SHA512:
6
- metadata.gz: 562b5482ebab8b47f3357e01f76abaa2f480c76a0316033704e783441b90234b4bb0933165204f421592efcf9c0376255c33fb14ce31cb96e82cb61b045ecafd
7
- data.tar.gz: 81ff68b66a15597981ffdcecab5b1c49db8f73aa8b93e8b5f354d0072bd28282a4bce7fd0cacc90649006c9cc41c800abc03131b60bdae5c3b5ab3f783ea620c
6
+ metadata.gz: 3df17e8770de0b0e7396b454905ca5a1d1de24d2dc006de0283a29c9a0805b772442f510dd9ce66bbe590499128d5375da4e61ae7e8396abed455833204af79d
7
+ data.tar.gz: ba6402624a047e104e2ddb70a37b19f1d01c2ce7b88752f19c9396fd197c8b58c8e3e3daa21974038b1a44676ee2af40c220dfc1fd300ad6796590fecdca5e30
data/README CHANGED
@@ -57,6 +57,12 @@ 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
+
63
+ === 0.4.5
64
+ * Support Ruby 3.2.0-dev (development branch).
65
+
60
66
  === 0.4.4
61
67
  * Remove the rb_safe_level warning on Ruby 2.7.
62
68
 
data/extconf.rb CHANGED
@@ -5,12 +5,14 @@ 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')
11
12
  have_func('rb_ary_resize', 'ruby.h')
12
13
  have_func('rb_obj_hide', 'ruby.h')
13
14
  have_func('rb_safe_level', 'ruby.h')
15
+ have_func('rb_cData', 'ruby.h')
14
16
  if Hash.method_defined?(:flatten)
15
17
  $defs << '-DHAVE_HASH_FLATTEN'
16
18
  end
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,9 +1943,15 @@ 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
- MultiRBTree = rb_define_class("MultiRBTree", rb_cData);
1948
+ MultiRBTree = rb_define_class("MultiRBTree",
1949
+ #ifdef HAVE_RB_CDATA
1950
+ rb_cData
1951
+ #else
1952
+ rb_cObject
1953
+ #endif
1954
+ );
1901
1955
  RBTree = rb_define_class("RBTree", MultiRBTree);
1902
1956
 
1903
1957
  rb_include_module(MultiRBTree, rb_mEnumerable);
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rbtree
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.4.4
4
+ version: 0.4.6
5
5
  platform: ruby
6
6
  authors:
7
7
  - OZAWA Takuma
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2021-01-01 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
@@ -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
- rubygems_version: 3.2.3
60
+ rubygems_version: 3.4.0.dev
61
61
  signing_key:
62
62
  specification_version: 4
63
63
  summary: A sorted associative collection.
64
- test_files:
65
- - test.rb
64
+ test_files: []