Skip to content

Commit 9c50605

Browse files
committed
Merge branch 'leo/rstar-capi'
2 parents cf411ef + 624dbad commit 9c50605

7 files changed

Lines changed: 234 additions & 118 deletions

File tree

rstar-capi/Cargo.lock

Lines changed: 5 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

rstar-capi/Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ edition = "2021"
55

66
[dependencies]
77
rstar = "0.12.2"
8-
8+
interval-tree = { path = "../interval-tree" }
99

1010
[build-dependencies]
1111
cbindgen = "0.29"

rstar-capi/include/rstar-capi.h

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,6 @@ enum RTreeError {
99
Success = 0,
1010
NullPointer = 1,
1111
InvalidDimension = 2,
12-
NodeNotLeaf = 3,
1312
};
1413
typedef uint16_t RTreeError;
1514

@@ -47,6 +46,4 @@ RTreeError rtree_node_envelope(const struct RTreeNodeH *node, double *min_out, d
4746

4847
RTreeError rtree_node_free(struct RTreeNodeH *node);
4948

50-
RTreeError rtree_node_id(const struct RTreeNodeH *node, size_t *id);
51-
5249
RTreeError rtree_root_node(const struct RTreeH *tree, struct RTreeNodeH **node);

rstar-capi/src/error.rs

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,5 +3,4 @@ pub enum RTreeError {
33
Success = 0,
44
NullPointer = 1,
55
InvalidDimension = 2,
6-
NodeNotLeaf = 3,
76
}

rstar-capi/src/node.rs

Lines changed: 23 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,11 @@
11
use rstar::{ParentNode, RTreeNode, RTreeObject, AABB};
2+
use interval_tree::IntervalTreeNode;
23

34
use crate::error::RTreeError;
45
use crate::rtree::{Object2D, Object3D, RTreeDim, RTreeH};
56

67
enum NodeRef {
8+
ITreeNode(*const IntervalTreeNode),
79
Parent2D(*const ParentNode<Object2D>),
810
Parent3D(*const ParentNode<Object3D>),
911
Node2D(*const RTreeNode<Object2D>),
@@ -19,6 +21,7 @@ pub extern "C" fn rtree_root_node(tree: *const RTreeH, node: *mut *mut RTreeNode
1921
}
2022
let rtree = unsafe { &*(tree as *const RTreeDim) };
2123
let node_ref = match rtree {
24+
RTreeDim::D1(tree) => NodeRef::ITreeNode(tree.root().unwrap()),
2225
RTreeDim::D2(tree) => NodeRef::Parent2D(tree.root() as *const _),
2326
RTreeDim::D3(tree) => NodeRef::Parent3D(tree.root() as *const _),
2427
};
@@ -38,6 +41,17 @@ pub extern "C" fn rtree_node_children(
3841
let node_ref = unsafe { &*(node as *const NodeRef) };
3942

4043
let child_node_refs: Vec<NodeRef> = match node_ref {
44+
NodeRef::ITreeNode(ptr) => {
45+
let node = unsafe { &**ptr };
46+
let mut children = Vec::new();
47+
if let Some(left) = &node.left {
48+
children.push(NodeRef::ITreeNode(left.as_ref() as *const _));
49+
}
50+
if let Some(right) = &node.right {
51+
children.push(NodeRef::ITreeNode(right.as_ref() as *const _));
52+
}
53+
children
54+
}
4155
NodeRef::Parent2D(ptr) => unsafe { &**ptr }
4256
.children()
4357
.iter()
@@ -79,31 +93,6 @@ pub extern "C" fn rtree_node_children(
7993
RTreeError::Success
8094
}
8195

82-
#[no_mangle]
83-
pub extern "C" fn rtree_node_id(node: *const RTreeNodeH, id: *mut usize) -> RTreeError {
84-
if node.is_null() || id.is_null() {
85-
return RTreeError::NullPointer;
86-
}
87-
let node_ref = unsafe { &*(node as *const NodeRef) };
88-
89-
let node_id = match node_ref {
90-
NodeRef::Parent2D(_) | NodeRef::Parent3D(_) => {
91-
return RTreeError::NodeNotLeaf
92-
}
93-
NodeRef::Node2D(ptr) => match unsafe { &**ptr } {
94-
RTreeNode::Leaf(leaf) => leaf.data,
95-
RTreeNode::Parent(_) => return RTreeError::NodeNotLeaf,
96-
},
97-
NodeRef::Node3D(ptr) => match unsafe { &**ptr } {
98-
RTreeNode::Leaf(leaf) => leaf.data,
99-
RTreeNode::Parent(_) => return RTreeError::NodeNotLeaf,
100-
},
101-
};
102-
103-
unsafe { *id = node_id };
104-
RTreeError::Success
105-
}
106-
10796
/// Writes the lower and upper corners of the AABB into `min_out` and `max_out`.
10897
fn write_aabb<const DIM: usize>(aabb: AABB<[f64; DIM]>, min_out: *mut f64, max_out: *mut f64) {
10998
let lower = aabb.lower();
@@ -126,6 +115,15 @@ pub extern "C" fn rtree_node_envelope(
126115
let node_ref = unsafe { &*(node as *const NodeRef) };
127116

128117
match node_ref {
118+
NodeRef::ITreeNode(ptr) => {
119+
let node = unsafe { &**ptr };
120+
let min = node.min;
121+
let max = node.max;
122+
unsafe {
123+
*min_out = min;
124+
*max_out = max;
125+
}
126+
},
129127
NodeRef::Parent2D(ptr) => write_aabb(unsafe { &**ptr }.envelope(), min_out, max_out),
130128
NodeRef::Parent3D(ptr) => write_aabb(unsafe { &**ptr }.envelope(), min_out, max_out),
131129
NodeRef::Node2D(ptr) => write_aabb(unsafe { &**ptr }.envelope(), min_out, max_out),

rstar-capi/src/rtree.rs

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,14 @@
11
use rstar::primitives::{GeomWithData, Rectangle};
22
use rstar::RTree;
3+
use interval_tree::IntervalTree;
34

45
use crate::error::RTreeError;
56

67
pub type Object2D = GeomWithData<Rectangle<[f64; 2]>, usize>;
78
pub type Object3D = GeomWithData<Rectangle<[f64; 3]>, usize>;
89

910
pub enum RTreeDim {
11+
D1(IntervalTree),
1012
D2(RTree<Object2D>),
1113
D3(RTree<Object3D>),
1214
}
@@ -20,6 +22,7 @@ pub extern "C" fn rtree_create(tree: *mut *mut RTreeH, dim: u32) -> RTreeError {
2022
return RTreeError::NullPointer;
2123
}
2224
let rtree = match dim {
25+
1 => RTreeDim::D1(IntervalTree::bulk_load(&[], &[], &[])),
2326
2 => RTreeDim::D2(RTree::new()),
2427
3 => RTreeDim::D3(RTree::new()),
2528
_ => return RTreeError::InvalidDimension,
@@ -39,6 +42,7 @@ pub extern "C" fn rtree_free(tree: *mut RTreeH) -> RTreeError {
3942

4043
fn _rtree_get_dimension(tree: &RTreeDim) -> u32 {
4144
match tree {
45+
RTreeDim::D1(_) => 1,
4246
RTreeDim::D2(_) => 2,
4347
RTreeDim::D3(_) => 3,
4448
}
@@ -75,6 +79,19 @@ fn _rtree_bulk_load<const DIM: usize>(
7579
RTree::bulk_load(objects)
7680
}
7781

82+
fn _interval_tree_bulk_load(
83+
mins: *const f64,
84+
maxs: *const f64,
85+
data: *const usize,
86+
n: usize,
87+
) -> IntervalTree {
88+
let mins = unsafe { std::slice::from_raw_parts(mins, n) };
89+
let maxs = unsafe { std::slice::from_raw_parts(maxs, n) };
90+
let data = unsafe { std::slice::from_raw_parts(data, n) };
91+
92+
IntervalTree::bulk_load(mins, maxs, data)
93+
}
94+
7895
#[no_mangle]
7996
pub extern "C" fn rtree_bulk_load(
8097
tree: *mut *mut RTreeH,
@@ -89,6 +106,7 @@ pub extern "C" fn rtree_bulk_load(
89106
}
90107

91108
let rtree = match dim {
109+
1 => RTreeDim::D1(_interval_tree_bulk_load(mins, maxs, ids, n)),
92110
2 => RTreeDim::D2(_rtree_bulk_load::<2>(mins, maxs, ids, n)),
93111
3 => RTreeDim::D3(_rtree_bulk_load::<3>(mins, maxs, ids, n)),
94112
_ => return RTreeError::InvalidDimension,
@@ -110,6 +128,10 @@ pub extern "C" fn rtree_locate_all_at_point(
110128
}
111129
let rtree = unsafe { &*(tree as *const RTreeDim) };
112130
let mut ids: Vec<usize> = match rtree {
131+
RTreeDim::D1(tree) => {
132+
let p: f64 = unsafe { *(point as *const f64) };
133+
tree.locate_all_at_point(p)
134+
}
113135
RTreeDim::D2(tree) => {
114136
let p: [f64; 2] = unsafe { *(point as *const [f64; 2]) };
115137
tree.locate_all_at_point(&p).map(|obj| obj.data).collect()

0 commit comments

Comments
 (0)