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.
- checksums.yaml +4 -4
- data/ChangeLog +4 -0
- data/rbtree.c +37 -2
- data/test.rb +8 -4
- metadata +2 -2
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 5d3f4274c0291ddcf922cb0fafca0ae73f1119d0a495cce7202cded086c27711
|
|
4
|
+
data.tar.gz: 77e57d3d8e6e279b22ed762fa3b863da230b106f04d5da3886a1a2d1bfd8915d
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: c2e579e0ddd8191211574a5091d05ab478610dad72cd09408d2d7a18e6846d788bda96861a34de0c4f97ca755818ee814851e76348d680dbb24cd26e22e3db69
|
|
7
|
+
data.tar.gz: 885d413f93472b5f5dea023e0b690fa639b971a99b601c9a33abceb6ca85291165fda646622a713e85db56c0dd791b94fa29c6d7d8b76c9e04300676a10540d5
|
data/ChangeLog
CHANGED
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(
|
|
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(
|
|
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
|
-
|
|
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
|
-
|
|
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,
|
|
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,
|
|
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
|
|
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.
|
|
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.
|