librtree 0.9.1 → 1.0.1

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 (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