@@ -70,36 +70,39 @@ pub const fn must_cast_ref<A: NoUninit, B: AnyBitPattern>(a: &A) -> &B {
70
70
unsafe { & * ( a as * const A as * const B ) }
71
71
}
72
72
73
- /// Convert a `&mut A` into `&mut B` if infalliable, or fail to compile.
74
- ///
75
- /// As [`must_cast_ref`], but `mut`.
76
- ///
77
- /// ## Examples
78
- /// ```
79
- /// let mut i = 12_u16;
80
- /// // compiles:
81
- /// let bytes: &mut [u8; 2] = bytemuck::must_cast_mut(&mut i);
82
- /// ```
83
- /// ```compile_fail,E0080
84
- /// # let mut bytes: &mut [u8; 2] = &mut [1, 2];
85
- /// // fails to compile (alignment requirements increased):
86
- /// let i : &mut u16 = bytemuck::must_cast_mut(bytes);
87
- /// ```
88
- /// ```compile_fail,E0080
89
- /// # let mut i = 12_u16;
90
- /// // fails to compile (size mismatch):
91
- /// let bytes : &mut [u8; 3] = bytemuck::must_cast_mut(&mut i);
92
- /// ```
93
- #[ inline]
94
- pub fn must_cast_mut <
95
- A : NoUninit + AnyBitPattern ,
96
- B : NoUninit + AnyBitPattern ,
97
- > (
98
- a : & mut A ,
99
- ) -> & mut B {
100
- let _ = Cast :: < A , B > :: ASSERT_SIZE_EQUAL ;
101
- let _ = Cast :: < A , B > :: ASSERT_ALIGN_GREATER_THAN_EQUAL ;
102
- unsafe { & mut * ( a as * mut A as * mut B ) }
73
+ maybe_const_fn ! {
74
+ #[ cfg( feature = "must_cast_extra" ) ]
75
+ /// Convert a `&mut A` into `&mut B` if infalliable, or fail to compile.
76
+ ///
77
+ /// As [`must_cast_ref`], but `mut`.
78
+ ///
79
+ /// ## Examples
80
+ /// ```
81
+ /// let mut i = 12_u16;
82
+ /// // compiles:
83
+ /// let bytes: &mut [u8; 2] = bytemuck::must_cast_mut(&mut i);
84
+ /// ```
85
+ /// ```compile_fail,E0080
86
+ /// # let mut bytes: &mut [u8; 2] = &mut [1, 2];
87
+ /// // fails to compile (alignment requirements increased):
88
+ /// let i : &mut u16 = bytemuck::must_cast_mut(bytes);
89
+ /// ```
90
+ /// ```compile_fail,E0080
91
+ /// # let mut i = 12_u16;
92
+ /// // fails to compile (size mismatch):
93
+ /// let bytes : &mut [u8; 3] = bytemuck::must_cast_mut(&mut i);
94
+ /// ```
95
+ #[ inline]
96
+ pub fn must_cast_mut<
97
+ A : NoUninit + AnyBitPattern ,
98
+ B : NoUninit + AnyBitPattern ,
99
+ >(
100
+ a: & mut A ,
101
+ ) -> & mut B {
102
+ let _ = Cast :: <A , B >:: ASSERT_SIZE_EQUAL ;
103
+ let _ = Cast :: <A , B >:: ASSERT_ALIGN_GREATER_THAN_EQUAL ;
104
+ unsafe { & mut * ( a as * mut A as * mut B ) }
105
+ }
103
106
}
104
107
105
108
/// Convert `&[A]` into `&[B]` (possibly with a change in length) if
@@ -154,53 +157,56 @@ pub const fn must_cast_slice<A: NoUninit, B: AnyBitPattern>(a: &[A]) -> &[B] {
154
157
unsafe { core:: slice:: from_raw_parts ( a. as_ptr ( ) as * const B , new_len) }
155
158
}
156
159
157
- /// Convert `&mut [A]` into `&mut [B]` (possibly with a change in length) if
158
- /// infalliable, or fail to compile.
159
- ///
160
- /// As [`must_cast_slice`], but `&mut`.
161
- ///
162
- /// ## Examples
163
- /// ```
164
- /// let mut indicies = [1, 2, 3];
165
- /// let indicies: &mut [u16] = &mut indicies;
166
- /// // compiles:
167
- /// let bytes: &mut [u8] = bytemuck::must_cast_slice_mut(indicies);
168
- /// ```
169
- /// ```
170
- /// let zsts: &mut [()] = &mut [(), (), ()];
171
- /// // compiles:
172
- /// let bytes: &mut [u8] = bytemuck::must_cast_slice_mut(zsts);
173
- /// ```
174
- /// ```compile_fail,E0080
175
- /// # let mut bytes = [1, 0, 2, 0, 3, 0];
176
- /// # let bytes : &mut [u8] = &mut bytes[..];
177
- /// // fails to compile (bytes.len() might not be a multiple of 2):
178
- /// let byte_pairs : &mut [[u8; 2]] = bytemuck::must_cast_slice_mut(bytes);
179
- /// ```
180
- /// ```compile_fail,E0080
181
- /// # let mut byte_pairs = [[1, 0], [2, 0], [3, 0]];
182
- /// # let byte_pairs : &mut [[u8; 2]] = &mut byte_pairs[..];
183
- /// // fails to compile (alignment requirements increased):
184
- /// let indicies : &mut [u16] = bytemuck::must_cast_slice_mut(byte_pairs);
185
- /// ```
186
- /// ```compile_fail,E0080
187
- /// let bytes: &mut [u8] = &mut [];
188
- /// // fails to compile: (bytes.len() might not be 0)
189
- /// let zsts: &mut [()] = bytemuck::must_cast_slice_mut(bytes);
190
- /// ```
191
- #[ inline]
192
- pub fn must_cast_slice_mut <
193
- A : NoUninit + AnyBitPattern ,
194
- B : NoUninit + AnyBitPattern ,
195
- > (
196
- a : & mut [ A ] ,
197
- ) -> & mut [ B ] {
198
- let _ = Cast :: < A , B > :: ASSERT_SIZE_MULTIPLE_OF_OR_INPUT_ZST ;
199
- let _ = Cast :: < A , B > :: ASSERT_ALIGN_GREATER_THAN_EQUAL ;
200
- let new_len = if size_of :: < A > ( ) == size_of :: < B > ( ) {
201
- a. len ( )
202
- } else {
203
- a. len ( ) * ( size_of :: < A > ( ) / size_of :: < B > ( ) )
204
- } ;
205
- unsafe { core:: slice:: from_raw_parts_mut ( a. as_mut_ptr ( ) as * mut B , new_len) }
160
+ maybe_const_fn ! {
161
+ #[ cfg( feature = "must_cast_extra" ) ]
162
+ /// Convert `&mut [A]` into `&mut [B]` (possibly with a change in length) if
163
+ /// infalliable, or fail to compile.
164
+ ///
165
+ /// As [`must_cast_slice`], but `&mut`.
166
+ ///
167
+ /// ## Examples
168
+ /// ```
169
+ /// let mut indicies = [1, 2, 3];
170
+ /// let indicies: &mut [u16] = &mut indicies;
171
+ /// // compiles:
172
+ /// let bytes: &mut [u8] = bytemuck::must_cast_slice_mut(indicies);
173
+ /// ```
174
+ /// ```
175
+ /// let zsts: &mut [()] = &mut [(), (), ()];
176
+ /// // compiles:
177
+ /// let bytes: &mut [u8] = bytemuck::must_cast_slice_mut(zsts);
178
+ /// ```
179
+ /// ```compile_fail,E0080
180
+ /// # let mut bytes = [1, 0, 2, 0, 3, 0];
181
+ /// # let bytes : &mut [u8] = &mut bytes[..];
182
+ /// // fails to compile (bytes.len() might not be a multiple of 2):
183
+ /// let byte_pairs : &mut [[u8; 2]] = bytemuck::must_cast_slice_mut(bytes);
184
+ /// ```
185
+ /// ```compile_fail,E0080
186
+ /// # let mut byte_pairs = [[1, 0], [2, 0], [3, 0]];
187
+ /// # let byte_pairs : &mut [[u8; 2]] = &mut byte_pairs[..];
188
+ /// // fails to compile (alignment requirements increased):
189
+ /// let indicies : &mut [u16] = bytemuck::must_cast_slice_mut(byte_pairs);
190
+ /// ```
191
+ /// ```compile_fail,E0080
192
+ /// let bytes: &mut [u8] = &mut [];
193
+ /// // fails to compile: (bytes.len() might not be 0)
194
+ /// let zsts: &mut [()] = bytemuck::must_cast_slice_mut(bytes);
195
+ /// ```
196
+ #[ inline]
197
+ pub fn must_cast_slice_mut<
198
+ A : NoUninit + AnyBitPattern ,
199
+ B : NoUninit + AnyBitPattern ,
200
+ >(
201
+ a: & mut [ A ] ,
202
+ ) -> & mut [ B ] {
203
+ let _ = Cast :: <A , B >:: ASSERT_SIZE_MULTIPLE_OF_OR_INPUT_ZST ;
204
+ let _ = Cast :: <A , B >:: ASSERT_ALIGN_GREATER_THAN_EQUAL ;
205
+ let new_len = if size_of:: <A >( ) == size_of:: <B >( ) {
206
+ a. len( )
207
+ } else {
208
+ a. len( ) * ( size_of:: <A >( ) / size_of:: <B >( ) )
209
+ } ;
210
+ unsafe { core:: slice:: from_raw_parts_mut( a. as_mut_ptr( ) as * mut B , new_len) }
211
+ }
206
212
}
0 commit comments