spatial/tree/mbr/
query.rs1use crate::geometry::Rect;
9use std::fmt::Debug;
10use crate::tree::mbr::{MbrLeaf, MbrLeafGeometry, MbrNode};
11use crate::FP;
12
13pub trait MbrQuery<P: FP, const DIM: usize, LG, T, NODE> {
15 fn accept_leaf(&self, leaf: &MbrLeaf<P, DIM, LG, T>) -> bool;
17 fn accept_level(&self, level: &NODE) -> bool;
19}
20
21#[derive(Debug, Clone)]
23pub enum MbrRectQuery<P: FP, const DIM: usize> {
24 ContainedBy(Rect<P, DIM>),
26 Overlaps(Rect<P, DIM>),
28}
29
30impl<P: FP, const DIM: usize, LG, T, NODE> MbrQuery<P, DIM, LG, T, NODE> for MbrRectQuery<P, DIM>
31where
32 LG: MbrLeafGeometry<P, DIM>,
33 NODE: MbrNode<P, DIM>,
34{
35 fn accept_leaf(&self, leaf: &MbrLeaf<P, DIM, LG, T>) -> bool {
37 match *self {
38 MbrRectQuery::ContainedBy(ref query) => leaf.geometry.contained_by_mbr(query),
39 MbrRectQuery::Overlaps(ref query) => leaf.geometry.overlapped_by_mbr(query),
40 }
41 }
42
43 fn accept_level(&self, level: &NODE) -> bool {
45 match *self {
46 MbrRectQuery::ContainedBy(ref query) => level.overlapped_by_mbr(query),
47 MbrRectQuery::Overlaps(ref query) => level.overlapped_by_mbr(query),
48 }
49 }
50}