Trait MaybeDynSized

Source
pub trait MaybeDynSized: Pointee {
    type Header: Header;

    const BASE_SIZE: usize;

    // Required method
    fn dst_len(header: &Self::Header) -> Self::Metadata;

    // Provided methods
    fn header(&self) -> &Self::Header { ... }
    fn payload(&self) -> &[u8] { ... }
    fn as_bytes(&self) -> BytesRef<'_, Self::Header> { ... }
    fn as_ptr(&self) -> *const Self::Header { ... }
}
Expand description

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.

§ABI

Implementors must use #[repr(C)]. As there might be padding necessary for the proper Rust layout, size_of_val(&self) might report additional padding bytes that are not reflected by the actual payload. These additional padding bytes however will be reflected in corresponding BytesRef instances.

Required Associated Constants§

Source

const BASE_SIZE: usize

The true base size of the struct without any implicit or additional padding. Note that 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>().

The main purpose of this constant is to create awareness when you implement Self::dst_len, where you should use this. If this value is correct, we prevent situations where we read uninitialized bytes, especially when creating tags in builders.

Required Associated Types§

Source

type Header: Header

The associated Header of this tag.

Required Methods§

Source

fn dst_len(header: &Self::Header) -> Self::Metadata

Returns the amount of items in the dynamically sized portion of the DST. Note that this is not the amount of bytes. So if the dynamically sized portion is 16 bytes in size and each element is 4 bytes big, then this function must return 4.

For sized tags, this just returns (). For DSTs, this returns an usize.

Provided Methods§

Source

fn header(&self) -> &Self::Header

Returns the corresponding Header.

Source

fn payload(&self) -> &[u8]

Returns the payload, i.e., all memory that is not occupied by the Header of the type.

Source

fn as_bytes(&self) -> BytesRef<'_, Self::Header>

Returns the whole allocated bytes for this structure encapsulated in BytesRef. This includes padding bytes. To only get the “true” tag data, read the tag size from Self::header and create a sub slice.

Source

fn as_ptr(&self) -> *const Self::Header

Returns a pointer to this structure.

Dyn Compatibility§

This trait is not dyn compatible.

In older versions of Rust, dyn compatibility was called "object safety", so this trait is not object safe.

Implementors§

Source§

impl MaybeDynSized for DummyDstTag

Source§

impl MaybeDynSized for ApmTag

Source§

const BASE_SIZE: usize = 32usize

Source§

type Header = TagHeader

Source§

impl MaybeDynSized for BasicMemoryInfoTag

Source§

const BASE_SIZE: usize = 16usize

Source§

type Header = TagHeader

Source§

impl MaybeDynSized for BootLoaderNameTag

Source§

const BASE_SIZE: usize = 8usize

Source§

type Header = TagHeader

Source§

impl MaybeDynSized for BootdevTag

Source§

const BASE_SIZE: usize = 24usize

Source§

type Header = TagHeader

Source§

impl MaybeDynSized for CommandLineTag

Source§

const BASE_SIZE: usize = 8usize

Source§

type Header = TagHeader

Source§

impl MaybeDynSized for EFIBootServicesNotExitedTag

Source§

const BASE_SIZE: usize = 8usize

Source§

type Header = TagHeader

Source§

impl MaybeDynSized for EFIImageHandle32Tag

Source§

const BASE_SIZE: usize = 16usize

Source§

type Header = TagHeader

Source§

impl MaybeDynSized for EFIImageHandle64Tag

Source§

const BASE_SIZE: usize = 16usize

Source§

type Header = TagHeader

Source§

impl MaybeDynSized for EFIMemoryMapTag

Source§

const BASE_SIZE: usize = 16usize

Source§

type Header = TagHeader

Source§

impl MaybeDynSized for EFISdt32Tag

Source§

const BASE_SIZE: usize = 16usize

Source§

type Header = TagHeader

Source§

impl MaybeDynSized for EFISdt64Tag

Source§

const BASE_SIZE: usize = 16usize

Source§

type Header = TagHeader

Source§

impl MaybeDynSized for ElfSectionsTag

Source§

const BASE_SIZE: usize = 20usize

Source§

type Header = TagHeader

Source§

impl MaybeDynSized for EndTag

Source§

const BASE_SIZE: usize = 8usize

Source§

type Header = TagHeader

Source§

impl MaybeDynSized for FramebufferTag

Source§

const BASE_SIZE: usize = 32usize

Source§

type Header = TagHeader

Source§

impl MaybeDynSized for ImageLoadPhysAddrTag

Source§

const BASE_SIZE: usize = 16usize

Source§

type Header = TagHeader

Source§

impl MaybeDynSized for MemoryMapTag

Source§

const BASE_SIZE: usize = 16usize

Source§

type Header = TagHeader

Source§

impl MaybeDynSized for ModuleTag

Source§

const BASE_SIZE: usize = 16usize

Source§

type Header = TagHeader

Source§

impl MaybeDynSized for NetworkTag

Source§

const BASE_SIZE: usize = 8usize

Source§

type Header = TagHeader

Source§

impl MaybeDynSized for RsdpV1Tag

Source§

const BASE_SIZE: usize = 32usize

Source§

type Header = TagHeader

Source§

impl MaybeDynSized for RsdpV2Tag

Source§

const BASE_SIZE: usize = 48usize

Source§

type Header = TagHeader

Source§

impl MaybeDynSized for SmbiosTag

Source§

const BASE_SIZE: usize = 16usize

Source§

type Header = TagHeader

Source§

impl MaybeDynSized for VBEInfoTag

Source§

const BASE_SIZE: usize = 784usize

Source§

type Header = TagHeader

Source§

impl<H> MaybeDynSized for DynSizedStructure<H>
where H: Header,

Source§

const BASE_SIZE: usize

Source§

type Header = H