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
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
// Copyright 2024-2026 Gabriel Bjørnager Jensen.
//
// This Source Code Form is subject to the terms of
// the Mozilla Public License, v. 2.0. If a copy of
// the MPL was not distributed with this file, you
// can obtain one at:
// <https://mozilla.org/MPL/2.0/>.
//! The [`transmute`] and [`transmute_unchecked`]
//! functions.
use crate::;
use ManuallyDrop;
use ptr;
/// Transmutes an object to another type.
///
/// The raw octet representation of the object is
/// reused. Note, however, that this isn't necessar-
/// ily equivalent to the new value being equal to
/// the old one (as per [`PartialEq::eq`]).
///
/// This function requires that the source type be
/// [`Init`] as this operation could otherwise
/// rerepresent uninitialised data as being ini-
/// tialised.
///
/// # Panics
///
/// This function will panic at translation time if
/// `T` and `U` aren't of the same size.
pub const
/// Transmutes a constant reference to another
/// reference type.
///
/// This function requires that the source type be
/// [`Init`] as this operation could otherwise
/// rerepresent uninitialised data as being ini-
/// tialised. It additionally requires [`Immutable`]
/// for both types so as to prevent writes.
///
/// # Panics
///
/// This function will panic at translation time if
/// `T` and `U` aren't of the same size, or if the
/// latter has a greater alignement requirement than
/// the former.
pub const
/// Transmutes a mutable reference to another
/// reference type.
///
/// This function requires that both types be
/// [`Init`] as this operation could otherwise
/// represent uninitialised data as initialised,
/// through either a read from or a write to the
/// returned reference.
///
/// # Panics
///
/// This function will panic at translation time if
/// `T` and `U` aren't of the same size, or if the
/// latter has a greater alignement requirement than
/// the former.
pub const
/// Unsafely transmutes an object to another type.
///
/// The raw octet representation of the object is
/// reused. Note, however, that this isn't necessar-
/// ily equivalent to the new value being equal to
/// the old one (as per [`PartialEq::eq`]).
///
/// This function should be used rarely, with
/// [`transmute`] guaranteeing safe transmutations
/// instead. This function may be used instead of
/// [`core::mem::transmute`] when transmuting
/// dependently-sized types (e.g. [arrays](array)).
///
/// # Safety
///
/// The sizes of `T` and `U` must be exactly equal.
/// Furthermore, callers guarantee that the exact
/// representation used by the provided value is
/// valid for objects of the destination type.
pub const unsafe