use std::marker::PhantomData;
const INDEX_BITS: u32 = 32;
const INDEX_MASK: u64 = u32::MAX as u64;
#[derive(Debug, PartialEq, Eq, Hash)]
pub struct ParkedEffectId<T = ()> {
pub(crate) raw: u64,
pub(crate) phantom: PhantomData<fn(T) -> T>,
}
impl<T> Clone for ParkedEffectId<T> {
fn clone(&self) -> Self {
*self
}
}
impl<T> Copy for ParkedEffectId<T> {}
impl<T> ParkedEffectId<T> {
#[must_use]
pub const fn from_raw(raw: u64) -> Self {
Self {
raw,
phantom: PhantomData,
}
}
#[must_use]
pub const fn into_raw(self) -> u64 {
self.raw
}
pub(crate) fn new(index: usize, generation: u32) -> Self {
let index = u32::try_from(index).expect("ParkedEffectId index overflow");
Self::from_raw((u64::from(generation) << INDEX_BITS) | u64::from(index))
}
pub(crate) const fn index(self) -> usize {
(self.raw & INDEX_MASK) as usize
}
pub(crate) const fn generation(self) -> u32 {
(self.raw >> INDEX_BITS) as u32
}
}