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
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
//! Module for the traits [`MaybeDynSized`] and [`Tag`].
use crate::;
use slice;
use Pointee;
/// A trait to abstract sized and unsized structures (DSTs). It enables
/// casting a [`DynSizedStructure`] to sized or unsized structures using
/// [`DynSizedStructure::cast`].
///
/// Structs that are a DST must provide a **correct** [`MaybeDynSized::dst_len`]
/// implementation. The needed metadata type is either `()` for sized types or
/// `usize` for dynamically sized types. For sized types, there is a default
/// implementation. Only dynamically sized types need to implement
/// [`MaybeDynSized::dst_len`].
///
/// # Safety
///
/// Implementors must be `#[repr(C)]`, start with `Self::Header`, have an
/// alignment of at most [`ALIGNMENT`], and allow every bit pattern.
///
/// [`MaybeDynSized::BASE_SIZE`], [`MaybeDynSized::dst_len`], and
/// [`Header::total_size`] must correctly describe the initialized,
/// contiguous memory backing the value. Incorrect sizes or implicit padding
/// within the reported range can cause out-of-bounds references. Trailing
/// padding beyond that range is fine.
///
/// Note that for sized implementors, the requirements above imply that
/// `size_of::<Self>()` exceeds [`MaybeDynSized::BASE_SIZE`] at most by
/// trailing padding up to the type's alignment. Same-size casts rely on this
/// to keep the created reference within the source allocation.
///
/// [`ID`]: Tag::ID
/// [`ALIGNMENT`]: crate::ALIGNMENT
/// [`DynSizedStructure`]: crate::DynSizedStructure
pub unsafe
/// Extension of [`MaybeDynSized`] for Tags.
// This implementation is not needed for parsing but for creation, when
// downstream types just wrap this type.
// SAFETY: `DynSizedStructure` is repr(C) with the header as first field,
// any bit pattern is valid, and `BASE_SIZE`/`dst_len` match the ABI.
unsafe