Struct multiboot2_common::DynSizedStructure
source · #[repr(C, align(8))]pub struct DynSizedStructure<H: Header> { /* private fields */ }Expand description
An C ABI-compatible dynamically sized type with a common sized Header
and a dynamic amount of bytes. This structures owns all its bytes, unlike
Header. Instances guarantees that the memory requirements promised in
the crates description are respected.
This can be a Multiboot2 header tag, information tag, boot information, or
a Multiboot2 header. Depending on the context, the Header is different.
§ABI
This type uses the C ABI. The fixed Header portion is always there.
Further, there is a variable amount of payload bytes. Thus, this type can
only exist on the heap or references to it can be made by cast via fat
pointers.
Implementations§
source§impl<H: Header> DynSizedStructure<H>
impl<H: Header> DynSizedStructure<H>
sourcepub fn ref_from_bytes(bytes: BytesRef<'_, H>) -> Result<&Self, MemoryError>
pub fn ref_from_bytes(bytes: BytesRef<'_, H>) -> Result<&Self, MemoryError>
Creates a new fat-pointer backed reference to a DynSizedStructure
from the given BytesRef.
sourcepub fn ref_from_slice(bytes: &[u8]) -> Result<&Self, MemoryError>
pub fn ref_from_slice(bytes: &[u8]) -> Result<&Self, MemoryError>
Creates a new fat-pointer backed reference to a DynSizedStructure
from the given &[u8].
sourcepub unsafe fn ref_from_ptr<'a>(ptr: NonNull<H>) -> Result<&'a Self, MemoryError>
pub unsafe fn ref_from_ptr<'a>(ptr: NonNull<H>) -> Result<&'a Self, MemoryError>
Creates a new fat-pointer backed reference to a DynSizedStructure
from the given thin pointer to the Header. It reads the total size
from the header.
§Safety
The caller must ensure that the function operates on valid memory.
sourcepub fn cast<T: MaybeDynSized<Header = H> + ?Sized>(&self) -> &T
pub fn cast<T: MaybeDynSized<Header = H> + ?Sized>(&self) -> &T
Casts the structure tag to a specific MaybeDynSized implementation which
may be a ZST or DST typed tag. The output type will have the exact same
size as *self. The target type must be sufficient for that. If not,
the function will panic.
§Safety
This function is safe due to various sanity checks and the overall memory assertions done while constructing this type.
§Panics
This panics if there is a size mismatch. However, this should never be the case if all types follow their documented requirements.
Trait Implementations§
source§impl<H: Header> MaybeDynSized for DynSizedStructure<H>
impl<H: Header> MaybeDynSized for DynSizedStructure<H>
source§const BASE_SIZE: usize = _
const BASE_SIZE: usize = _
size_of::<T>() isn’t sufficient, as for example
the type could have three u32 fields, which would add an implicit
u32 padding. However, this constant must always fulfill
BASE_SIZE >= size_of::<Self::Header>(). Read moresource§fn dst_len(header: &Self::Header) -> Self::Metadata
fn dst_len(header: &Self::Header) -> Self::Metadata
source§fn payload(&self) -> &[u8]
fn payload(&self) -> &[u8]
Header of the type.