mirror of
https://github.com/torvalds/linux.git
synced 2025-11-01 17:18:25 +02:00
rust: transmute: add as_bytes method for AsBytes trait
Every type that implements `AsBytes` should be able to provide its byte representation. Introduce the `as_bytes` method that returns the implementer as a stream of bytes, and provide a default implementation that should be suitable for any type that satisfies `AsBytes`'s safety requirements. [acourbot@nvidia.com: use fully qualified `core::mem::size_of_val` to build with Rust 1.78.] Reviewed-by: Danilo Krummrich <dakr@kernel.org> Reviewed-by: Benno Lossin <lossin@kernel.org> Reviewed-by: Alice Ryhl <aliceryhl@google.com> Reviewed-by: Gary Guo <gary@garyguo.net> Acked-by: Miguel Ojeda <ojeda@kernel.org> Link: https://lore.kernel.org/r/20250801-as_bytes-v5-1-975f87d5dc85@nvidia.com Signed-off-by: Alexandre Courbot <acourbot@nvidia.com>
This commit is contained in:
parent
99e7f8e83a
commit
1db476d294
1 changed files with 11 additions and 1 deletions
|
|
@ -47,7 +47,17 @@ macro_rules! impl_frombytes {
|
|||
///
|
||||
/// Values of this type may not contain any uninitialized bytes. This type must not have interior
|
||||
/// mutability.
|
||||
pub unsafe trait AsBytes {}
|
||||
pub unsafe trait AsBytes {
|
||||
/// Returns `self` as a slice of bytes.
|
||||
fn as_bytes(&self) -> &[u8] {
|
||||
// CAST: `Self` implements `AsBytes` thus all bytes of `self` are initialized.
|
||||
let data = core::ptr::from_ref(self).cast::<u8>();
|
||||
let len = core::mem::size_of_val(self);
|
||||
|
||||
// SAFETY: `data` is non-null and valid for reads of `len * sizeof::<u8>()` bytes.
|
||||
unsafe { core::slice::from_raw_parts(data, len) }
|
||||
}
|
||||
}
|
||||
|
||||
macro_rules! impl_asbytes {
|
||||
($($({$($generics:tt)*})? $t:ty, )*) => {
|
||||
|
|
|
|||
Loading…
Reference in a new issue