Macro safe_transmute::try_copy
source · macro_rules! try_copy { ($res:expr) => { ... }; }
Expand description
Retrieve the result of a transmutation, copying the data if it could not be safely performed due to memory alignment constraints.
This macro, akin to try!()
, will short-circuit certain errors by
return
ing, namely guard condition and invalid value errors.
When the operation fails due to either an unaligned transmutation
or an incompatible vector element transmutation target,
the transmutation is reattempted by byte-copying (i.e. memcpy()
ing)
the input into a newly-allocated vector.
This expands into a single expression of type Cow<[T]>
,
where T
is the target type.
§Example
let bytes = &[0x00, 0x01, 0x12, 0x34,
0x00]; // 1 spare byte
let words = try_copy!(transmute_many::<u16, SingleManyGuard>(bytes));
assert_eq!(*words,
[u16::from_be(0x0001), u16::from_be(0x1234)]);