native_btree 0.1.0 → 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.
- checksums.yaml +4 -4
- data/CHANGELOG.md +25 -2
- data/CMakeLists.txt +3 -1
- data/README.md +22 -1
- data/ext/native_btree/CMakeLists.txt +10 -0
- data/ext/native_btree/conversion.c +54 -0
- data/ext/native_btree/include/conversion.h +8 -0
- data/ext/native_btree/include/instance.h +6 -0
- data/ext/native_btree/include/native_btree.h +1 -38
- data/ext/native_btree/instance.c +43 -0
- data/ext/native_btree/native_btree.c +4 -5
- data/lib/native_btree/native_btree.bundle +0 -0
- data/lib/native_btree/version.rb +1 -1
- data/spec/native_btree_instance_spec.rb +52 -8
- metadata +4 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 6e2df9fa087346ceb88e3352b81707085432b0f2b55cb6315175236bcdfb5167
|
4
|
+
data.tar.gz: 5ce010f70cfafe99d7a89ffe1517330da355bde7a52bc3255711dc56e159b14e
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 5a071792ca329c65f44f04ab4609dce810136fe96d2250d785bdce5d26008adc8c81c03b36a7bc1afd5a7000932ce069af74d368fa4f504afad5fdca5d828efb
|
7
|
+
data.tar.gz: 5790f7446d3390d004101d25c8b7f716c19cdc79cbec64e8f4741667aee281fb8d72ef3b9dca28aef4382d0c52b678a626220cd673ac32e8e8e1f4f3b41cb0b6
|
data/CHANGELOG.md
CHANGED
@@ -1,5 +1,28 @@
|
|
1
|
+
# Changelog
|
2
|
+
|
3
|
+
All notable changes to this project will be documented in this file.
|
4
|
+
|
5
|
+
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
|
6
|
+
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
7
|
+
|
1
8
|
## [Unreleased]
|
2
9
|
|
3
|
-
|
10
|
+
* filter()
|
11
|
+
* filter!()
|
12
|
+
* each_key()
|
13
|
+
* each_value()
|
14
|
+
* select()
|
15
|
+
* select!
|
16
|
+
|
17
|
+
## [0.2.0] - 2022-09-07
|
18
|
+
|
19
|
+
### Changed
|
20
|
+
|
21
|
+
* Small refactoring
|
22
|
+
|
23
|
+
### Added
|
4
24
|
|
5
|
-
|
25
|
+
* to_a()
|
26
|
+
* to_h()
|
27
|
+
* clear()
|
28
|
+
* includes?()
|
data/CMakeLists.txt
CHANGED
@@ -2,9 +2,11 @@ cmake_minimum_required(VERSION 3.14.0 FATAL_ERROR)
|
|
2
2
|
|
3
3
|
project(ruby-native-btree
|
4
4
|
LANGUAGES C
|
5
|
-
VERSION 0.
|
5
|
+
VERSION 0.2.0
|
6
6
|
HOMEPAGE_URL https://github.com/unixs/ruby-native-btree)
|
7
7
|
|
8
|
+
include(CheckSymbolExists)
|
9
|
+
|
8
10
|
set(REQUIRED_RUBY_VERSION 2.6.0)
|
9
11
|
|
10
12
|
set(CMAKE_C_STANDARD 11)
|
data/README.md
CHANGED
@@ -1,12 +1,33 @@
|
|
1
1
|
# GLib Balanced binary tree (GTree) bindings for Ruby
|
2
2
|
|
3
3
|
[](https://github.com/unixs/ruby-native-btree/actions/workflows/main.yml)
|
4
|
+
[](https://badge.fury.io/rb/native_btree)
|
5
|
+
[](https://www.gnu.org/licenses/lgpl-3.0)
|
6
|
+
|
4
7
|
|
5
8
|
[GTree - balanced binary tree from GLib library](https://docs.gtk.org/glib/struct.Tree.html)
|
6
9
|
|
7
10
|
In most cases it will behave same as Hash, but keys will be ordered by passed comparator.
|
8
11
|
|
9
|
-
##
|
12
|
+
## Requirements
|
13
|
+
|
14
|
+
* **CMake** build tool version **>= 3.14.0**
|
15
|
+
* `pkg-config` tool
|
16
|
+
* **GLib** library
|
17
|
+
* On Ubuntu run:
|
18
|
+
```bash
|
19
|
+
sudo apt-get install pkg-config cmake libglib2.0-dev
|
20
|
+
```
|
21
|
+
* On MacOS run:
|
22
|
+
```
|
23
|
+
brew install pkg-config cmake glib
|
24
|
+
```
|
25
|
+
* On FreeBSD use pkg or ports.
|
26
|
+
* On windows use Google. I don't really know how it can work at this moment... But i think it's possible
|
27
|
+
|
28
|
+
**Check CMake tool version!**
|
29
|
+
|
30
|
+
## Basic usage
|
10
31
|
|
11
32
|
```ruby
|
12
33
|
require 'native_btree'
|
@@ -7,11 +7,20 @@ pkg_check_modules(GLIB2 REQUIRED glib-2.0)
|
|
7
7
|
|
8
8
|
include_directories(include ${GLIB2_INCLUDE_DIRS})
|
9
9
|
|
10
|
+
list(APPEND CMAKE_REQUIRED_LIBRARIES ${GLIB2_LDFLAGS})
|
11
|
+
list(APPEND CMAKE_REQUIRED_INCLUDES ${GLIB2_INCLUDE_DIRS})
|
12
|
+
check_symbol_exists(g_tree_remove_all "glib.h" HAVE_GTREE_REMOVE_ALL)
|
13
|
+
|
14
|
+
if(HAVE_GTREE_REMOVE_ALL)
|
15
|
+
add_compile_definitions(HAVE_GTREE_REMOVE_ALL)
|
16
|
+
endif()
|
17
|
+
|
10
18
|
add_library(rbtree_type OBJECT rbtree_type.c)
|
11
19
|
add_library(constructor OBJECT constructor.c)
|
12
20
|
add_library(instance OBJECT instance.c)
|
13
21
|
add_library(comparator OBJECT comparator.c)
|
14
22
|
add_library(iterators OBJECT iterators.c)
|
23
|
+
add_library(conversion OBJECT conversion.c)
|
15
24
|
|
16
25
|
add_library(${EXT_NAME}
|
17
26
|
SHARED
|
@@ -19,6 +28,7 @@ add_library(${EXT_NAME}
|
|
19
28
|
|
20
29
|
target_link_libraries(${EXT_NAME}
|
21
30
|
PRIVATE
|
31
|
+
conversion
|
22
32
|
iterators
|
23
33
|
rbtree_type
|
24
34
|
constructor
|
@@ -0,0 +1,54 @@
|
|
1
|
+
#include <conversion.h>
|
2
|
+
|
3
|
+
static gboolean
|
4
|
+
rbtree_to_h_callback(gpointer key, gpointer value, gpointer data)
|
5
|
+
{
|
6
|
+
VALUE hash = (VALUE) data;
|
7
|
+
|
8
|
+
rb_hash_aset(hash, (VALUE) key, (VALUE) value);
|
9
|
+
|
10
|
+
return FALSE;
|
11
|
+
}
|
12
|
+
|
13
|
+
|
14
|
+
static gboolean
|
15
|
+
rbtree_to_a_callback(gpointer key, gpointer value, gpointer data)
|
16
|
+
{
|
17
|
+
VALUE array = (VALUE) data;
|
18
|
+
VALUE array2 = rb_ary_new2(2);
|
19
|
+
|
20
|
+
rb_ary_push(array2, (VALUE) key);
|
21
|
+
rb_ary_push(array2, (VALUE) value);
|
22
|
+
|
23
|
+
rb_ary_push(array, array2);
|
24
|
+
|
25
|
+
return FALSE;
|
26
|
+
}
|
27
|
+
|
28
|
+
|
29
|
+
VALUE
|
30
|
+
rbtree_to_h(VALUE self)
|
31
|
+
{
|
32
|
+
EXTRACT_RBTREE_SELF(rbtree);
|
33
|
+
|
34
|
+
VALUE hash = rb_hash_new();
|
35
|
+
|
36
|
+
g_tree_foreach(rbtree->gtree, rbtree_to_h_callback, (gpointer) hash);
|
37
|
+
|
38
|
+
return hash;
|
39
|
+
}
|
40
|
+
|
41
|
+
|
42
|
+
VALUE
|
43
|
+
rbtree_to_a(VALUE self)
|
44
|
+
{
|
45
|
+
EXTRACT_RBTREE_SELF(rbtree);
|
46
|
+
|
47
|
+
gint tree_size = g_tree_nnodes(rbtree->gtree);
|
48
|
+
|
49
|
+
VALUE array = rb_ary_new2(tree_size);
|
50
|
+
|
51
|
+
g_tree_foreach(rbtree->gtree, rbtree_to_a_callback, (gpointer) array);
|
52
|
+
|
53
|
+
return array;
|
54
|
+
}
|
@@ -4,43 +4,6 @@
|
|
4
4
|
#include <constructor.h>
|
5
5
|
#include <instance.h>
|
6
6
|
#include <iterators.h>
|
7
|
-
|
8
|
-
/*
|
9
|
-
VALUE
|
10
|
-
btree_new(VALUE klass);
|
11
|
-
|
12
|
-
VALUE
|
13
|
-
btree_init(VALUE self);
|
14
|
-
|
15
|
-
VALUE
|
16
|
-
btree_size(VALUE self);
|
17
|
-
|
18
|
-
VALUE
|
19
|
-
btree_height(VALUE self);
|
20
|
-
|
21
|
-
VALUE
|
22
|
-
btree_set(VALUE self, VALUE key, VALUE value);
|
23
|
-
|
24
|
-
VALUE
|
25
|
-
btree_get(VALUE self, VALUE key);
|
26
|
-
|
27
|
-
VALUE
|
28
|
-
btree_delete(VALUE self, VALUE key);
|
29
|
-
|
30
|
-
VALUE
|
31
|
-
btree_clear(VALUE self);
|
32
|
-
|
33
|
-
VALUE
|
34
|
-
btree_has(VALUE self, VALUE key);
|
35
|
-
|
36
|
-
VALUE
|
37
|
-
btree_each(VALUE self);
|
38
|
-
|
39
|
-
VALUE
|
40
|
-
btree_cmp(VALUE self, VALUE tree2);
|
41
|
-
|
42
|
-
VALUE
|
43
|
-
btree_equal(VALUE self, VALUE tree2);
|
44
|
-
*/
|
7
|
+
#include <conversion.h>
|
45
8
|
|
46
9
|
#endif // _NATIVE_BTREE_
|
data/ext/native_btree/instance.c
CHANGED
@@ -1,5 +1,18 @@
|
|
1
1
|
#include <instance.h>
|
2
2
|
|
3
|
+
#ifndef HAVE_GTREE_REMOVE_ALL
|
4
|
+
|
5
|
+
static gboolean
|
6
|
+
rbtree_remove_node(gpointer key, gpointer val, gpointer data) {
|
7
|
+
RBTree *rbtree = (RBTree *) data;
|
8
|
+
|
9
|
+
g_tree_remove(rbtree->gtree, key);
|
10
|
+
|
11
|
+
return FALSE;
|
12
|
+
}
|
13
|
+
|
14
|
+
#endif
|
15
|
+
|
3
16
|
|
4
17
|
VALUE
|
5
18
|
rbtree_set(VALUE self, VALUE key, VALUE value)
|
@@ -81,3 +94,33 @@ rbtree_size(VALUE self)
|
|
81
94
|
|
82
95
|
return result;
|
83
96
|
}
|
97
|
+
|
98
|
+
|
99
|
+
VALUE
|
100
|
+
rbtree_clear(VALUE self)
|
101
|
+
{
|
102
|
+
EXTRACT_RBTREE_SELF(rbtree);
|
103
|
+
|
104
|
+
#ifdef HAVE_GTREE_REMOVE_ALL
|
105
|
+
g_tree_remove_all(rbtree->gtree);
|
106
|
+
#else
|
107
|
+
g_tree_foreach(rbtree->gtree, rbtree_remove_node, (gpointer) rbtree);
|
108
|
+
#endif
|
109
|
+
|
110
|
+
return self;
|
111
|
+
}
|
112
|
+
|
113
|
+
|
114
|
+
VALUE
|
115
|
+
rbtree_is_include(VALUE self, VALUE key)
|
116
|
+
{
|
117
|
+
EXTRACT_RBTREE_SELF(rbtree);
|
118
|
+
|
119
|
+
gpointer exists = g_tree_lookup(rbtree->gtree, (gconstpointer) key);
|
120
|
+
|
121
|
+
if (exists == NULL) {
|
122
|
+
return Qfalse;
|
123
|
+
}
|
124
|
+
|
125
|
+
return Qtrue;
|
126
|
+
}
|
@@ -15,15 +15,14 @@ Init_native_btree()
|
|
15
15
|
|
16
16
|
rb_define_method(rbtree_class, "[]=", rbtree_set, 2);
|
17
17
|
rb_define_alias(rbtree_class, "set", "[]=");
|
18
|
-
|
19
18
|
rb_define_method(rbtree_class, "[]", rbtree_get, 1);
|
20
19
|
rb_define_alias(rbtree_class, "get", "[]");
|
21
|
-
|
22
20
|
rb_define_method(rbtree_class, "delete", rbtree_delete, 1);
|
23
|
-
|
24
21
|
rb_define_method(rbtree_class, "each", rbtree_each, 0);
|
25
|
-
|
26
22
|
rb_define_method(rbtree_class, "size", rbtree_size, 0);
|
27
23
|
rb_define_method(rbtree_class, "height", rbtree_height, 0);
|
24
|
+
rb_define_method(rbtree_class, "clear", rbtree_clear, 0);
|
25
|
+
rb_define_method(rbtree_class, "include?", rbtree_is_include, 1);
|
26
|
+
rb_define_method(rbtree_class, "to_h", rbtree_to_h, 0);
|
27
|
+
rb_define_method(rbtree_class, "to_a", rbtree_to_a, 0);
|
28
28
|
}
|
29
|
-
|
Binary file
|
data/lib/native_btree/version.rb
CHANGED
@@ -137,8 +137,22 @@ RSpec.describe NativeBtree do
|
|
137
137
|
end
|
138
138
|
|
139
139
|
describe "#clear method" do
|
140
|
-
|
141
|
-
expect(
|
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
|
142
156
|
end
|
143
157
|
end
|
144
158
|
|
@@ -155,21 +169,51 @@ RSpec.describe NativeBtree do
|
|
155
169
|
end
|
156
170
|
|
157
171
|
describe "#include? method" do
|
158
|
-
|
159
|
-
expect(
|
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
|
160
184
|
end
|
161
185
|
end
|
162
186
|
|
163
187
|
describe "to_ methods" do
|
164
188
|
describe "#to_a" do
|
165
|
-
|
166
|
-
expect(
|
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
|
167
201
|
end
|
168
202
|
end
|
169
203
|
|
170
204
|
describe "#to_h" do
|
171
|
-
|
172
|
-
expect(
|
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
|
173
217
|
end
|
174
218
|
end
|
175
219
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: native_btree
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Alexander Feodorov
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2022-09-
|
11
|
+
date: 2022-09-06 00:00:00.000000000 Z
|
12
12
|
dependencies: []
|
13
13
|
description: Ruby bindings to GTree balanced binary tree from GLib library.
|
14
14
|
email:
|
@@ -27,11 +27,13 @@ files:
|
|
27
27
|
- ext/native_btree/CMakeLists.txt
|
28
28
|
- ext/native_btree/comparator.c
|
29
29
|
- ext/native_btree/constructor.c
|
30
|
+
- ext/native_btree/conversion.c
|
30
31
|
- ext/native_btree/extconf_cmake.rb
|
31
32
|
- ext/native_btree/include/btree.h
|
32
33
|
- ext/native_btree/include/common.h
|
33
34
|
- ext/native_btree/include/comparator.h
|
34
35
|
- ext/native_btree/include/constructor.h
|
36
|
+
- ext/native_btree/include/conversion.h
|
35
37
|
- ext/native_btree/include/instance.h
|
36
38
|
- ext/native_btree/include/iterators.h
|
37
39
|
- ext/native_btree/include/native_btree.h
|