use crate::inner_prelude::*;
fn into_secs(elapsed: std::time::Duration) -> f64 {
(elapsed.as_secs() as f64) + (f64::from(elapsed.subsec_nanos()) / 1_000_000_000.0)
}
#[derive(Default)]
pub struct LevelTimer {
levels: Vec<f64>,
time: Option<Instant>,
}
impl LevelTimer {
#[inline]
pub fn new() -> LevelTimer {
LevelTimer {
levels: Vec::new(),
time: None,
}
}
#[inline]
pub fn with_height(height: usize) -> LevelTimer {
LevelTimer {
levels: Vec::with_capacity(height),
time: None,
}
}
#[inline]
pub fn into_inner(self) -> Vec<f64> {
self.levels
}
#[inline]
fn node_end_common(&mut self) {
let time = self.time.unwrap();
let elapsed = time.elapsed();
self.levels.push(into_secs(elapsed));
self.time = None;
}
}
impl Splitter for LevelTimer {
#[inline]
fn div(&mut self) -> Self {
self.node_end_common();
let length = self.levels.len();
LevelTimer {
levels: std::iter::repeat(0.0).take(length).collect(),
time: None,
}
}
#[inline]
fn add(&mut self, a: Self) {
let len = self.levels.len();
for (a, b) in self.levels.iter_mut().zip(a.levels.iter()) {
*a += *b;
}
if len < a.levels.len() {
self.levels.extend_from_slice(&a.levels[len..]);
}
}
#[inline]
fn node_start(&mut self) {
assert!(self.time.is_none());
self.time = Some(Instant::now());
}
#[inline]
fn node_end(&mut self) {
self.node_end_common();
}
}
pub use crate::tree::compute_default_level_switch_sequential;
pub use crate::tree::compute_tree_height_heuristic;
pub use crate::tree::compute_tree_height_heuristic_debug;
pub trait Splitter: Sized {
fn div(&mut self) -> Self;
fn add(&mut self, b: Self);
fn node_start(&mut self);
fn node_end(&mut self);
}
pub struct SplitterEmpty;
impl Splitter for SplitterEmpty {
fn div(&mut self) -> Self {
SplitterEmpty
}
fn add(&mut self, _: Self) {}
fn node_start(&mut self) {}
fn node_end(&mut self) {}
}
pub use crate::oned::sweeper_update;
pub use crate::tree::default_level_switch_sequential;
pub use crate::tree::BinStrat;