native_btree 0.1.0.alpha1 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
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"