11use rstar:: { ParentNode , RTreeNode , RTreeObject , AABB } ;
2+ use interval_tree:: IntervalTreeNode ;
23
34use crate :: error:: RTreeError ;
45use crate :: rtree:: { Object2D , Object3D , RTreeDim , RTreeH } ;
56
67enum 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`.
10897fn 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) ,
0 commit comments