#![allow(dead_code)]
use std::collections::HashMap;
#[derive(Debug, Clone, Default)]
pub struct HnswMappings {
id_to_idx: HashMap<u64, usize>,
idx_to_id: HashMap<usize, u64>,
next_idx: usize,
}
impl HnswMappings {
#[must_use]
pub fn new() -> Self {
Self::default()
}
#[must_use]
pub fn from_parts(
id_to_idx: HashMap<u64, usize>,
idx_to_id: HashMap<usize, u64>,
next_idx: usize,
) -> Self {
Self {
id_to_idx,
idx_to_id,
next_idx,
}
}
pub fn register(&mut self, id: u64) -> Option<usize> {
if self.id_to_idx.contains_key(&id) {
return None;
}
let idx = self.next_idx;
self.next_idx += 1;
self.id_to_idx.insert(id, idx);
self.idx_to_id.insert(idx, id);
Some(idx)
}
pub fn remove(&mut self, id: u64) -> Option<usize> {
if let Some(idx) = self.id_to_idx.remove(&id) {
self.idx_to_id.remove(&idx);
Some(idx)
} else {
None
}
}
#[must_use]
pub fn get_idx(&self, id: u64) -> Option<usize> {
self.id_to_idx.get(&id).copied()
}
#[must_use]
pub fn get_id(&self, idx: usize) -> Option<u64> {
self.idx_to_id.get(&idx).copied()
}
#[must_use]
pub fn len(&self) -> usize {
self.id_to_idx.len()
}
#[must_use]
#[allow(dead_code)]
pub fn is_empty(&self) -> bool {
self.id_to_idx.is_empty()
}
#[must_use]
pub fn as_parts(&self) -> (&HashMap<u64, usize>, &HashMap<usize, u64>, usize) {
(&self.id_to_idx, &self.idx_to_id, self.next_idx)
}
}