native_btree 0.1.0.alpha1 → 0.2.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 (39) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +28 -0
  3. data/CMakeLists.txt +54 -0
  4. data/Gemfile +18 -0
  5. data/LICENSE +165 -0
  6. data/README.md +67 -0
  7. data/Rakefile +48 -0
  8. data/ext/native_btree/CMakeLists.txt +38 -0
  9. data/ext/native_btree/comparator.c +13 -0
  10. data/ext/native_btree/constructor.c +19 -0
  11. data/ext/native_btree/conversion.c +54 -0
  12. data/ext/native_btree/extconf_cmake.rb +15 -0
  13. data/ext/native_btree/include/common.h +21 -0
  14. data/ext/native_btree/include/comparator.h +4 -0
  15. data/ext/native_btree/include/constructor.h +11 -0
  16. data/ext/native_btree/include/conversion.h +8 -0
  17. data/ext/native_btree/include/instance.h +22 -0
  18. data/ext/native_btree/include/iterators.h +5 -0
  19. data/ext/native_btree/include/native_btree.h +5 -47
  20. data/ext/native_btree/include/rbtree_type.h +22 -0
  21. data/ext/native_btree/instance.c +126 -0
  22. data/ext/native_btree/iterators.c +26 -0
  23. data/ext/native_btree/native_btree.c +20 -22
  24. data/ext/native_btree/rbtree_type.c +102 -0
  25. data/lib/native_btree/native_btree.bundle +0 -0
  26. data/lib/native_btree/native_btree.so +0 -0
  27. data/lib/native_btree/version.rb +2 -2
  28. data/lib/native_btree.rb +2 -1
  29. data/native_btree.gemspec +33 -0
  30. data/spec/debug.rb +24 -0
  31. data/spec/native_btree_class_spec.rb +24 -0
  32. data/spec/native_btree_instance_spec.rb +283 -0
  33. data/spec/native_btree_module_spec.rb +15 -0
  34. data/spec/spec_helper.rb +15 -0
  35. metadata +50 -18
  36. data/ext/native_btree/btree.cc +0 -128
  37. data/ext/native_btree/extconf.h +0 -11
  38. data/ext/native_btree/extconf.rb +0 -35
  39. data/ext/native_btree/rb_methods.cc +0 -221
@@ -0,0 +1,283 @@
1
+ # frozen_string_literal: true
2
+
3
+ RSpec.describe NativeBtree do
4
+
5
+ describe NativeBtree::Btree do
6
+ let(:tree) do
7
+ described_class.new do |a, b|
8
+ a - b
9
+ end
10
+ end
11
+
12
+ describe "#[]= method" do
13
+
14
+ it "respond to" do
15
+ expect(tree).to respond_to('[]=')
16
+ end
17
+
18
+ it 'set key/value pair' do
19
+ tree[2] = 22
20
+ expect(tree[2]).to be 22
21
+ end
22
+
23
+ it "pass key arg and value" do
24
+ expect(tree[:key] = 10).to be 10
25
+ end
26
+
27
+ it "Raise ArgumentError if key was not passed" do
28
+ expect { tree[] = 1 }.to raise_error(ArgumentError)
29
+ end
30
+
31
+ it 'Call comparator while set value' do
32
+ comparator = spy('comparator')
33
+ def comparator.to_proc
34
+ proc do |a, b|
35
+ comparator.call()
36
+ a - b
37
+ end
38
+ end
39
+
40
+ btree = described_class.new(&comparator)
41
+ btree[1] = 1
42
+ btree[2] = 2
43
+ expect(comparator).to have_received(:call)
44
+ end
45
+
46
+ it 'has a set alias' do
47
+ expect(tree).to respond_to('set')
48
+ end
49
+ end
50
+
51
+ describe "#[] method" do
52
+ it "respond to" do
53
+ expect(tree).to respond_to('[]')
54
+ end
55
+
56
+ it 'return expected value if found' do
57
+ tree[3] = 'a'
58
+ tree[4] = 'b'
59
+ expect(tree[3]).to be 'a'
60
+ end
61
+
62
+ it 'return nil if not found' do
63
+ tree[1] = '1'
64
+ tree[5] = '5'
65
+ expect(tree[2]).to be_nil
66
+ end
67
+
68
+ it 'has a get alias' do
69
+ expect(tree).to respond_to('get')
70
+ end
71
+ end
72
+
73
+ describe "#height method" do
74
+ it "respond to" do
75
+ expect(tree).to respond_to(:height)
76
+ end
77
+
78
+ it 'return tree height with items' do
79
+ tree[1] = 11
80
+ tree[2] = 22
81
+ tree[3] = 33
82
+ tree[4] = 44
83
+ expect(tree.height).to be 3
84
+ end
85
+
86
+ it 'return 0 if empty tree' do
87
+ expect(tree.height).to be 0
88
+ end
89
+ end
90
+
91
+ describe "#size method" do
92
+ it "respond to" do
93
+ expect(tree).to respond_to(:size)
94
+ end
95
+
96
+ it 'return count of nodes' do
97
+ tree[1] = 1
98
+ tree[2] = 2
99
+ tree[3] = 3
100
+ expect(tree.size).to be 3
101
+ end
102
+
103
+ it 'return 0 if empty tree' do
104
+ expect(tree.size).to be 0
105
+ end
106
+
107
+ end
108
+
109
+ describe "#delete method" do
110
+ it "respond to" do
111
+ expect(tree).to respond_to(:delete)
112
+ end
113
+
114
+ it 'delete key value pair' do
115
+ tree[2] = 22
116
+ tree[3] = 33
117
+ tree.delete(3)
118
+ expect(tree[3]).to be_nil
119
+ end
120
+
121
+ it "return nil if not found" do
122
+ tree[3] = 33
123
+ expect(tree.delete(4)).to be_nil
124
+ end
125
+
126
+ it "return value if key is found" do
127
+ tree[2] = 22
128
+ tree[3] = 33
129
+ expect(tree.delete(2)).to be 22
130
+ end
131
+
132
+ it "call block with key if not found" do
133
+ tree[2] = 22
134
+ block = ->(key) { "#{key} is not found" }
135
+ expect(tree.delete(7, &block)).to be == "7 is not found"
136
+ end
137
+ end
138
+
139
+ describe "#clear method" do
140
+ it "respond to" do
141
+ expect(tree).to respond_to(:clear)
142
+ end
143
+
144
+ it 'clear tree' do
145
+ tree[1] = 11
146
+ tree[2] = 22
147
+ tree[3] = 33
148
+ expect(tree.size).to be 3
149
+ tree.clear()
150
+ expect(tree.size).to be 0
151
+ end
152
+
153
+ it 'return self' do
154
+ tree[1] = 11
155
+ expect(tree.clear()).to be tree
156
+ end
157
+ end
158
+
159
+ describe "#filter method" do
160
+ xit "respond to" do
161
+ expect(described_cless.respond_to?(:filter)).to be true
162
+ end
163
+ end
164
+
165
+ describe "#filter! method" do
166
+ xit "respond to" do
167
+ expect(described_cless.respond_to?(:filter!)).to be true
168
+ end
169
+ end
170
+
171
+ describe "#include? method" do
172
+ it "respond to" do
173
+ expect(tree).to respond_to(:include?)
174
+ end
175
+
176
+ it 'return true is key exists' do
177
+ tree[3] = 33
178
+ expect(tree.include?(3)).to be true
179
+ end
180
+
181
+ it 'return false if key not exists' do
182
+ tree[3] = 33
183
+ expect(tree.include?(4)).to be false
184
+ end
185
+ end
186
+
187
+ describe "to_ methods" do
188
+ describe "#to_a" do
189
+ it "respond to" do
190
+ expect(tree).to respond_to(:to_a)
191
+ end
192
+
193
+ it 'return Array' do
194
+ expect(tree.to_a).to be_kind_of(Array)
195
+ end
196
+
197
+ it 'has similar items' do
198
+ tree[2] = 22
199
+ tree[1] = 11
200
+ expect(tree.to_a()[0][1]).to be 11
201
+ end
202
+ end
203
+
204
+ describe "#to_h" do
205
+ it "respond to" do
206
+ expect(tree).to respond_to(:to_h)
207
+ end
208
+
209
+ it "return Hash" do
210
+ expect(tree.to_h).to be_kind_of(Hash)
211
+ end
212
+
213
+ it 'has similar keys' do
214
+ tree[2] = 22
215
+ tree[1] = 11
216
+ expect(tree.to_h()[1]).to be 11
217
+ end
218
+ end
219
+ end
220
+
221
+ describe "#each method" do
222
+ it "respond to" do
223
+ expect(tree).to respond_to(:each)
224
+ end
225
+
226
+ it 'yield in to block value first' do
227
+ tree[2] = 22
228
+
229
+ value = nil
230
+ tree.each { |v| value = v }
231
+
232
+ expect(value).to be 22
233
+ end
234
+
235
+ it 'yield in to block key second' do
236
+ tree[2] = 22
237
+
238
+ key = nil
239
+ tree.each { |_v, k| key = k }
240
+
241
+ expect(key).to be 2
242
+ end
243
+
244
+ it 'yield ordered keys' do
245
+ tree[16] = 16
246
+ tree[0] = 0
247
+ tree[5] = 5
248
+ tree[-4] = -4
249
+ tree[7] = 7
250
+
251
+ check = [-4, 0, 5, 7, 16]
252
+ result = []
253
+ tree.each { |value| result << value }
254
+
255
+ expect(result).to eq(check)
256
+ end
257
+ end
258
+
259
+ describe "#each_key method" do
260
+ xit "respond to" do
261
+ expect(described_cless.respond_to?(:each_key)).to be true
262
+ end
263
+ end
264
+
265
+ describe "#each_value method" do
266
+ xit "respond to" do
267
+ expect(described_cless.respond_to?(:each_value)).to be true
268
+ end
269
+ end
270
+
271
+ describe "#select method" do
272
+ xit "respond to" do
273
+ expect(described_cless.respond_to?(:select)).to be true
274
+ end
275
+ end
276
+
277
+ describe "#select! method" do
278
+ xit "respond to" do
279
+ expect(described_cless.respond_to?(:select!)).to be true
280
+ end
281
+ end
282
+ end
283
+ end
@@ -0,0 +1,15 @@
1
+ # frozen_string_literal: true
2
+
3
+ RSpec.describe NativeBtree do
4
+ it "has a version number" do
5
+ expect(described_class.const_defined?(:VERSION)).to be true
6
+ end
7
+
8
+ it "Has Btree contstant" do
9
+ expect(described_class.const_defined?(:Btree)).to be true
10
+ end
11
+
12
+ it "Btree is class" do
13
+ expect(described_class::Btree.class).to be Class
14
+ end
15
+ end
@@ -0,0 +1,15 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "native_btree"
4
+
5
+ RSpec.configure do |config|
6
+ # Enable flags like --only-failures and --next-failure
7
+ config.example_status_persistence_file_path = ".rspec_status"
8
+
9
+ # Disable RSpec exposing methods globally on `Module` and `main`
10
+ config.disable_monkey_patching!
11
+
12
+ config.expect_with :rspec do |c|
13
+ c.syntax = :expect
14
+ end
15
+ end
metadata CHANGED
@@ -1,37 +1,69 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: native_btree
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0.alpha1
4
+ version: 0.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Alexander Feodorov
8
- autorequire:
8
+ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2020-07-11 00:00:00.000000000 Z
11
+ date: 2022-09-06 00:00:00.000000000 Z
12
12
  dependencies: []
13
- description:
13
+ description: Ruby bindings to GTree balanced binary tree from GLib library.
14
14
  email:
15
15
  - webmaster@unixcomp.org
16
16
  executables: []
17
17
  extensions:
18
- - ext/native_btree/extconf.rb
18
+ - ext/native_btree/extconf_cmake.rb
19
19
  extra_rdoc_files: []
20
20
  files:
21
- - ext/native_btree/btree.cc
22
- - ext/native_btree/extconf.h
23
- - ext/native_btree/extconf.rb
21
+ - CHANGELOG.md
22
+ - CMakeLists.txt
23
+ - Gemfile
24
+ - LICENSE
25
+ - README.md
26
+ - Rakefile
27
+ - ext/native_btree/CMakeLists.txt
28
+ - ext/native_btree/comparator.c
29
+ - ext/native_btree/constructor.c
30
+ - ext/native_btree/conversion.c
31
+ - ext/native_btree/extconf_cmake.rb
24
32
  - ext/native_btree/include/btree.h
33
+ - ext/native_btree/include/common.h
34
+ - ext/native_btree/include/comparator.h
35
+ - ext/native_btree/include/constructor.h
36
+ - ext/native_btree/include/conversion.h
37
+ - ext/native_btree/include/instance.h
38
+ - ext/native_btree/include/iterators.h
25
39
  - ext/native_btree/include/native_btree.h
40
+ - ext/native_btree/include/rbtree_type.h
41
+ - ext/native_btree/instance.c
42
+ - ext/native_btree/iterators.c
26
43
  - ext/native_btree/native_btree.c
27
- - ext/native_btree/rb_methods.cc
44
+ - ext/native_btree/rbtree_type.c
28
45
  - lib/native_btree.rb
46
+ - lib/native_btree/native_btree.bundle
47
+ - lib/native_btree/native_btree.so
29
48
  - lib/native_btree/version.rb
49
+ - native_btree.gemspec
50
+ - spec/debug.rb
51
+ - spec/native_btree_class_spec.rb
52
+ - spec/native_btree_instance_spec.rb
53
+ - spec/native_btree_module_spec.rb
54
+ - spec/spec_helper.rb
30
55
  homepage: https://github.com/unixs/ruby-native-btree
31
56
  licenses:
32
- - MIT
33
- metadata: {}
34
- post_install_message:
57
+ - LGPL-3.0-or-later
58
+ metadata:
59
+ bug_tracker_uri: https://github.com/unixs/ruby-native-btree/issues
60
+ changelog_uri: https://github.com/unixs/ruby-native-btree/blob/master/CHANGELOG.md
61
+ documentation_uri: https://github.com/unixs/ruby-native-btree/wiki
62
+ homepage_uri: https://github.com/unixs/ruby-native-btree
63
+ source_code_uri: https://github.com/unixs/ruby-native-btree
64
+ wiki_uri: https://github.com/unixs/ruby-native-btree/wiki
65
+ rubygems_mfa_required: 'true'
66
+ post_install_message:
35
67
  rdoc_options: []
36
68
  require_paths:
37
69
  - lib
@@ -39,15 +71,15 @@ required_ruby_version: !ruby/object:Gem::Requirement
39
71
  requirements:
40
72
  - - ">="
41
73
  - !ruby/object:Gem::Version
42
- version: '2.5'
74
+ version: '2.6'
43
75
  required_rubygems_version: !ruby/object:Gem::Requirement
44
76
  requirements:
45
- - - ">"
77
+ - - ">="
46
78
  - !ruby/object:Gem::Version
47
- version: 1.3.1
79
+ version: '0'
48
80
  requirements: []
49
- rubygems_version: 3.1.4
50
- signing_key:
81
+ rubygems_version: 3.3.21
82
+ signing_key:
51
83
  specification_version: 4
52
- summary: Bindings to GTree data stucture from libglib-2.0
84
+ summary: Balanced binary tree from GLib.
53
85
  test_files: []
@@ -1,128 +0,0 @@
1
- #include "btree.h"
2
-
3
- BTree::BTree(VALUE comnparator)
4
- {
5
- this->comparator = comnparator;
6
- this->tree = g_tree_new_with_data(BTree::nativeComparator, this);
7
- }
8
-
9
- BTree::~BTree()
10
- {
11
- g_tree_destroy(this->tree);
12
- }
13
-
14
- void
15
- BTree::mark()
16
- {
17
- rb_gc_mark(this->comparator);
18
- this->markMyRValues();
19
- }
20
-
21
- void
22
- BTree::markMyRValues()
23
- {
24
- g_tree_foreach(this->tree, BTree::markRValue, NULL);
25
- }
26
-
27
- gint
28
- BTree::markRValue(gpointer k, gpointer v, gpointer not_used)
29
- {
30
- const VALUE key = reinterpret_cast<VALUE>(k);
31
- const VALUE value = reinterpret_cast<VALUE>(v);
32
-
33
- rb_gc_mark(key);
34
- rb_gc_mark(value);
35
-
36
- return false;
37
- }
38
-
39
- gint
40
- BTree::nativeComparator(gconstpointer a, gconstpointer b, gpointer data)
41
- {
42
- const BTree *tree = static_cast<BTree *>(data);
43
- const VALUE keyA = reinterpret_cast<VALUE>(a);
44
- const VALUE keyB = reinterpret_cast<VALUE>(b);
45
-
46
- VALUE ruby_result = rb_funcall(tree->comparator, rb_intern("call"), 2, keyA, keyB);
47
-
48
- return NUM2INT(ruby_result);
49
- }
50
-
51
- gint
52
- BTree::size()
53
- {
54
- return g_tree_nnodes(this->tree);
55
- }
56
-
57
- gint
58
- BTree::height()
59
- {
60
- return g_tree_height(this->tree);
61
- }
62
-
63
- void
64
- BTree::set(VALUE key, VALUE value)
65
- {
66
- g_tree_replace(this->tree, (gpointer) key, (gpointer) value);
67
- }
68
-
69
- VALUE
70
- BTree::get(VALUE key)
71
- {
72
- gpointer result = g_tree_lookup(this->tree, reinterpret_cast<gconstpointer>(key));
73
-
74
- if (!result) {
75
- return Qnil;
76
- }
77
-
78
- return reinterpret_cast<VALUE>(result);
79
- }
80
-
81
- bool
82
- BTree::del(VALUE key)
83
- {
84
- return g_tree_remove(this->tree, reinterpret_cast<gconstpointer>(key));
85
- }
86
-
87
- void
88
- BTree::clear()
89
- {
90
- g_tree_unref(this->tree);
91
- this->tree = g_tree_new_with_data(BTree::nativeComparator, this);
92
- }
93
-
94
- bool
95
- BTree::has(VALUE key)
96
- {
97
- bool result = g_tree_lookup(this->tree, reinterpret_cast<gconstpointer>(key));
98
-
99
- if (!result) {
100
- return true;
101
- }
102
-
103
- return false;
104
- }
105
-
106
- gboolean
107
- BTree::traverseFunc(gpointer k, gpointer v, gpointer b)
108
- {
109
- const VALUE key = reinterpret_cast<VALUE>(k);
110
- const VALUE value = reinterpret_cast<VALUE>(v);
111
- const VALUE block = reinterpret_cast<VALUE>(b);
112
-
113
- rb_funcall(block, rb_intern("call"), 2, key, value);
114
-
115
- return FALSE;
116
- }
117
-
118
- void
119
- BTree::each(VALUE block)
120
- {
121
- g_tree_foreach(this->tree, BTree::traverseFunc, reinterpret_cast<gpointer>(block));
122
- }
123
-
124
- void
125
- BTree::each(GTraverseFunc func, gpointer data)
126
- {
127
- g_tree_foreach(this->tree, func, data);
128
- }
@@ -1,11 +0,0 @@
1
- #ifndef EXTCONF_H
2
- #define EXTCONF_H
3
- #define HAVE_G_TREE_INSERT 1
4
- #define HAVE_G_TREE_REPLACE 1
5
- #define HAVE_G_TREE_NNODES 1
6
- #define HAVE_G_TREE_LOOKUP 1
7
- #define HAVE_G_TREE_FOREACH 1
8
- #define HAVE_G_TREE_SEARCH 1
9
- #define HAVE_G_TREE_DESTROY 1
10
- #define HAVE_G_TREE_HEIGHT 1
11
- #endif
@@ -1,35 +0,0 @@
1
- require "mkmf"
2
-
3
- local_include = %w(
4
- $(srcdir)/include
5
- );
6
-
7
- ldflags = cppflags = nil
8
-
9
- pkg_config "glib-2.0"
10
- dir_config 'glib', cppflags, ldflags
11
-
12
- abort "Can't find the glib.h header" unless find_header 'glib.h'
13
- abort "Can't find the glib libary'" unless find_library 'glib-2.0', 'g_tree_new_full'
14
- abort "g_tree_insert() not found" unless have_func 'g_tree_insert'
15
- abort "g_tree_replace() not found" unless have_func 'g_tree_replace'
16
- abort "g_tree_nnodes() not found" unless have_func 'g_tree_nnodes'
17
- abort "g_tree_lookup() not found" unless have_func 'g_tree_lookup'
18
- abort "g_tree_foreach() not found" unless have_func 'g_tree_foreach'
19
- abort "g_tree_search() not found" unless have_func 'g_tree_search'
20
- abort "g_tree_destroy() not found" unless have_func 'g_tree_destroy'
21
- abort "g_tree_height() not found" unless have_func 'g_tree_height'
22
-
23
- $DEBUG = true
24
-
25
- $VPATH.concat %w(
26
- $(srcdir)/include
27
- )
28
-
29
- $INCFLAGS << local_include.map{|dir| " -I#{dir}" }.join("")
30
- CONFIG["debugflags"] = "-ggdb3"
31
- CONFIG["optflags"] = "-O0"
32
- $CXXFLAGS = "-O0 -ggdb3 -pipe"
33
-
34
- create_header
35
- create_makefile "native_btree/native_btree"