librtree 1.0.5 → 1.0.6

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: b945bd1abd981557382119ef56ebde1c6bd1f3e75dfa0ca4656b43a59c99d833
4
- data.tar.gz: 9af9d2d1317582970d0b27fd43c2947472d66be2383f29bdb7f3d8d19743a897
3
+ metadata.gz: 1d23f82b41d0757dbca1d30fc447bd2573db6d1584727c3244c84bbae0bc6b83
4
+ data.tar.gz: 36b7cda50a05140949537890a4ab99ebc555f08d7f7789cd7d4d0bd14c7b4c27
5
5
  SHA512:
6
- metadata.gz: 752765087a236c6ae456475af539ffafb72f02ba13521ff75c094e997c367b717f6d3166e97146a9bc45f2b58581ec6b292aea1faaababf18e6f57d2b8cbc705
7
- data.tar.gz: 6aa633e4d38ca15f6a4dc6392870cb0ec8d3713bb15b53a9142b06a00a8e7d295eb5a5f57494eb72cdfdf2b9f8098b86e4703f310a9b3382b39d47df971f29d0
6
+ metadata.gz: 5ad5636536266f5ac027bd9f7ee59b359f4a3b00c07107057c7b83d378122be21343ebb54db36fe0e7683c926e674a7c8e4f3a6013b4a38c3019078851995c38
7
+ data.tar.gz: 22292e552cd05823802107094df3ff12c0a0a04129e26dd0fe8a9dd1c1b966f47b1b1cf4a1ac046f0965710965235c5e3a195c4de87b5612aa968e042a3c38fb
data/CHANGELOG.md CHANGED
@@ -1,6 +1,11 @@
1
1
  Changelog
2
2
  ---------
3
3
 
4
+ ### 1.0.6, 07-04-2024
5
+
6
+ - Update to librtree 1.3.0
7
+ - Adds `#envelope` `#csv_write`, `#to_csv`
8
+
4
9
  ### 1.0.5, 16-01-2024
5
10
 
6
11
  - All methods which take a `File` object (i.e., a stream), now
data/ext/rtree/lib/csv.c CHANGED
@@ -81,3 +81,78 @@ rtree_t* csv_rtree_read(FILE *stream, size_t dims, state_flags_t flags)
81
81
 
82
82
  return NULL;
83
83
  }
84
+
85
+ static int write_node(const state_t*, const node_t*, FILE *);
86
+
87
+ static int write_internal_branch(const state_t *state,
88
+ const branch_t *branch,
89
+ void *arg)
90
+ {
91
+ return write_node(state, branch_get_child(branch), arg);
92
+ }
93
+
94
+ #if SIZEOF_RTREE_COORD_T == 4
95
+ #define PRECISION 6
96
+ #elif SIZEOF_RTREE_COORD_T == 8
97
+ #define PRECISION 14
98
+ #else
99
+ #error "strange size for rtree_coord_t"
100
+ #endif
101
+
102
+ static int write_leaf_branch(const state_t *state,
103
+ const branch_t *branch,
104
+ void *arg)
105
+ {
106
+ FILE *stream = arg;
107
+ rtree_id_t id = branch_get_id(branch);
108
+
109
+ fprintf(stream, "%li", (long int)id);
110
+
111
+ const rtree_coord_t *rect = branch_get_rect(branch);
112
+ size_t n = state_dims(state);
113
+
114
+ for (size_t i = 0 ; i < 2 * n ; i++)
115
+ fprintf(stream, ",%.*e", PRECISION, (double)rect[i]);
116
+
117
+ fprintf(stream, "\r\n");
118
+
119
+ return RTREE_OK;
120
+ }
121
+
122
+ #undef PRECISION
123
+
124
+ static int write_internal_node(const state_t *state,
125
+ const node_t *node,
126
+ FILE *stream)
127
+ {
128
+ return node_branch_each(state, node, write_internal_branch, stream);
129
+ }
130
+
131
+ static int write_leaf_node(const state_t *state,
132
+ const node_t *node,
133
+ FILE *stream)
134
+ {
135
+ return node_branch_each(state, node, write_leaf_branch, stream);
136
+ }
137
+
138
+ static int write_node(const state_t *state,
139
+ const node_t *node,
140
+ FILE *stream)
141
+ {
142
+ int err;
143
+
144
+ if (node_level(node) > 0)
145
+ err = write_internal_node(state, node, stream);
146
+ else
147
+ err = write_leaf_node(state, node, stream);
148
+
149
+ return err;
150
+ }
151
+
152
+ int csv_rtree_write(const rtree_t *rtree, FILE *stream)
153
+ {
154
+ if ((rtree == NULL) || (stream == NULL))
155
+ return RTREE_ERR_INVAL;
156
+
157
+ return write_node(rtree->state, rtree->root, stream);
158
+ }
@@ -11,6 +11,7 @@
11
11
 
12
12
  #include <stdio.h>
13
13
 
14
+ int csv_rtree_write(const rtree_t*, FILE*);
14
15
  rtree_t* csv_rtree_read(FILE*, size_t, state_flags_t);
15
16
 
16
17
  #endif
@@ -104,9 +104,9 @@ void rtree_destroy(rtree_t *rtree)
104
104
  free(rtree);
105
105
  }
106
106
 
107
- rtree_height_t rtree_height(const rtree_t *rtree)
107
+ int rtree_csv_write(const rtree_t *rtree, FILE *stream)
108
108
  {
109
- return node_height(rtree->state, rtree->root);
109
+ return csv_rtree_write(rtree, stream);
110
110
  }
111
111
 
112
112
  rtree_t* rtree_csv_read(FILE *stream, size_t dim, state_flags_t flags)
@@ -182,6 +182,11 @@ const char* rtree_strerror(int err)
182
182
  return strerror_rtree(err);
183
183
  }
184
184
 
185
+ rtree_height_t rtree_height(const rtree_t *rtree)
186
+ {
187
+ return node_height(rtree->state, rtree->root);
188
+ }
189
+
185
190
  size_t rtree_bytes(const rtree_t *rtree)
186
191
  {
187
192
  if (rtree == NULL)
@@ -255,3 +260,11 @@ bool rtree_empty(const rtree_t *rtree)
255
260
  (rtree == NULL) ||
256
261
  (! node_nonempty(rtree->state, rtree->root));
257
262
  }
263
+
264
+ int rtree_envelope(const rtree_t *rtree, rtree_coord_t *rect)
265
+ {
266
+ if (rtree_empty(rtree))
267
+ return 1;
268
+ else
269
+ return node_envelope(rtree->state, rtree->root, rect);
270
+ }
@@ -34,6 +34,7 @@ int rtree_search(const rtree_t*, const rtree_coord_t*, rtree_search_t*, void*);
34
34
  int rtree_add_rect(rtree_t*, rtree_id_t, rtree_coord_t*);
35
35
  int rtree_update(rtree_t*, rtree_update_t*, void*);
36
36
  bool rtree_identical(const rtree_t*, const rtree_t*);
37
+ int rtree_csv_write(const rtree_t*, FILE*);
37
38
  rtree_t* rtree_csv_read(FILE*, size_t, state_flags_t);
38
39
  int rtree_json_write(const rtree_t*, FILE*);
39
40
  rtree_t* rtree_json_read(FILE*);
@@ -50,6 +51,7 @@ size_t rtree_branch_size(const rtree_t*);
50
51
  size_t rtree_branching_factor(const rtree_t*);
51
52
  double rtree_unit_sphere_volume(const rtree_t*);
52
53
  bool rtree_empty(const rtree_t*);
54
+ int rtree_envelope(const rtree_t*, rtree_coord_t*);
53
55
 
54
56
  #ifdef __cplusplus
55
57
  }
data/ext/rtree/rtree.c CHANGED
@@ -281,14 +281,19 @@ static VALUE serialise(VALUE self, VALUE io_obj, serialise_t *f)
281
281
  return self;
282
282
  }
283
283
 
284
- static VALUE rt_json_write(VALUE self, VALUE io_obj)
284
+ static VALUE rt_bsrt_write(VALUE self, VALUE io_obj)
285
285
  {
286
- return serialise(self, io_obj, rtree_json_write);
286
+ return serialise(self, io_obj, rtree_bsrt_write);
287
287
  }
288
288
 
289
- static VALUE rt_bsrt_write(VALUE self, VALUE io_obj)
289
+ static VALUE rt_csv_write(VALUE self, VALUE io_obj)
290
290
  {
291
- return serialise(self, io_obj, rtree_bsrt_write);
291
+ return serialise(self, io_obj, rtree_csv_write);
292
+ }
293
+
294
+ static VALUE rt_json_write(VALUE self, VALUE io_obj)
295
+ {
296
+ return serialise(self, io_obj, rtree_json_write);
292
297
  }
293
298
 
294
299
  static VALUE rt_identical(VALUE self, VALUE other)
@@ -373,6 +378,28 @@ static VALUE rt_size(VALUE self)
373
378
  return INT2NUM(rtree_bytes(rtree));
374
379
  }
375
380
 
381
+ static VALUE rt_envelope(VALUE self)
382
+ {
383
+ rtree_t *rtree;
384
+ TypedData_Get_Struct(self, rtree_t, &rtree_type, rtree);
385
+
386
+ if (rtree_empty(rtree))
387
+ return Qnil;
388
+
389
+ size_t n = 2 * rtree_dims(rtree);
390
+ double u[n];
391
+
392
+ if (rtree_envelope(rtree, u) != 0)
393
+ rb_sys_fail(__func__);
394
+
395
+ VALUE v = rb_ary_new_capa(n);
396
+
397
+ for (size_t i = 0 ; i < n ; i++)
398
+ rb_ary_store(v, i, DBL2NUM(u[i]));
399
+
400
+ return v;
401
+ }
402
+
376
403
  static VALUE rt_version(VALUE self)
377
404
  {
378
405
  return rb_str_new_cstr(rtree_package_version);
@@ -518,11 +545,13 @@ void Init_rtree(void)
518
545
  rb_define_method(cRTreeBase, "height", rt_height, 0);
519
546
  rb_define_method(cRTreeBase, "add_rect", rt_add_rect, 2);
520
547
  rb_define_method(cRTreeBase, "search", rt_search, 1);
521
- rb_define_method(cRTreeBase, "json_write", rt_json_write, 1);
522
548
  rb_define_method(cRTreeBase, "bsrt_write", rt_bsrt_write, 1);
549
+ rb_define_method(cRTreeBase, "csv_write", rt_csv_write, 1);
550
+ rb_define_method(cRTreeBase, "json_write", rt_json_write, 1);
523
551
  rb_define_method(cRTreeBase, "eq?", rt_identical, 1);
524
552
  rb_define_method(cRTreeBase, "dim", rt_dim, 0);
525
553
  rb_define_method(cRTreeBase, "size", rt_size, 0);
554
+ rb_define_method(cRTreeBase, "envelope", rt_envelope, 0);
526
555
  rb_define_method(cRTreeBase, "page_size", rt_page_size, 0);
527
556
  rb_define_method(cRTreeBase, "node_size", rt_node_size, 0);
528
557
  rb_define_method(cRTreeBase, "rect_size", rt_rect_size, 0);
data/lib/rtree.rb CHANGED
@@ -386,36 +386,40 @@ class RTree < RTreeBase
386
386
  super
387
387
  end
388
388
 
389
- # Serialise to JSON
389
+ # Serialise to BSRT (binary serialised R-tree)
390
390
  # @param io_arg [String|IO] a path or writable stream
391
391
  # @return [self]
392
- # @see .json_read
392
+ # @see .bsrt_read
393
393
  # @example Write to file
394
- # rtree.json_write('rtree.json')
394
+ # rtree.bsrt_write('rtree.bsrt')
395
395
  #
396
- def json_write(io_arg)
397
- RTree::IOUtil.io_with_mode(io_arg, 'w') { |io| super(io) }
396
+ def bsrt_write(io_arg)
397
+ RTree::IOUtil.io_with_mode(io_arg, 'wb') { |io| super(io) }
398
398
  self
399
399
  end
400
400
 
401
- # Serialise to BSRT (binary serialised R-tree)
401
+ # Serialise to CSV
402
402
  # @param io_arg [String|IO] a path or writable stream
403
403
  # @return [self]
404
- # @see .bsrt_read
404
+ # @see .csv_read
405
405
  # @example Write to file
406
- # rtree.bsrt_write('rtree.bsrt')
406
+ # rtree.csv_write('rtree.csv')
407
407
  #
408
- def bsrt_write(io_arg)
408
+ def csv_write(io_arg)
409
409
  RTree::IOUtil.io_with_mode(io_arg, 'wb') { |io| super(io) }
410
410
  self
411
411
  end
412
412
 
413
- # Serialise to JSON string
414
- # @return [String] the UTF-8 encoded JSON
415
- # @see .from_json
413
+ # Serialise to JSON
414
+ # @param io_arg [String|IO] a path or writable stream
415
+ # @return [self]
416
+ # @see .json_read
417
+ # @example Write to file
418
+ # rtree.json_write('rtree.json')
416
419
  #
417
- def to_json
418
- serialise(Encoding::UTF_8) { |io| json_write(io) }
420
+ def json_write(io_arg)
421
+ RTree::IOUtil.io_with_mode(io_arg, 'w') { |io| super(io) }
422
+ self
419
423
  end
420
424
 
421
425
  # Serialise to BSRT string
@@ -426,6 +430,22 @@ class RTree < RTreeBase
426
430
  serialise(Encoding::BINARY) { |io| bsrt_write(io) }
427
431
  end
428
432
 
433
+ # Serialise to CSV string
434
+ # @return [String] the CSV
435
+ # @see .from_csv
436
+ #
437
+ def to_csv
438
+ serialise(Encoding::BINARY) { |io| csv_write(io) }
439
+ end
440
+
441
+ # Serialise to JSON string
442
+ # @return [String] the UTF-8 encoded JSON
443
+ # @see .from_json
444
+ #
445
+ def to_json
446
+ serialise(Encoding::UTF_8) { |io| json_write(io) }
447
+ end
448
+
429
449
  # The RTree structure in hash form
430
450
  # @return [Hash]
431
451
  #
@@ -462,6 +482,15 @@ class RTree < RTreeBase
462
482
  super
463
483
  end
464
484
 
485
+ # @return [Array[float]] the bounding rectangle
486
+ # @note Ruturns the bounding rectangle (in the same format
487
+ # as the rectangle input) for all rectangles in the tree.
488
+ # In the case that the input is empty, returns nil.
489
+ #
490
+ def envelope
491
+ super
492
+ end
493
+
465
494
  # @return [Integer] the bytes in a page of memory
466
495
  #
467
496
  def page_size
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.5
4
+ version: 1.0.6
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: 2024-01-16 00:00:00.000000000 Z
11
+ date: 2024-04-07 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler