use std::cell::Cell;
#[derive(Clone, Copy)]
pub struct DiscoveryHooks {
pub on_slot_discovery: fn(slot_idx: usize, hash: u32),
pub on_bucket_mark: fn(hash: u32),
pub on_bucket_split: fn(label: &str, slot_idx: usize),
}
fn noop_slot(_: usize, _: u32) {}
fn noop_mark(_: u32) {}
fn noop_split(_: &str, _: usize) {}
impl DiscoveryHooks {
pub const NOOP: Self = Self {
on_slot_discovery: noop_slot,
on_bucket_mark: noop_mark,
on_bucket_split: noop_split,
};
}
impl Default for DiscoveryHooks {
fn default() -> Self {
Self::NOOP
}
}
thread_local! {
static HOOKS: Cell<DiscoveryHooks> = const { Cell::new(DiscoveryHooks::NOOP) };
}
pub fn set_discovery_hooks(hooks: DiscoveryHooks) {
HOOKS.with(|h| h.set(hooks));
}
pub fn clear_discovery_hooks() {
HOOKS.with(|h| h.set(DiscoveryHooks::NOOP));
}
pub(crate) fn on_slot_discovery(slot_idx: usize, hash: u32) {
HOOKS.with(|h| (h.get().on_slot_discovery)(slot_idx, hash));
}
pub(crate) fn on_bucket_mark(hash: u32) {
HOOKS.with(|h| (h.get().on_bucket_mark)(hash));
}
pub(crate) fn on_bucket_split(label: &str, slot_idx: usize) {
HOOKS.with(|h| (h.get().on_bucket_split)(label, slot_idx));
}