rbtree3 1.0.1 → 1.1.0

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/ChangeLog +4 -0
  3. data/rbtree.c +37 -2
  4. data/test.rb +8 -4
  5. metadata +2 -2
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: bccde8bd8bdf793347171a34025c53c0585d97d1f53a90fb9bc07bdfcdf887f6
4
- data.tar.gz: 2ae74f796225110f385d27cb9f52b01e1489e20e456808e099b9b20db798088c
3
+ metadata.gz: 5d3f4274c0291ddcf922cb0fafca0ae73f1119d0a495cce7202cded086c27711
4
+ data.tar.gz: 77e57d3d8e6e279b22ed762fa3b863da230b106f04d5da3886a1a2d1bfd8915d
5
5
  SHA512:
6
- metadata.gz: deb597de927d29f3390917854bbc00835089e2ca531b895d561d4eff6936df2d7a14877a52ca95c57e399239b1c8a550d76788b2fd0ecab006f6915c5f844120
7
- data.tar.gz: 85f78aca4fcd719daf6d7a51e606842a65fd6ccef6945197672f3f744917bb775161111a1dc1222b6b9b02fd27b2425ff4dac72904bea2c6bc877ccb1d131f27
6
+ metadata.gz: c2e579e0ddd8191211574a5091d05ab478610dad72cd09408d2d7a18e6846d788bda96861a34de0c4f97ca755818ee814851e76348d680dbb24cd26e22e3db69
7
+ data.tar.gz: 885d413f93472b5f5dea023e0b690fa639b971a99b601c9a33abceb6ca85291165fda646622a713e85db56c0dd791b94fa29c6d7d8b76c9e04300676a10540d5
data/ChangeLog CHANGED
@@ -1,3 +1,7 @@
1
+ 2026-06-03
2
+
3
+ * Use typed data APIs for Ruby 4.1+
4
+
1
5
  2026-03-24 Kyrylo Silin
2
6
 
3
7
  * bump required Ruby version to 1.9+
data/rbtree.c CHANGED
@@ -50,7 +50,11 @@ typedef struct {
50
50
  int iter_lev;
51
51
  } rbtree_t;
52
52
 
53
+ #ifdef TypedData_Make_Struct
54
+ #define RBTREE(rbtree) rbtree_get(rbtree)
55
+ #else
53
56
  #define RBTREE(rbtree) ((rbtree_t*)DATA_PTR(rbtree))
57
+ #endif
54
58
  #define DICT(rbtree) RBTREE(rbtree)->dict
55
59
  #define IFNONE(rbtree) RBTREE(rbtree)->ifnone
56
60
  #define ITER_LEV(rbtree) RBTREE(rbtree)->iter_lev
@@ -72,16 +76,18 @@ cmpint(VALUE i, VALUE a, VALUE b)
72
76
  }
73
77
 
74
78
  static void
75
- rbtree_free(rbtree_t* rbtree)
79
+ rbtree_free(void* arg)
76
80
  {
81
+ rbtree_t* rbtree = arg;
77
82
  dict_free_nodes(rbtree->dict);
78
83
  dict_destroy(rbtree->dict);
79
84
  xfree(rbtree);
80
85
  }
81
86
 
82
87
  static void
83
- rbtree_mark(rbtree_t* rbtree)
88
+ rbtree_mark(void* arg)
84
89
  {
90
+ rbtree_t* rbtree = arg;
85
91
  if (rbtree == NULL) return;
86
92
 
87
93
  if (rbtree->dict != NULL) {
@@ -99,6 +105,30 @@ rbtree_mark(rbtree_t* rbtree)
99
105
  rb_gc_mark(rbtree->ifnone);
100
106
  }
101
107
 
108
+ #ifdef TypedData_Make_Struct
109
+ static size_t
110
+ rbtree_memsize(const void* arg)
111
+ {
112
+ return arg ? sizeof(rbtree_t) : 0;
113
+ }
114
+
115
+ static const rb_data_type_t rbtree_type = {
116
+ "RBTree",
117
+ {
118
+ rbtree_mark, rbtree_free, rbtree_memsize,
119
+ },
120
+ NULL, NULL, 0,
121
+ };
122
+
123
+ static rbtree_t*
124
+ rbtree_get(VALUE rbtree)
125
+ {
126
+ rbtree_t* ptr;
127
+ TypedData_Get_Struct(rbtree, rbtree_t, &rbtree_type, ptr);
128
+ return ptr;
129
+ }
130
+ #endif
131
+
102
132
  static dnode_t*
103
133
  rbtree_alloc_node(void* context)
104
134
  {
@@ -154,8 +184,13 @@ rbtree_alloc(VALUE klass)
154
184
  {
155
185
  dict_t* dict;
156
186
  rbtree_t* rbtree_ptr;
187
+ #ifdef TypedData_Make_Struct
188
+ VALUE rbtree = TypedData_Make_Struct(klass, rbtree_t, &rbtree_type,
189
+ rbtree_ptr);
190
+ #else
157
191
  VALUE rbtree = Data_Make_Struct(klass, rbtree_t, rbtree_mark, rbtree_free,
158
192
  rbtree_ptr);
193
+ #endif
159
194
 
160
195
  dict = dict_create(rbtree_cmp);
161
196
  dict_set_allocator(dict, rbtree_alloc_node, rbtree_free_node,
data/test.rb CHANGED
@@ -720,14 +720,18 @@ class RBTreeTest < Test::Unit::TestCase
720
720
  begin
721
721
  require "pp"
722
722
 
723
+ def pp(rbtree=RBTree.new)
724
+ PP.pp(rbtree, String.new, 80)
725
+ end
726
+
723
727
  def test_pp
724
728
  assert_equal(%(#<RBTree: {}, default=nil, cmp_proc=nil>\n),
725
- PP.pp(RBTree[], ""))
729
+ pp(RBTree[]))
726
730
 
727
731
  arrow = RUBY_VERSION >= "3.4" ? " => " : "=>"
728
732
 
729
733
  assert_equal(%(#<RBTree: {"a"#{arrow}"A", "b"#{arrow}"B"}, default=nil, cmp_proc=nil>\n),
730
- PP.pp(RBTree[*%w(a A b B)], ""))
734
+ pp(RBTree[*%w(a A b B)]))
731
735
 
732
736
  rbtree = RBTree[*("a".."z").to_a]
733
737
  rbtree.default = "a"
@@ -749,7 +753,7 @@ class RBTreeTest < Test::Unit::TestCase
749
753
  default="a",
750
754
  cmp_proc=#{rbtree.cmp_proc}>
751
755
  EOS
752
- assert_equal(expected, PP.pp(rbtree, ""))
756
+ assert_equal(expected, pp(rbtree))
753
757
 
754
758
  rbtree = RBTree[]
755
759
  rbtree[rbtree] = rbtree
@@ -759,7 +763,7 @@ EOS
759
763
  default="#<RBTree: ...>",
760
764
  cmp_proc=nil>
761
765
  EOS
762
- assert_equal(expected, PP.pp(rbtree, ""))
766
+ assert_equal(expected, pp(rbtree))
763
767
  end
764
768
  rescue LoadError
765
769
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rbtree3
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.1
4
+ version: 1.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Kyrylo Silin
@@ -52,7 +52,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
52
52
  - !ruby/object:Gem::Version
53
53
  version: '0'
54
54
  requirements: []
55
- rubygems_version: 4.0.3
55
+ rubygems_version: 4.0.10
56
56
  specification_version: 4
57
57
  summary: A RBTree is a sorted associative collection that is implemented with a Red-Black
58
58
  Tree.