kiddo 6.0.0-alpha.4

A high-performance, flexible, ergonomic k-d tree library. Ideal for geo- and astro- nearest-neighbour and k-nearest-neighbor queries
Documentation
use std::cell::Cell;

#[derive(Clone, Copy, Debug, Default)]
pub struct ExactQueryStats {
    pub leaf_visits: u64,
    pub scalar_stack_pops: u64,
    pub simd_single_pops: u64,
    pub simd_stack_max_len: u64,
    pub block3_pending_pops: u64,
    pub block3_pending_mask_bits: u64,
    pub block3_candidate_mask_bits: u64,
    pub block3_candidate_mask_nonzero: u64,
    pub block3_step_entries: u64,
    pub block3_full_steps: u64,
    pub block3_scalar_fallback_steps: u64,
}

thread_local! {
    static STATS: Cell<ExactQueryStats> = Cell::new(ExactQueryStats::default());
}

#[inline]
pub fn reset() {
    STATS.with(|stats| stats.set(ExactQueryStats::default()));
}

#[inline]
pub fn snapshot() -> ExactQueryStats {
    STATS.with(Cell::get)
}

#[inline]
pub fn record_leaf_visit() {
    STATS.with(|stats| {
        let mut value = stats.get();
        value.leaf_visits += 1;
        stats.set(value);
    });
}

#[inline]
pub fn record_scalar_stack_pop() {
    STATS.with(|stats| {
        let mut value = stats.get();
        value.scalar_stack_pops += 1;
        stats.set(value);
    });
}

#[inline]
pub fn record_simd_single_pop() {
    STATS.with(|stats| {
        let mut value = stats.get();
        value.simd_single_pops += 1;
        stats.set(value);
    });
}

#[inline]
pub fn record_simd_stack_len(len: usize) {
    STATS.with(|stats| {
        let mut value = stats.get();
        value.simd_stack_max_len = value.simd_stack_max_len.max(len as u64);
        stats.set(value);
    });
}

#[inline]
pub fn record_block3_pending_pop(mask: u8) {
    STATS.with(|stats| {
        let mut value = stats.get();
        value.block3_pending_pops += 1;
        value.block3_pending_mask_bits += mask.count_ones() as u64;
        stats.set(value);
    });
}

#[inline]
pub fn record_block3_candidate_mask(mask: u8) {
    STATS.with(|stats| {
        let mut value = stats.get();
        value.block3_candidate_mask_bits += mask.count_ones() as u64;
        if mask != 0 {
            value.block3_candidate_mask_nonzero += 1;
        }
        stats.set(value);
    });
}

#[inline]
pub fn record_block3_full_step() {
    STATS.with(|stats| {
        let mut value = stats.get();
        value.block3_full_steps += 1;
        stats.set(value);
    });
}

#[inline]
pub fn record_block3_scalar_fallback_step() {
    STATS.with(|stats| {
        let mut value = stats.get();
        value.block3_scalar_fallback_steps += 1;
        stats.set(value);
    });
}

#[inline]
pub fn record_block3_step_entry() {
    STATS.with(|stats| {
        let mut value = stats.get();
        value.block3_step_entries += 1;
        stats.set(value);
    });
}