use crate::implied::TaggedPtr;
use core::marker::PhantomData;
macro_rules! impl_implied_tagged_ref_common {
($name:ident $(,)?) => {
impl<T> $name<'_, T> {
pub const BITS: u32 = TaggedPtr::<T>::BITS;
pub const MAX_TAG: usize = TaggedPtr::<T>::MAX_TAG;
}
};
}
#[repr(transparent)]
pub struct TaggedRef<'a, T>(TaggedPtr<T>, PhantomData<&'a T>);
impl<'a, T> TaggedRef<'a, T> {
pub fn new(reference: &'a T, tag: usize) -> Self {
Self::new_impl(reference, tag)
}
}
impl_implied_tagged_ref_common!(TaggedRef);
impl_tagged_ref_common!([T], [T], "# use tagged_pointer::implied::TaggedRef;");
#[repr(transparent)]
pub struct TaggedMutRef<'a, T>(TaggedPtr<T>, PhantomData<&'a mut T>);
impl<'a, T> TaggedMutRef<'a, T> {
pub fn new(reference: &'a mut T, tag: usize) -> Self {
Self::new_impl(reference, tag)
}
}
impl_implied_tagged_ref_common!(TaggedMutRef);
impl_tagged_mut_ref_common!(
[T],
[T],
"# use tagged_pointer::implied::TaggedMutRef;",
);