Skip to main content

std_traits/
reference.rs

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);