pub trait Key<T> {
type Context: Default;
type VacantData: Default;
type OccupiedData: Default;
fn index(&self, cx: &Self::Context) -> usize;
fn verify(&self, cx: &Self::Context, data: &Self::OccupiedData) -> bool;
fn new_vacant(cx: &Self::Context, index: usize, data: Option<&Self::VacantData>) -> Self;
fn new_occupied(cx: &Self::Context, index: usize, data: &Self::OccupiedData) -> Self;
fn convert_into_vacant(cx: &Self::Context, data: Self::OccupiedData) -> Self::VacantData;
fn convert_into_occupied(cx: &Self::Context, data: Self::VacantData) -> Self::OccupiedData;
fn into_occupied_data(self) -> Self::OccupiedData;
}
#[derive(Default, Debug, Clone, Copy)]
pub struct NoData;
impl<T> Key<T> for usize {
type Context = NoData;
type VacantData = NoData;
type OccupiedData = NoData;
#[inline]
fn index(&self, cx: &Self::Context) -> usize {
let _cx = cx;
*self
}
#[inline]
fn verify(&self, cx: &Self::Context, data: &Self::OccupiedData) -> bool {
let _cx = cx;
let _data = data;
true
}
#[inline]
fn new_vacant(cx: &Self::Context, index: usize, data: Option<&Self::VacantData>) -> Self {
let _cx = cx;
let _data = data;
index
}
#[inline]
fn new_occupied(cx: &Self::Context, index: usize, data: &Self::OccupiedData) -> Self {
let _cx = cx;
let _data = data;
index
}
#[inline]
fn convert_into_vacant(cx: &Self::Context, data: Self::OccupiedData) -> Self::VacantData {
let _cx = cx;
data
}
#[inline]
fn convert_into_occupied(cx: &Self::Context, data: Self::VacantData) -> Self::OccupiedData {
let _cx = cx;
data
}
#[inline]
fn into_occupied_data(self) -> Self::OccupiedData {
NoData
}
}