use std::marker::PhantomData;
#[macro_use]
extern crate derivative;
#[derive(Derivative)]
#[derivative(Debug(bound="T: std::fmt::Debug"), PartialEq(bound="T: PartialEq"), Eq(bound="T: Eq"), Hash(bound="T: std::hash::Hash"), PartialOrd(bound="T: PartialOrd"), Ord(bound="T: Ord"))]
pub struct Named<T, Name> {
inner: T,
_phantom: PhantomData<Name>,
}
pub unsafe fn name<Name, T>(val: T) -> Named<T, Name> {
Named {
inner: val,
_phantom: PhantomData,
}
}
impl<T, Name> Named<T, Name> {
pub fn unname(self) -> T {
self.inner
}
pub fn unname_ref(&self) -> &T {
&self.inner
}
pub unsafe fn unname_ref_mut(&mut self) -> &mut T {
&mut self.inner
}
}
#[macro_export]
macro_rules! name {
($val:expr) => {{
struct UniqueName {};
unsafe {
name::<UniqueName, _>($val)
}
}}
}