librtree 1.0.0 → 1.0.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +16 -0
- data/README.md +9 -7
- data/ext/rtree/lib/README.md +9 -0
- data/ext/rtree/lib/node.c +28 -0
- data/ext/rtree/lib/package.c +4 -4
- data/ext/rtree/lib/rtree/node.h +4 -0
- data/ext/rtree/lib/rtree/package.h +4 -4
- data/ext/rtree/lib/rtree-base.c +7 -0
- data/ext/rtree/lib/rtree.h +1 -0
- data/ext/rtree/rtree.c +11 -0
- data/lib/rtree.rb +35 -24
- metadata +32 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: c35526142564e94d93f091e405467f2ee2df3d294b1a4b8e3a87db66f1229043
|
4
|
+
data.tar.gz: dffb928767c821a14460f21d06fc1c90e41a7a17a94a8e700fac0c409d65ca59
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 0447a6e59546922ed8d227e0f3589aae7771243c4e16c24ae46cde5075dae4b1f7be2b1a8526d58adc6c3db379719201fcf370f1251e82773f488046ab66caff
|
7
|
+
data.tar.gz: 8ed4fd4e3982a4bfbffac9a53f92ae6dfd497ac4e684110d72591e7ec500a4ee2629a5b3a17dad5cc404383eb7aaccf333d7d15a8aeaa943d858a3e973a35d13
|
data/CHANGELOG.md
CHANGED
@@ -1,6 +1,22 @@
|
|
1
1
|
Changelog
|
2
2
|
---------
|
3
3
|
|
4
|
+
### 1.0.2, pending
|
5
|
+
|
6
|
+
- The `#serialise` method raises if the read from pipe returns
|
7
|
+
nil (which it might), so the method (and other methods which
|
8
|
+
call it to serialise) now return `String` or raise
|
9
|
+
- Added RBS static type signatures and infrastructure for static
|
10
|
+
type checking with **steep**
|
11
|
+
|
12
|
+
### 1.0.1, 16-03-2023
|
13
|
+
|
14
|
+
- Update to 1.1.4 of embedded `librtree`
|
15
|
+
- The `#empty?` method uses faster `rtree_empty` of the latest
|
16
|
+
version of the embedded library
|
17
|
+
- Added the `simplecov` gem and configured (Ruby) coverage in
|
18
|
+
CI runs
|
19
|
+
|
4
20
|
### 1.0.0, 24-02-2023
|
5
21
|
|
6
22
|
- The `librtree` library is no longer a requirement: the code
|
data/README.md
CHANGED
@@ -1,8 +1,8 @@
|
|
1
1
|
librtree-ruby
|
2
2
|
-------------
|
3
3
|
|
4
|
-
A Ruby native extension
|
5
|
-
|
4
|
+
A Ruby native extension implementing the R-tree spatial index of
|
5
|
+
Guttman-Green. The code is an embedded version of [librtree][3].
|
6
6
|
|
7
7
|
|
8
8
|
### Installing dependencies
|
@@ -47,12 +47,12 @@ will import the **RTree** class, its usage is described [here][5].
|
|
47
47
|
This is only needed if you want work on the extension, not for
|
48
48
|
a Gem install.
|
49
49
|
|
50
|
-
First install the dependencies
|
51
|
-
|
52
|
-
|
50
|
+
First install the dependencies as above. Then clone the repository and
|
51
|
+
install the extension's Ruby dependencies, there are several ways to do
|
52
|
+
this.
|
53
53
|
|
54
|
-
If using [rbenv][4], then first set a local version of Ruby to
|
55
|
-
|
54
|
+
If using [rbenv][4], then first set a local version of Ruby to use,
|
55
|
+
then install the gems into your local cache
|
56
56
|
|
57
57
|
rbenv local 2.7.0
|
58
58
|
bundle install
|
@@ -79,6 +79,8 @@ run the tests:
|
|
79
79
|
|
80
80
|
bundle exec rake compile
|
81
81
|
bundle exec rake spec
|
82
|
+
bundle exec steep check
|
83
|
+
|
82
84
|
|
83
85
|
[1]: http://www.digip.org/jansson/
|
84
86
|
[3]: http://soliton.vm.bytemark.co.uk/pub/jjg/en/code/librtree/
|
@@ -0,0 +1,9 @@
|
|
1
|
+
Embedded librtree
|
2
|
+
-----------------
|
3
|
+
|
4
|
+
The code in this directory is largely generated by the script
|
5
|
+
`bin/librtee-update`, one should not edit it directly, instead
|
6
|
+
make a clone of the [librtree][1] project, modify that and use
|
7
|
+
the update-script to copy the results here.
|
8
|
+
|
9
|
+
[1]: https://gitlab.com/jjg/librtree
|
data/ext/rtree/lib/node.c
CHANGED
@@ -700,6 +700,34 @@ bool node_identical(const state_t *state, const node_t *a, const node_t *b)
|
|
700
700
|
return ! (a || b);
|
701
701
|
}
|
702
702
|
|
703
|
+
/*
|
704
|
+
find whether the node or its descendants have a leaf, so we're
|
705
|
+
looking for a level-zero node with a non-zero count, of course
|
706
|
+
we short circuit as soon as we find one.
|
707
|
+
*/
|
708
|
+
|
709
|
+
bool node_nonempty(const state_t *state, const node_t *node)
|
710
|
+
{
|
711
|
+
node_count_t count;
|
712
|
+
|
713
|
+
if ((count = node_count(node)) == 0)
|
714
|
+
return false;
|
715
|
+
|
716
|
+
if (node_level(node) == 0)
|
717
|
+
return true;
|
718
|
+
|
719
|
+
for (size_t i = 0 ; i < count ; i++)
|
720
|
+
{
|
721
|
+
const branch_t *branch = node_get_branch(state, node, i);
|
722
|
+
const node_t *child = branch_get_child(branch);
|
723
|
+
|
724
|
+
if (node_nonempty(state, child))
|
725
|
+
return true;
|
726
|
+
}
|
727
|
+
|
728
|
+
return false;
|
729
|
+
}
|
730
|
+
|
703
731
|
extern node_count_t node_count(const node_t*);
|
704
732
|
extern void node_count_increment(node_t*);
|
705
733
|
extern void node_count_decrement(node_t*);
|
data/ext/rtree/lib/package.c
CHANGED
@@ -5,7 +5,7 @@
|
|
5
5
|
|
6
6
|
#include "rtree/package.h"
|
7
7
|
|
8
|
-
const char
|
9
|
-
const char
|
10
|
-
const char
|
11
|
-
const char
|
8
|
+
const char rtree_package_version[] = "1.1.4";
|
9
|
+
const char rtree_package_name[] = "librtree";
|
10
|
+
const char rtree_package_url[] = "https://gitlab.com/jjg/librtree";
|
11
|
+
const char rtree_package_bugreport[] = "j.j.green@gmx.co.uk";
|
data/ext/rtree/lib/rtree/node.h
CHANGED
@@ -8,6 +8,9 @@
|
|
8
8
|
|
9
9
|
#ifdef __cplusplus
|
10
10
|
extern "C" {
|
11
|
+
#if 0
|
12
|
+
}
|
13
|
+
#endif
|
11
14
|
#endif
|
12
15
|
|
13
16
|
#include <stdint.h>
|
@@ -54,6 +57,7 @@ int node_update(const state_t*, const node_t*, rtree_update_t*, void*);
|
|
54
57
|
bool node_identical(const state_t*, const node_t*, const node_t*);
|
55
58
|
node_height_t node_height(const state_t*, const node_t*);
|
56
59
|
size_t node_bytes(const state_t*, const node_t*);
|
60
|
+
bool node_nonempty(const state_t*, const node_t*);
|
57
61
|
|
58
62
|
inline node_count_t node_count(const node_t *node)
|
59
63
|
{
|
@@ -6,9 +6,9 @@
|
|
6
6
|
#ifndef RTREE_PACKAGE_H
|
7
7
|
#define RTREE_PACKAGE_H
|
8
8
|
|
9
|
-
extern const char
|
10
|
-
extern const char
|
11
|
-
extern const char
|
12
|
-
extern const char
|
9
|
+
extern const char rtree_package_version[];
|
10
|
+
extern const char rtree_package_name[];
|
11
|
+
extern const char rtree_package_url[];
|
12
|
+
extern const char rtree_package_bugreport[];
|
13
13
|
|
14
14
|
#endif
|
data/ext/rtree/lib/rtree-base.c
CHANGED
@@ -188,3 +188,10 @@ size_t rtree_bytes(const rtree_t *rtree)
|
|
188
188
|
state_bytes(rtree->state) +
|
189
189
|
node_bytes(rtree->state, rtree->root);
|
190
190
|
}
|
191
|
+
|
192
|
+
bool rtree_empty(const rtree_t *rtree)
|
193
|
+
{
|
194
|
+
return
|
195
|
+
(rtree == NULL) ||
|
196
|
+
(! node_nonempty(rtree->state, rtree->root));
|
197
|
+
}
|
data/ext/rtree/lib/rtree.h
CHANGED
data/ext/rtree/rtree.c
CHANGED
@@ -55,6 +55,16 @@ static VALUE rt_release(VALUE self)
|
|
55
55
|
return self;
|
56
56
|
}
|
57
57
|
|
58
|
+
static VALUE rt_empty(VALUE self)
|
59
|
+
{
|
60
|
+
rtree_t *rtree;
|
61
|
+
TypedData_Get_Struct(self, rtree_t, &rtree_type, rtree);
|
62
|
+
if (rtree_empty(rtree))
|
63
|
+
return Qtrue;
|
64
|
+
else
|
65
|
+
return Qfalse;
|
66
|
+
}
|
67
|
+
|
58
68
|
static VALUE rt_height(VALUE self)
|
59
69
|
{
|
60
70
|
rtree_t *rtree;
|
@@ -505,6 +515,7 @@ void Init_rtree(void)
|
|
505
515
|
rb_define_method(cRTreeBase, "free", rt_release, 0);
|
506
516
|
rb_define_method(cRTreeBase, "clone", rt_clone, 0);
|
507
517
|
rb_define_method(cRTreeBase, "update!", rt_update, 0);
|
518
|
+
rb_define_method(cRTreeBase, "empty?", rt_empty, 0);
|
508
519
|
rb_define_method(cRTreeBase, "height", rt_height, 0);
|
509
520
|
rb_define_method(cRTreeBase, "add_rect", rt_add_rect, 2);
|
510
521
|
rb_define_method(cRTreeBase, "search", rt_search, 1);
|
data/lib/rtree.rb
CHANGED
@@ -14,9 +14,9 @@ require 'fcntl'
|
|
14
14
|
|
15
15
|
# @author RTree J. J. Green
|
16
16
|
#
|
17
|
-
# A Ruby
|
18
|
-
#
|
19
|
-
#
|
17
|
+
# A Ruby native extension implementing the R-tree spatial index of
|
18
|
+
# Guttman-Green. The code is an emebded version of
|
19
|
+
# {http://soliton.vm.bytemark.co.uk/pub/jjg/en/code/librtree librtree}.
|
20
20
|
#
|
21
21
|
# Use
|
22
22
|
#
|
@@ -71,6 +71,10 @@ class RTree < RTreeBase
|
|
71
71
|
|
72
72
|
# @!visibility private
|
73
73
|
#
|
74
|
+
# The call to exit! here has a true argument, indicationg success,
|
75
|
+
# but the value is ignored, so could be omitted; but the sigature
|
76
|
+
# for exit! is incorrect: https://github.com/ruby/rbs/issues/1298
|
77
|
+
#
|
74
78
|
def deserialise(string, encoding)
|
75
79
|
raise TypeError unless string.is_a? String
|
76
80
|
rd, wr = IO.pipe(encoding)
|
@@ -89,7 +93,7 @@ class RTree < RTreeBase
|
|
89
93
|
wr.write(string)
|
90
94
|
ensure
|
91
95
|
wr.close
|
92
|
-
exit!
|
96
|
+
exit! true
|
93
97
|
end
|
94
98
|
end
|
95
99
|
result
|
@@ -97,13 +101,15 @@ class RTree < RTreeBase
|
|
97
101
|
|
98
102
|
# @!visibility private
|
99
103
|
#
|
104
|
+
# See note above on argument to exit!
|
105
|
+
#
|
100
106
|
def serialise(encoding)
|
101
107
|
rd, wr = IO.pipe(encoding)
|
102
108
|
if fork then
|
103
109
|
wr.close
|
104
110
|
unset_nonblock(rd)
|
105
111
|
begin
|
106
|
-
result = rd.read
|
112
|
+
result = rd.read || raise(IOError, 'reading from pipe')
|
107
113
|
ensure
|
108
114
|
rd.close
|
109
115
|
Process.wait
|
@@ -114,7 +120,7 @@ class RTree < RTreeBase
|
|
114
120
|
yield(wr)
|
115
121
|
ensure
|
116
122
|
wr.close
|
117
|
-
exit!
|
123
|
+
exit! true
|
118
124
|
end
|
119
125
|
end
|
120
126
|
result
|
@@ -233,19 +239,12 @@ class RTree < RTreeBase
|
|
233
239
|
# https://stackoverflow.com/questions/68122256/ It's still not
|
234
240
|
# clear to me why this qualification is needed, but that's a
|
235
241
|
# problem with my understanding of the Ruby Eigenclass, it is
|
236
|
-
# the expected behaviour
|
242
|
+
# the expected behaviour. Note that self.const_get(:FOO) is
|
243
|
+
# the same as self::FOO, but the latter gives a spurious
|
244
|
+
# type-warning from steep
|
237
245
|
#
|
238
246
|
def split_flag(split)
|
239
|
-
|
240
|
-
when :quadratic
|
241
|
-
self::SPLIT_QUADRATIC
|
242
|
-
when :linear
|
243
|
-
self::SPLIT_LINEAR
|
244
|
-
when :greene
|
245
|
-
self::SPLIT_GREENE
|
246
|
-
else
|
247
|
-
raise ArgumentError, "bad split value: #{split}"
|
248
|
-
end
|
247
|
+
self.const_get(split_symbol(split))
|
249
248
|
end
|
250
249
|
|
251
250
|
# @!visibility private
|
@@ -256,10 +255,22 @@ class RTree < RTreeBase
|
|
256
255
|
|
257
256
|
private
|
258
257
|
|
259
|
-
def deserialise(
|
260
|
-
RTree::IOUtil.deserialise(
|
258
|
+
def deserialise(string, encoding, &block)
|
259
|
+
RTree::IOUtil.deserialise(string, encoding, &block)
|
261
260
|
end
|
262
261
|
|
262
|
+
def split_symbol(split)
|
263
|
+
case split
|
264
|
+
when :quadratic
|
265
|
+
:SPLIT_QUADRATIC
|
266
|
+
when :linear
|
267
|
+
:SPLIT_LINEAR
|
268
|
+
when :greene
|
269
|
+
:SPLIT_GREENE
|
270
|
+
else
|
271
|
+
raise ArgumentError, "bad split value: #{split}"
|
272
|
+
end
|
273
|
+
end
|
263
274
|
end
|
264
275
|
|
265
276
|
# Initialize a new (empty) RTree
|
@@ -355,7 +366,7 @@ class RTree < RTreeBase
|
|
355
366
|
# @return [Boolean] true if the RTree is empty
|
356
367
|
#
|
357
368
|
def empty?
|
358
|
-
|
369
|
+
super
|
359
370
|
end
|
360
371
|
|
361
372
|
# Serialise to JSON stream
|
@@ -512,8 +523,8 @@ class RTree < RTreeBase
|
|
512
523
|
node_page_flag | split_flag
|
513
524
|
end
|
514
525
|
|
515
|
-
def serialise(
|
516
|
-
RTree::IOUtil.serialise(
|
526
|
+
def serialise(encoding, &block)
|
527
|
+
RTree::IOUtil.serialise(encoding, &block)
|
517
528
|
end
|
518
529
|
|
519
530
|
end
|
@@ -576,8 +587,8 @@ class RTree::Style < RTreeStyleBase
|
|
576
587
|
|
577
588
|
private
|
578
589
|
|
579
|
-
def deserialise(
|
580
|
-
RTree::IOUtil.deserialise(
|
590
|
+
def deserialise(string, encoding, &block)
|
591
|
+
RTree::IOUtil.deserialise(string, encoding, &block)
|
581
592
|
end
|
582
593
|
|
583
594
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: librtree
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.0.
|
4
|
+
version: 1.0.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- J.J. Green
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2023-
|
11
|
+
date: 2023-04-06 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -52,6 +52,20 @@ dependencies:
|
|
52
52
|
- - "~>"
|
53
53
|
- !ruby/object:Gem::Version
|
54
54
|
version: '3.10'
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: simplecov
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - "~>"
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '0.22'
|
62
|
+
type: :development
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - "~>"
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: '0.22'
|
55
69
|
- !ruby/object:Gem::Dependency
|
56
70
|
name: yard
|
57
71
|
requirement: !ruby/object:Gem::Requirement
|
@@ -94,6 +108,20 @@ dependencies:
|
|
94
108
|
- - "~>"
|
95
109
|
- !ruby/object:Gem::Version
|
96
110
|
version: '1.1'
|
111
|
+
- !ruby/object:Gem::Dependency
|
112
|
+
name: steep
|
113
|
+
requirement: !ruby/object:Gem::Requirement
|
114
|
+
requirements:
|
115
|
+
- - "~>"
|
116
|
+
- !ruby/object:Gem::Version
|
117
|
+
version: '1.3'
|
118
|
+
type: :development
|
119
|
+
prerelease: false
|
120
|
+
version_requirements: !ruby/object:Gem::Requirement
|
121
|
+
requirements:
|
122
|
+
- - "~>"
|
123
|
+
- !ruby/object:Gem::Version
|
124
|
+
version: '1.3'
|
97
125
|
description: |
|
98
126
|
A Ruby extension implementing the R-tree spatial-index of
|
99
127
|
Guttman-Green.
|
@@ -107,6 +135,7 @@ files:
|
|
107
135
|
- COPYING
|
108
136
|
- README.md
|
109
137
|
- ext/rtree/extconf.rb
|
138
|
+
- ext/rtree/lib/README.md
|
110
139
|
- ext/rtree/lib/bindex.c
|
111
140
|
- ext/rtree/lib/bindex.h
|
112
141
|
- ext/rtree/lib/bounds.h
|
@@ -173,7 +202,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
173
202
|
- !ruby/object:Gem::Version
|
174
203
|
version: '0'
|
175
204
|
requirements:
|
176
|
-
- The
|
205
|
+
- The Jansson library
|
177
206
|
rubygems_version: 3.1.6
|
178
207
|
signing_key:
|
179
208
|
specification_version: 4
|