1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
//! Wrapper types that impl [`TypeNameable`] when their generic type is `'static`.

use super::*;

/// Impl of [`TypeNameable`] for `'static` types that are owned (`T`).
#[repr(transparent)]
pub struct OwnedStatic<T: ?Sized>(pub T);

nameable! {
    pub struct Name['a, 'lt, T];
    impl [T] for OwnedStatic<T> where { T: ?Sized + 'static }
}

/// Impl of [`TypeNameable`] for `'static` types that are borrowed (`&'lt T`).
#[repr(transparent)]
pub struct BorrowedStatic<'lt, T: ?Sized>(pub &'lt T);

nameable! {
    pub struct Name['a, 'lt, T];
    impl [T] for BorrowedStatic<'lt, T> where { T: ?Sized + 'static }
}

/// Impl of [`TypeNameable`] for `'static` types that are temporarily borrowed (`&'a T`).
#[repr(transparent)]
pub struct TempBorrowedStatic<'a, T: ?Sized>(pub &'a T);

nameable! {
    pub struct Name['a, 'lt, T];
    impl [T] for TempBorrowedStatic<'a, T> where { T: ?Sized + 'static }
}

/// Impl of [`TypeNameable`] for `'static` types that are borrowed mutably (`&'lt mut T`).
#[repr(transparent)]
pub struct BorrowedMutStatic<'lt, T: ?Sized>(pub &'lt mut T);

nameable! {
    pub struct Name['a, 'lt, T];
    impl [T] for BorrowedMutStatic<'lt, T> where { T: ?Sized + 'static }
}

/// Impl of [`TypeNameable`] for `'static` types that are temporarily borrowed mutably (`&'a mut T`).
#[repr(transparent)]
pub struct TempBorrowedMutStatic<'a, T: ?Sized>(pub &'a mut T);

nameable! {
    pub struct Name['a, 'lt, T];
    impl [T] for TempBorrowedMutStatic<'a, T> where { T: ?Sized + 'static }
}

/// Impl of [`TypeNameable`] for `'static` types that are in a [`Box`] (`Box<T>`).
#[cfg(feature = "alloc")]
pub struct BoxedStatic<T: ?Sized>(pub Box<T>);

#[cfg(feature = "alloc")]
nameable! {
    pub struct Name['a, 'lt, T];
    impl [T] for BoxedStatic<T> where { T: ?Sized + 'static }
}

#[derive(Debug)]
pub enum BorrowedStaticValue<'ctx, T: ?Sized + 'static> {
    Ctx(&'ctx T),
    Static(&'static T),
}

#[derive(Debug)]
pub enum BorrowedMutStaticValue<'ctx, T: ?Sized + 'static> {
    Ctx(&'ctx mut T),
    Static(&'static mut T),
}