librtree 0.9.1 → 1.0.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (53) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +80 -0
  3. data/COPYING +21 -0
  4. data/README.md +87 -0
  5. data/ext/rtree/extconf.rb +37 -19
  6. data/ext/rtree/lib/README.md +9 -0
  7. data/ext/rtree/lib/bindex.c +157 -0
  8. data/ext/rtree/lib/bindex.h +31 -0
  9. data/ext/rtree/lib/bounds.h +21 -0
  10. data/ext/rtree/lib/branch.c +51 -0
  11. data/ext/rtree/lib/branches.c +17 -0
  12. data/ext/rtree/lib/bsrt.c +704 -0
  13. data/ext/rtree/lib/bsrt.h +16 -0
  14. data/ext/rtree/lib/constants.h +19 -0
  15. data/ext/rtree/lib/csv.c +81 -0
  16. data/ext/rtree/lib/csv.h +16 -0
  17. data/ext/rtree/lib/endianness.h +83 -0
  18. data/ext/rtree/lib/error.c +47 -0
  19. data/ext/rtree/lib/json.c +491 -0
  20. data/ext/rtree/lib/json.h +16 -0
  21. data/ext/rtree/lib/mk/Hdr.mk +3 -0
  22. data/ext/rtree/lib/mk/MakeDepend +25 -0
  23. data/ext/rtree/lib/mk/Obj.mk +3 -0
  24. data/ext/rtree/lib/node.c +736 -0
  25. data/ext/rtree/lib/package.c +11 -0
  26. data/ext/rtree/lib/page.c +47 -0
  27. data/ext/rtree/lib/page.h +13 -0
  28. data/ext/rtree/lib/postscript.c +543 -0
  29. data/ext/rtree/lib/rect.c +139 -0
  30. data/ext/rtree/lib/rectf.c +219 -0
  31. data/ext/rtree/lib/rtree/branch.h +105 -0
  32. data/ext/rtree/lib/rtree/branches.h +38 -0
  33. data/ext/rtree/lib/rtree/error.h +42 -0
  34. data/ext/rtree/lib/rtree/extent.h +20 -0
  35. data/ext/rtree/lib/rtree/node.h +96 -0
  36. data/ext/rtree/lib/rtree/package.h +14 -0
  37. data/ext/rtree/lib/rtree/postscript.h +66 -0
  38. data/ext/rtree/lib/rtree/rect.h +38 -0
  39. data/ext/rtree/lib/rtree/rectf.h +34 -0
  40. data/ext/rtree/lib/rtree/search.h +27 -0
  41. data/ext/rtree/lib/rtree/state.h +113 -0
  42. data/ext/rtree/lib/rtree/types.h +14 -0
  43. data/ext/rtree/lib/rtree-base.c +197 -0
  44. data/ext/rtree/lib/rtree.h +62 -0
  45. data/ext/rtree/lib/search.c +54 -0
  46. data/ext/rtree/lib/split.c +710 -0
  47. data/ext/rtree/lib/split.h +15 -0
  48. data/ext/rtree/lib/spvol.c +48 -0
  49. data/ext/rtree/lib/spvol.h +13 -0
  50. data/ext/rtree/lib/state.c +169 -0
  51. data/ext/rtree/rtree.c +11 -0
  52. data/lib/rtree.rb +4 -4
  53. metadata +65 -3
@@ -0,0 +1,48 @@
1
+ /* Autogenerated by spvol.py, do not edit */
2
+
3
+ #include "spvol.h"
4
+
5
+ int spvol(size_t dim, double *val)
6
+ {
7
+ static const double table[] = {
8
+ 0x1.0000000000000p+1,
9
+ 0x1.921fb54442d18p+1,
10
+ 0x1.0c152382d7366p+2,
11
+ 0x1.3bd3cc9be45dep+2,
12
+ 0x1.50e1eb50f3976p+2,
13
+ 0x1.4abbce625be53p+2,
14
+ 0x1.2e6290cef4eedp+2,
15
+ 0x1.03c1f081b5ac4p+2,
16
+ 0x1.a6358a2b69ee8p+1,
17
+ 0x1.466bc6775aae2p+1,
18
+ 0x1.e254a1c03f10dp+0,
19
+ 0x1.55d3c7e3cbffap+0,
20
+ 0x1.d23deea12eccap-1,
21
+ 0x1.32d2cce62bd86p-1,
22
+ 0x1.86991141a8ff6p-2,
23
+ 0x1.e1f506891babbp-3,
24
+ 0x1.20bab3dc8101bp-3,
25
+ 0x1.50783487ee782p-4,
26
+ 0x1.7dec9576c3b57p-5,
27
+ 0x1.a6d1f2a204a8cp-6,
28
+ 0x1.c915f468284fep-7,
29
+ 0x1.e3074fde8871fp-8,
30
+ 0x1.f378691d9b076p-9,
31
+ 0x1.f9d38a3763cc3p-10,
32
+ 0x1.f61f536576352p-11,
33
+ 0x1.e8f434d018d63p-12,
34
+ 0x1.d3658f946c006p-13,
35
+ 0x1.b6e24f44b128fp-14,
36
+ 0x1.95114f4a6c2b5p-15,
37
+ 0x1.6fadb9f155744p-16,
38
+ 0x1.4866e45924c72p-17,
39
+ 0x1.20c62c2f2d7f5p-18,
40
+ };
41
+ static const size_t table_size = sizeof(table) / sizeof(double);
42
+ if (dim < 1) return 1;
43
+ size_t n = dim - 1;
44
+ if (n >= table_size) return 1;
45
+ *val = table[n];
46
+ return 0;
47
+ }
48
+
@@ -0,0 +1,13 @@
1
+ /*
2
+ spvol.h
3
+ Copyright (c) J.J. Green 2020
4
+ */
5
+
6
+ #ifndef SPVOL_H
7
+ #define SPVOL_H
8
+
9
+ #include <stddef.h>
10
+
11
+ int spvol(size_t, double*);
12
+
13
+ #endif
@@ -0,0 +1,169 @@
1
+ #ifdef HAVE_CONFIG_H
2
+ #include "config.h"
3
+ #endif
4
+
5
+ #include "rtree/state.h"
6
+ #include "rtree/branch.h"
7
+ #include "rtree/node.h"
8
+
9
+ #include "page.h"
10
+ #include "constants.h"
11
+ #include "spvol.h"
12
+
13
+ #include <errno.h>
14
+ #include <string.h>
15
+
16
+ #ifdef HAVE_TGMATH_H
17
+ #include <tgmath.h>
18
+ #else
19
+ #include <math.h>
20
+ #endif
21
+
22
+ #ifdef HAVE_UNISTD_H
23
+ #include <unistd.h>
24
+ #endif
25
+
26
+
27
+ #define SPLIT_MASK ((1 << 2) - 1)
28
+ #define SPLIT_SHIFT 0
29
+
30
+ static state_flags_t flags_split(state_flags_t flags)
31
+ {
32
+ return (flags << SPLIT_SHIFT) & SPLIT_MASK;
33
+ }
34
+
35
+ state_flags_t state_split(const state_t *state)
36
+ {
37
+ return flags_split(state->flags);
38
+ }
39
+
40
+ #define NODE_PAGE_MASK ((1 << 8) - 1)
41
+ #define NODE_PAGE_SHIFT 2
42
+
43
+ static state_flags_t flags_node_page(state_flags_t flags)
44
+ {
45
+ return (flags >> NODE_PAGE_SHIFT) & NODE_PAGE_MASK;
46
+ }
47
+
48
+ state_flags_t state_node_page(const state_t *state)
49
+ {
50
+ return flags_node_page(state->flags);
51
+ }
52
+
53
+ /*
54
+ For dim 2 with floats and 4K page-size we find that a node-page
55
+ of 8 gives reasonable performance; here we guess a formula which
56
+ scales the way you would expect and choose the parameter 64 so that
57
+ it gives 8 in the dim 2 float case. No doubt one could do better
58
+ with a case-by-case optimisation, but there are a lot of cases to
59
+ consider, look at that later ...
60
+ */
61
+
62
+ static size_t node_page_default(size_t dims, size_t npg, size_t psz)
63
+ {
64
+ if (npg != 0) return npg;
65
+ size_t guess = psz / (dims * SIZEOF_RTREE_COORD_T * 64);
66
+ return guess ? guess : 1;
67
+ }
68
+
69
+ state_t* state_new(size_t dims, state_flags_t flags)
70
+ {
71
+ if (dims == 0)
72
+ {
73
+ errno = EDOM;
74
+ return NULL;
75
+ }
76
+
77
+ size_t psz;
78
+
79
+ if (page_size(&psz) != 0)
80
+ return NULL;
81
+
82
+ const size_t
83
+ npg = node_page_default(dims, flags_node_page(flags), psz),
84
+ nsz = psz / npg,
85
+ bsz = branch_sizeof(2 * dims),
86
+ factor = node_num_branch(nsz, bsz);
87
+
88
+ if (factor < 2)
89
+ {
90
+ errno = EINVAL;
91
+ return NULL;
92
+ }
93
+
94
+ double volume;
95
+
96
+ if (spvol(dims, &volume) != 0)
97
+ {
98
+ errno = EDOM;
99
+ return NULL;
100
+ }
101
+
102
+ state_t *state = malloc(sizeof(state_t));
103
+
104
+ if (state == NULL)
105
+ {
106
+ errno = ENOMEM;
107
+ return NULL;
108
+ }
109
+
110
+ state->dims = dims;
111
+ state->factor = factor;
112
+ state->size.page = psz;
113
+ state->size.branch = bsz;
114
+ state->size.node = nsz;
115
+ state->volume = volume;
116
+ state->flags = flags;
117
+ state->rectf.spherical_volume = rectf_spherical_volume(dims);
118
+ state->rectf.combine = rectf_combine(dims);
119
+
120
+ return state;
121
+ }
122
+
123
+ state_t* state_clone(const state_t *src)
124
+ {
125
+ state_t *dest;
126
+
127
+ if ((dest = malloc(sizeof(state_t))) != NULL)
128
+ {
129
+ memcpy(dest, src, sizeof(state_t));
130
+ return dest;
131
+ }
132
+
133
+ errno = ENOMEM;
134
+ return NULL;
135
+ }
136
+
137
+ void state_destroy(state_t *state)
138
+ {
139
+ free(state);
140
+ }
141
+
142
+ bool state_identical(const state_t *a, const state_t *b)
143
+ {
144
+ if (a && b)
145
+ {
146
+ return
147
+ (state_dims(a) == state_dims(b)) &&
148
+ (state_page_size(a) == state_page_size(b)) &&
149
+ (state_node_size(a) == state_node_size(b)) &&
150
+ (state_rect_size(a) == state_rect_size(b)) &&
151
+ (state_branching_factor(a) == state_branching_factor(b));
152
+ }
153
+
154
+ return ! (a || b);
155
+ }
156
+
157
+ extern size_t state_dims(const state_t*);
158
+ extern size_t state_page_size(const state_t*);
159
+ extern size_t state_node_size(const state_t*);
160
+ extern size_t state_rect_size(const state_t*);
161
+ extern size_t state_branch_size(const state_t*);
162
+ extern size_t state_branching_factor(const state_t*);
163
+ extern double state_unit_sphere_volume(const state_t*);
164
+ extern size_t state_bytes(const state_t*);
165
+ extern rtree_coord_t state_rsv(const state_t*, const rtree_coord_t*);
166
+ extern void state_rc(const state_t*,
167
+ const rtree_coord_t*,
168
+ const rtree_coord_t*,
169
+ rtree_coord_t*);
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 wrapper around
18
- # {http://soliton.vm.bytemark.co.uk/pub/jjg/en/code/librtree librtree}
19
- # implementing the R-tree spatial index of Guttman-Green.
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
  #
@@ -355,7 +355,7 @@ class RTree < RTreeBase
355
355
  # @return [Boolean] true if the RTree is empty
356
356
  #
357
357
  def empty?
358
- height.zero?
358
+ super
359
359
  end
360
360
 
361
361
  # Serialise to JSON stream
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: 0.9.1
4
+ version: 1.0.1
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-01-21 00:00:00.000000000 Z
11
+ date: 2023-03-16 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
@@ -103,7 +117,55 @@ extensions:
103
117
  - ext/rtree/extconf.rb
104
118
  extra_rdoc_files: []
105
119
  files:
120
+ - CHANGELOG.md
121
+ - COPYING
122
+ - README.md
106
123
  - ext/rtree/extconf.rb
124
+ - ext/rtree/lib/README.md
125
+ - ext/rtree/lib/bindex.c
126
+ - ext/rtree/lib/bindex.h
127
+ - ext/rtree/lib/bounds.h
128
+ - ext/rtree/lib/branch.c
129
+ - ext/rtree/lib/branches.c
130
+ - ext/rtree/lib/bsrt.c
131
+ - ext/rtree/lib/bsrt.h
132
+ - ext/rtree/lib/constants.h
133
+ - ext/rtree/lib/csv.c
134
+ - ext/rtree/lib/csv.h
135
+ - ext/rtree/lib/endianness.h
136
+ - ext/rtree/lib/error.c
137
+ - ext/rtree/lib/json.c
138
+ - ext/rtree/lib/json.h
139
+ - ext/rtree/lib/mk/Hdr.mk
140
+ - ext/rtree/lib/mk/MakeDepend
141
+ - ext/rtree/lib/mk/Obj.mk
142
+ - ext/rtree/lib/node.c
143
+ - ext/rtree/lib/package.c
144
+ - ext/rtree/lib/page.c
145
+ - ext/rtree/lib/page.h
146
+ - ext/rtree/lib/postscript.c
147
+ - ext/rtree/lib/rect.c
148
+ - ext/rtree/lib/rectf.c
149
+ - ext/rtree/lib/rtree-base.c
150
+ - ext/rtree/lib/rtree.h
151
+ - ext/rtree/lib/rtree/branch.h
152
+ - ext/rtree/lib/rtree/branches.h
153
+ - ext/rtree/lib/rtree/error.h
154
+ - ext/rtree/lib/rtree/extent.h
155
+ - ext/rtree/lib/rtree/node.h
156
+ - ext/rtree/lib/rtree/package.h
157
+ - ext/rtree/lib/rtree/postscript.h
158
+ - ext/rtree/lib/rtree/rect.h
159
+ - ext/rtree/lib/rtree/rectf.h
160
+ - ext/rtree/lib/rtree/search.h
161
+ - ext/rtree/lib/rtree/state.h
162
+ - ext/rtree/lib/rtree/types.h
163
+ - ext/rtree/lib/search.c
164
+ - ext/rtree/lib/split.c
165
+ - ext/rtree/lib/split.h
166
+ - ext/rtree/lib/spvol.c
167
+ - ext/rtree/lib/spvol.h
168
+ - ext/rtree/lib/state.c
107
169
  - ext/rtree/rtree.c
108
170
  - lib/rtree.rb
109
171
  homepage: https://gitlab.com/jjg/librtree-ruby
@@ -126,7 +188,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
126
188
  - !ruby/object:Gem::Version
127
189
  version: '0'
128
190
  requirements:
129
- - The librtree library (1.0.6 or later)
191
+ - The Jansson library
130
192
  rubygems_version: 3.1.6
131
193
  signing_key:
132
194
  specification_version: 4