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
use crate::{
impls::leak_uninit_ptr, MaybeUninhabited, Mutability, TypeGraph, TypeLayout, TypeLayoutGraph,
TypeLayoutInfo, TypeStructure,
};
unsafe impl<'a, T: ~const TypeLayout + 'a> const TypeLayout for &'a T {
const TYPE_LAYOUT: TypeLayoutInfo<'static> = TypeLayoutInfo {
name: ::core::any::type_name::<Self>(),
size: ::core::mem::size_of::<Self>(),
alignment: ::core::mem::align_of::<Self>(),
structure: TypeStructure::Reference {
inner: ::core::any::type_name::<T>(),
mutability: Mutability::Immutable,
},
};
unsafe fn uninit() -> MaybeUninhabited<core::mem::MaybeUninit<Self>> {
if let MaybeUninhabited::Uninhabited = <T as TypeLayout>::uninit() {
return MaybeUninhabited::Uninhabited;
}
MaybeUninhabited::Inhabited(core::mem::MaybeUninit::new(&*leak_uninit_ptr()))
}
}
unsafe impl<'a, T: ~const TypeGraph + 'a> const TypeGraph for &'a T {
fn populate_graph(graph: &mut TypeLayoutGraph<'static>) {
if graph.insert(&Self::TYPE_LAYOUT) {
<T as TypeGraph>::populate_graph(graph);
}
}
}
unsafe impl<'a, T: ~const TypeLayout + 'a> const TypeLayout for &'a mut T {
const TYPE_LAYOUT: TypeLayoutInfo<'static> = TypeLayoutInfo {
name: ::core::any::type_name::<Self>(),
size: ::core::mem::size_of::<Self>(),
alignment: ::core::mem::align_of::<Self>(),
structure: TypeStructure::Reference {
inner: ::core::any::type_name::<T>(),
mutability: Mutability::Mutable,
},
};
unsafe fn uninit() -> MaybeUninhabited<core::mem::MaybeUninit<Self>> {
if let MaybeUninhabited::Uninhabited = <T as TypeLayout>::uninit() {
return MaybeUninhabited::Uninhabited;
}
MaybeUninhabited::Inhabited(core::mem::MaybeUninit::new(&mut *leak_uninit_ptr()))
}
}
unsafe impl<'a, T: ~const TypeGraph + 'a> const TypeGraph for &'a mut T {
fn populate_graph(graph: &mut TypeLayoutGraph<'static>) {
if graph.insert(&Self::TYPE_LAYOUT) {
<T as TypeGraph>::populate_graph(graph);
}
}
}