Skip to main content

TypeMeta

Enum TypeMeta 

Source
pub enum TypeMeta {
    Static {
        size: usize,
        zero_copy: bool,
    },
    Dynamic,
}
Expand description

Indicates what kind of assumptions can be made when encoding or decoding a type.

Readers and writers may use this to optimize their behavior.

Variants§

§

Static

The type has a statically known serialized size.

Specifying this variant can have significant performance benefits, as it can allow writers to prefetch larger chunks of memory such that subsequent read/write operations in those chunks can be performed at once without intermediate bounds checks.

Specifying this variant incorrectly will almost certainly result in a panic at runtime.

Take care not to specify this on variable length types, like Vec or String, as their serialized size will vary based on their length.

Fields

§size: usize

The static serialized size of the type.

§zero_copy: bool

Whether the type is eligible for zero-copy encoding/decoding.

This indicates that the type has no invalid bit patterns, no layout requirements, no endianness checks, etc. This is a very strong claim that should be used judiciously.

Specifying this incorrectly may trigger UB.

§

Dynamic

The type has a dynamic size, and no optimizations can be made.

Implementations§

Source§

impl TypeMeta

Source

pub const fn keep_zero_copy(self, keep_zero_copy: bool) -> Self

Returns this TypeMeta instance with zero_copy masked by keep_zero_copy.

For TypeMeta::Static, this preserves size and computes: zero_copy = zero_copy && keep_zero_copy.

For TypeMeta::Dynamic, this is a no-op.

This method never upgrades a type to zero-copy.

  • keep_zero_copy(true) leaves the flag unchanged.
  • keep_zero_copy(false) clears the flag.
Source

pub const fn join_types<const N: usize>(types: [Self; N]) -> Self

Combines multiple constituent TypeMeta values into one aggregate.

Intended for composite types whose constituents are serialized sequentially.

Semantics:

  • If any input is Dynamic, returns Dynamic.
  • Otherwise returns Static with:
    • size = sum of all constituent sizes
    • zero_copy = logical AND of all constituent zero_copy flags

Notes:

  • This function does not validate layout/padding; it only combines metadata.
  • For N = 0, the result is TypeMeta::Static { size: 0, zero_copy: true }.
  • The caller must ensure the summed size is meaningful for the target type.
use wincode::TypeMeta;

let types = [
    TypeMeta::Static { size: 1, zero_copy: true },
    TypeMeta::Static { size: 2, zero_copy: true },
    TypeMeta::Dynamic,
    TypeMeta::Static { size: 3, zero_copy: true },
];
assert_eq!(TypeMeta::join_types(types), TypeMeta::Dynamic);
use wincode::TypeMeta;

let types = [
    TypeMeta::Static { size: 1, zero_copy: true },
    TypeMeta::Static { size: 2, zero_copy: true },
    TypeMeta::Static { size: 3, zero_copy: true },
];
assert_eq!(TypeMeta::join_types(types), TypeMeta::Static { size: 6, zero_copy: true });
use wincode::TypeMeta;

let types = [
    TypeMeta::Static { size: 1, zero_copy: true },
    TypeMeta::Static { size: 2, zero_copy: false },
    TypeMeta::Static { size: 3, zero_copy: true },
];
assert_eq!(TypeMeta::join_types(types), TypeMeta::Static { size: 6, zero_copy: false });

Trait Implementations§

Source§

impl Clone for TypeMeta

Source§

fn clone(&self) -> Self

Returns a duplicate of the value. Read more
1.0.0 (const: unstable) · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Copy for TypeMeta

Source§

impl Debug for TypeMeta

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Eq for TypeMeta

Source§

impl PartialEq for TypeMeta

Source§

fn eq(&self, other: &Self) -> bool

Equality operator ==. Read more
1.0.0 (const: unstable) · Source§

fn ne(&self, other: &Rhs) -> bool

Inequality operator !=. Read more
Source§

impl StructuralPartialEq for TypeMeta

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T> ToOwned for T
where T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = !

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, !>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.