use crate::algorithm::rstar::RStarInsertionStrategy;
use crate::{Envelope, Point, RTree, RTreeObject};
pub trait RTreeParams: Send + Sync {
const MIN_SIZE: usize;
const MAX_SIZE: usize;
const REINSERTION_COUNT: usize;
type DefaultInsertionStrategy: InsertionStrategy;
}
#[derive(Clone, Copy, PartialEq, Eq, Default)]
pub struct DefaultParams;
impl RTreeParams for DefaultParams {
const MIN_SIZE: usize = 3;
const MAX_SIZE: usize = 6;
const REINSERTION_COUNT: usize = 2;
type DefaultInsertionStrategy = RStarInsertionStrategy;
}
pub trait InsertionStrategy {
#[doc(hidden)]
fn insert<T, Params>(tree: &mut RTree<T, Params>, t: T)
where
Params: RTreeParams,
T: RTreeObject;
}
pub fn verify_parameters<T: RTreeObject, P: RTreeParams>() {
assert!(
P::MAX_SIZE >= 4,
"MAX_SIZE too small. Must be larger than 4."
);
assert!(P::MIN_SIZE > 0, "MIN_SIZE must be at least 1",);
let max_min_size = (P::MAX_SIZE + 1) / 2;
assert!(
P::MIN_SIZE <= max_min_size,
"MIN_SIZE too large. Must be less or equal to {:?}",
max_min_size
);
let max_reinsertion_count = P::MAX_SIZE - P::MIN_SIZE;
assert!(
P::REINSERTION_COUNT < max_reinsertion_count,
"REINSERTION_COUNT too large. Must be smaller than {:?}",
max_reinsertion_count
);
let dimension = <T::Envelope as Envelope>::Point::DIMENSIONS;
assert!(
dimension > 1,
"Point dimension too small - must be at least 2"
);
}