librtree 0.8.3 → 0.8.4

Sign up to get free protection for your applications and to get access to all the features.
Files changed (4) hide show
  1. checksums.yaml +4 -4
  2. data/ext/rtree/rtree.c +70 -29
  3. data/lib/rtree.rb +25 -0
  4. metadata +3 -3
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: a175d9b929078c0a8d94c7adbb7af7eb728acda5a401a99f95504fa30f129470
4
- data.tar.gz: c5042bd9893f64c112d3940d549fa9dde8503121ced5507ddf2392840950aac0
3
+ metadata.gz: 636adac7b1df4b79407c5d7402aa101d4362379dc7c325e7283c81eb2faeb94e
4
+ data.tar.gz: ee8da51ba25d5e5648ee9b511a0507beb0b1bb5325b1c5dcfbb499e01cf9fb77
5
5
  SHA512:
6
- metadata.gz: c106ef413a5d28068882ce4c9a24d9d1cb7124b925722915482d59809fdb71b556326e6bca3ebc1fcb9191edb9d799a6233054ae417e9f3c8d3ae5f871057c08
7
- data.tar.gz: b14066ff0a21bfea29efb91fd52018906358b2ef6eb9ba9337869af62a4be4f2e17b6686f7788fda038b96015630b0b005d0c0a9133899b96e163ac630e49c7d
6
+ metadata.gz: c6a7c7d731a9d09caf84e9e9c1b7133cdbadad297efe09af3875f5f97352740c7c9786c6ceb3c74665110b2b248b2c59ab712b9e3bb3b8e195e946745648f840
7
+ data.tar.gz: 2be108c80ff14fc3d2d5ba0ebead91a07e0a537d8a7a4ded460fdec4645ff41eb3412a765d02edc3d7fff87dc04b9dc7c2d0af4516b70e14464e51c556f379f9
data/ext/rtree/rtree.c CHANGED
@@ -1,26 +1,48 @@
1
1
  #include <ruby.h>
2
2
  #include <ruby/io.h>
3
+ #include <ruby/version.h>
3
4
 
4
5
  #include <rtree.h>
6
+ #include <rtree/package.h>
5
7
 
6
8
  #include <errno.h>
7
9
  #include <stdint.h>
8
10
 
9
- static void lrt_free(void *p)
11
+
12
+ static void lrt_dfree(void *p)
10
13
  {
11
- rtree_t *rtree = p;
12
- rtree_destroy(rtree);
14
+ rtree_destroy((rtree_t*)p);
15
+ }
16
+
17
+ static size_t lrt_dsize(const void *p)
18
+ {
19
+ return rtree_bytes((const rtree_t*)p);
13
20
  }
14
21
 
22
+ static rb_data_type_t type = {
23
+ .wrap_struct_name = "rtree-wrap",
24
+ .function = {
25
+ .dmark = NULL,
26
+ .dfree = lrt_dfree,
27
+ .dsize = lrt_dsize,
28
+ #if RUBY_API_VERSION_CODE < 20700
29
+ .reserved = { NULL, NULL }
30
+ #else
31
+ .dcompact = NULL,
32
+ .reserved = { NULL }
33
+ #endif
34
+ },
35
+ .parent = NULL,
36
+ .data = NULL,
37
+ .flags = RUBY_TYPED_FREE_IMMEDIATELY
38
+ };
39
+
15
40
  static VALUE lrt_alloc(VALUE cls)
16
41
  {
17
42
  rtree_t *rtree;;
18
-
19
43
  if ((rtree = rtree_alloc()) == NULL)
20
44
  rb_raise(rb_eNoMemError, "failed to alloc rtree");
21
-
22
- VALUE obj = Data_Wrap_Struct(cls, NULL, lrt_free, rtree);
23
- return obj;
45
+ return TypedData_Wrap_Struct(cls, &type, rtree);
24
46
  }
25
47
 
26
48
  static VALUE lrt_init(VALUE self, VALUE dim_obj, VALUE flags_obj)
@@ -32,7 +54,7 @@ static VALUE lrt_init(VALUE self, VALUE dim_obj, VALUE flags_obj)
32
54
  state_flags_t flags = FIX2UINT(flags_obj);
33
55
 
34
56
  rtree_t *rtree;
35
- Data_Get_Struct(self, rtree_t, rtree);
57
+ TypedData_Get_Struct(self, rtree_t, &type, rtree);
36
58
 
37
59
  if ((rtree_init(rtree, dim, flags)) != 0)
38
60
  rb_raise(rb_eNoMemError, "failed to init rtree");
@@ -43,7 +65,7 @@ static VALUE lrt_init(VALUE self, VALUE dim_obj, VALUE flags_obj)
43
65
  static VALUE lrt_release(VALUE self)
44
66
  {
45
67
  rtree_t *rtree;
46
- Data_Get_Struct(self, rtree_t, rtree);
68
+ TypedData_Get_Struct(self, rtree_t, &type, rtree);
47
69
  rtree_destroy(rtree);
48
70
  return self;
49
71
  }
@@ -51,7 +73,7 @@ static VALUE lrt_release(VALUE self)
51
73
  static VALUE lrt_height(VALUE self)
52
74
  {
53
75
  rtree_t *rtree;
54
- Data_Get_Struct(self, rtree_t, rtree);
76
+ TypedData_Get_Struct(self, rtree_t, &type, rtree);
55
77
  return INT2NUM(rtree_height(rtree));
56
78
  }
57
79
 
@@ -61,7 +83,7 @@ static VALUE lrt_add_rect(VALUE self, VALUE id_obj, VALUE coord_obj)
61
83
  Check_Type(id_obj, T_FIXNUM);
62
84
 
63
85
  rtree_t *rtree;
64
- Data_Get_Struct(self, rtree_t, rtree);
86
+ TypedData_Get_Struct(self, rtree_t, &type, rtree);
65
87
 
66
88
  rtree_id_t
67
89
  id = FIX2ULONG(id_obj);
@@ -119,7 +141,7 @@ static VALUE lrt_update(VALUE self)
119
141
  rb_raise(rb_eArgError, "Expected block");
120
142
 
121
143
  rtree_t *rtree;
122
- Data_Get_Struct(self, rtree_t, rtree);
144
+ TypedData_Get_Struct(self, rtree_t, &type, rtree);
123
145
 
124
146
  size_t len = 2 * state_dims(rtree->state);
125
147
  int err = rtree_update(rtree, update_cb, &len);
@@ -155,7 +177,7 @@ static VALUE lrt_search(VALUE self, VALUE coord_obj)
155
177
  Check_Type(coord_obj, T_ARRAY);
156
178
 
157
179
  rtree_t *rtree;
158
- Data_Get_Struct(self, rtree_t, rtree);
180
+ TypedData_Get_Struct(self, rtree_t, &type, rtree);
159
181
 
160
182
  size_t
161
183
  len = RARRAY_LEN(coord_obj),
@@ -198,9 +220,7 @@ static VALUE deserialise(VALUE cls, VALUE io_obj, deserialise_t *f)
198
220
  rb_raise(rb_eRuntimeError, "Failed read from stream");
199
221
  }
200
222
 
201
- VALUE obj = Data_Wrap_Struct(cls, NULL, lrt_free, rtree);
202
-
203
- return obj;
223
+ return TypedData_Wrap_Struct(cls, &type, rtree);
204
224
  }
205
225
 
206
226
  static VALUE lrt_json_read(VALUE cls, VALUE io_obj)
@@ -239,9 +259,7 @@ static VALUE lrt_csv_read(VALUE cls,
239
259
  rb_raise(rb_eRuntimeError, "Failed read from stream");
240
260
  }
241
261
 
242
- VALUE obj = Data_Wrap_Struct(cls, NULL, lrt_free, rtree);
243
-
244
- return obj;
262
+ return TypedData_Wrap_Struct(cls, &type, rtree);
245
263
  }
246
264
 
247
265
  /* serialisation */
@@ -259,7 +277,7 @@ static VALUE serialise(VALUE self, VALUE io_obj, serialise_t *f)
259
277
  FILE *fp = rb_io_stdio_file(io);
260
278
 
261
279
  rtree_t *rtree;
262
- Data_Get_Struct(self, rtree_t, rtree);
280
+ TypedData_Get_Struct(self, rtree_t, &type, rtree);
263
281
 
264
282
  int err = f(rtree, fp);
265
283
  if (err != 0)
@@ -282,8 +300,8 @@ static VALUE lrt_identical(VALUE self, VALUE other)
282
300
  {
283
301
  rtree_t *rtree_self, *rtree_other;
284
302
 
285
- Data_Get_Struct(self, rtree_t, rtree_self);
286
- Data_Get_Struct(other, rtree_t, rtree_other);
303
+ TypedData_Get_Struct(self, rtree_t, &type, rtree_self);
304
+ TypedData_Get_Struct(other, rtree_t, &type, rtree_other);
287
305
 
288
306
  if (rtree_identical(rtree_self, rtree_other))
289
307
  return Qtrue;
@@ -294,7 +312,7 @@ static VALUE lrt_identical(VALUE self, VALUE other)
294
312
  static VALUE lrt_clone(VALUE self)
295
313
  {
296
314
  rtree_t *rtree;
297
- Data_Get_Struct(self, rtree_t, rtree);
315
+ TypedData_Get_Struct(self, rtree_t, &type, rtree);
298
316
 
299
317
  rtree_t *clone;
300
318
  errno = 0;
@@ -306,16 +324,13 @@ static VALUE lrt_clone(VALUE self)
306
324
  rb_raise(rb_eRuntimeError, "Failed clone");
307
325
  }
308
326
 
309
- VALUE cls = CLASS_OF(self);
310
- VALUE obj = Data_Wrap_Struct(cls, NULL, lrt_free, clone);
311
-
312
- return obj;
327
+ return TypedData_Wrap_Struct(CLASS_OF(self), &type, clone);
313
328
  }
314
329
 
315
330
  static VALUE state_size_access(VALUE self, size_t (*f)(const state_t*))
316
331
  {
317
332
  rtree_t *rtree;
318
- Data_Get_Struct(self, rtree_t, rtree);
333
+ TypedData_Get_Struct(self, rtree_t, &type, rtree);
319
334
  return INT2NUM(f(rtree->state));
320
335
  }
321
336
 
@@ -352,10 +367,32 @@ static VALUE lrt_branching_factor(VALUE self)
352
367
  static VALUE lrt_unit_sphere_volume(VALUE self)
353
368
  {
354
369
  rtree_t *rtree;
355
- Data_Get_Struct(self, rtree_t, rtree);
370
+ TypedData_Get_Struct(self, rtree_t, &type, rtree);
356
371
  return DBL2NUM(state_unit_sphere_volume(rtree->state));
357
372
  }
358
373
 
374
+ static VALUE lrt_size(VALUE self)
375
+ {
376
+ rtree_t *rtree;
377
+ TypedData_Get_Struct(self, rtree_t, &type, rtree);
378
+ return INT2NUM(rtree_bytes(rtree));
379
+ }
380
+
381
+ static VALUE lrt_version(VALUE self)
382
+ {
383
+ return rb_str_new_cstr(rtree_package_version);
384
+ }
385
+
386
+ static VALUE lrt_bugreport(VALUE self)
387
+ {
388
+ return rb_str_new_cstr(rtree_package_bugreport);
389
+ }
390
+
391
+ static VALUE lrt_url(VALUE self)
392
+ {
393
+ return rb_str_new_cstr(rtree_package_url);
394
+ }
395
+
359
396
  void Init_rtree(void)
360
397
  {
361
398
  VALUE cls = rb_const_get(rb_cObject, rb_intern("RTreeC"));
@@ -372,12 +409,16 @@ void Init_rtree(void)
372
409
  rb_define_method(cls, "bsrt_write", lrt_bsrt_write, 1);
373
410
  rb_define_method(cls, "eq?", lrt_identical, 1);
374
411
  rb_define_method(cls, "dim", lrt_dim, 0);
412
+ rb_define_method(cls, "size", lrt_size, 0);
375
413
  rb_define_method(cls, "page_size", lrt_page_size, 0);
376
414
  rb_define_method(cls, "node_size", lrt_node_size, 0);
377
415
  rb_define_method(cls, "rect_size", lrt_rect_size, 0);
378
416
  rb_define_method(cls, "branch_size", lrt_branch_size, 0);
379
417
  rb_define_method(cls, "branching_factor", lrt_branching_factor, 0);
380
418
  rb_define_method(cls, "unit_sphere_volume", lrt_unit_sphere_volume, 0);
419
+ rb_define_singleton_method(cls, "version", lrt_version, 0);
420
+ rb_define_singleton_method(cls, "bugreport", lrt_bugreport, 0);
421
+ rb_define_singleton_method(cls, "url", lrt_url, 0);
381
422
  rb_define_singleton_method(cls, "json_read", lrt_json_read, 1);
382
423
  rb_define_singleton_method(cls, "bsrt_read", lrt_bsrt_read, 1);
383
424
  rb_define_singleton_method(cls, "csv_read", lrt_csv_read, 3);
data/lib/rtree.rb CHANGED
@@ -120,6 +120,21 @@ class RTree < RTreeC
120
120
  end
121
121
  end
122
122
 
123
+ # @return [Array<Integer>] version of librtree
124
+ def version
125
+ @version ||= super.split('.').map(&:to_i)
126
+ end
127
+
128
+ # @return [String] email address for librtree bug reports
129
+ def bugreport
130
+ super
131
+ end
132
+
133
+ # @return [String] librtree homepage
134
+ def url
135
+ super
136
+ end
137
+
123
138
  # @!visibility private
124
139
  def split_flag(split)
125
140
  case split
@@ -307,6 +322,16 @@ class RTree < RTreeC
307
322
  super
308
323
  end
309
324
 
325
+ # @return [Integer] the total bytes allocated for the instance
326
+ # @note This method traverses the entire tree summing the
327
+ # contributions for each node (rather than maintaining a
328
+ # running count). Performance-minded users may wish to
329
+ # cache this value (invalidating the cache when calling
330
+ # {#add_rect} of course).
331
+ def size
332
+ super
333
+ end
334
+
310
335
  # @return [Integer] the bytes in a page of memory
311
336
  def page_size
312
337
  super
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.8.3
4
+ version: 0.8.4
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: 2021-05-23 00:00:00.000000000 Z
11
+ date: 2021-05-24 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -126,7 +126,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
126
126
  - !ruby/object:Gem::Version
127
127
  version: '0'
128
128
  requirements:
129
- - The librtree library (1.0.2 or later)
129
+ - The librtree library (1.0.3 or later)
130
130
  rubygems_version: 3.1.2
131
131
  signing_key:
132
132
  specification_version: 4