1use crate::primitive::Primitive;
2
3#[derive(Clone, Copy, PartialEq, Eq, PartialOrd, Ord)]
4pub enum Mutability {
5 Const,
6 Mut,
7}
8
9pub trait Reference<T: ?Sized>: Primitive + Sized {
10 fn ref_type() -> Mutability;
11
12 fn as_ref(&self) -> &Self;
13}
14
15macro_rules! impl_reference {
16 ($ref:tt, $ty:expr) => {
17 #[allow(unused_parens)]
18 impl<T: ?Sized> Primitive for $ref {}
19
20 #[allow(unused_parens)]
21 impl<T: ?Sized> Reference<T> for $ref {
22 fn ref_type() -> Mutability {
23 $ty
24 }
25
26 fn as_ref(&self) -> &Self {
27 self
28 }
29 }
30 };
31}
32
33impl_reference!((&T), Mutability::Const);
34impl_reference!((&mut T), Mutability::Mut);