Expand description
Trait for types that can be created from a reference to a different type C
with no allocations,
i.e. a zero-copy (zero-alloc) version of “From”
A type can be the ZeroFrom
target of multiple other types.
The intention is for ZeroFrom
to produce a struct from a other with as little work as
possible. Although it is technically possible to implement ZeroFrom
without being
zero-copy (using heap allocations), doing so defeats the purpose of ZeroFrom
.
For example, impl ZeroFrom<C> for Cow<str>
should return a Cow::Borrowed
pointing at
data in the other type C
, even if the other type is itself fully owned.
One can use the #[derive(ZeroFrom)]
custom derive to automatically
implement this trait.
Implementing ZeroFrom
on a custom data struct:
use zerofrom::ZeroFrom;
use std::borrow::Cow;
struct MyStruct<'data> {
message: Cow<'data, str>,
}
impl<'zf> ZeroFrom<'zf, MyStruct<'_>> for MyStruct<'zf> {
fn zero_from(other: &'zf MyStruct<'_>) -> Self {
MyStruct {
message: Cow::Borrowed(&other.message)
}
}
}
impl<'zf> ZeroFrom<'zf, str> for MyStruct<'zf> {
fn zero_from(other: &'zf str) -> Self {
MyStruct {
message: Cow::Borrowed(other)
}
}
}
Clone the other C
into a struct that may retain references into C
.
sourceimpl<'zf, C1, T1: ZeroFrom<'zf, C1>, C2, T2: ZeroFrom<'zf, C2>, C3, T3: ZeroFrom<'zf, C3>> ZeroFrom<'zf, (C1, C2, C3)> for (T1, T2, T3)
sourceimpl<'zf, C1, T1: ZeroFrom<'zf, C1>, C2, T2: ZeroFrom<'zf, C2>, C3, T3: ZeroFrom<'zf, C3>, C4, T4: ZeroFrom<'zf, C4>> ZeroFrom<'zf, (C1, C2, C3, C4)> for (T1, T2, T3, T4)
sourceimpl<'zf, C1, T1: ZeroFrom<'zf, C1>, C2, T2: ZeroFrom<'zf, C2>, C3, T3: ZeroFrom<'zf, C3>, C4, T4: ZeroFrom<'zf, C4>, C5, T5: ZeroFrom<'zf, C5>> ZeroFrom<'zf, (C1, C2, C3, C4, C5)> for (T1, T2, T3, T4, T5)
sourceimpl<'zf, C1, T1: ZeroFrom<'zf, C1>, C2, T2: ZeroFrom<'zf, C2>, C3, T3: ZeroFrom<'zf, C3>, C4, T4: ZeroFrom<'zf, C4>, C5, T5: ZeroFrom<'zf, C5>, C6, T6: ZeroFrom<'zf, C6>> ZeroFrom<'zf, (C1, C2, C3, C4, C5, C6)> for (T1, T2, T3, T4, T5, T6)
sourceimpl<'zf, C1, T1: ZeroFrom<'zf, C1>, C2, T2: ZeroFrom<'zf, C2>, C3, T3: ZeroFrom<'zf, C3>, C4, T4: ZeroFrom<'zf, C4>, C5, T5: ZeroFrom<'zf, C5>, C6, T6: ZeroFrom<'zf, C6>, C7, T7: ZeroFrom<'zf, C7>> ZeroFrom<'zf, (C1, C2, C3, C4, C5, C6, C7)> for (T1, T2, T3, T4, T5, T6, T7)
sourceimpl<'zf, C1, T1: ZeroFrom<'zf, C1>, C2, T2: ZeroFrom<'zf, C2>, C3, T3: ZeroFrom<'zf, C3>, C4, T4: ZeroFrom<'zf, C4>, C5, T5: ZeroFrom<'zf, C5>, C6, T6: ZeroFrom<'zf, C6>, C7, T7: ZeroFrom<'zf, C7>, C8, T8: ZeroFrom<'zf, C8>> ZeroFrom<'zf, (C1, C2, C3, C4, C5, C6, C7, C8)> for (T1, T2, T3, T4, T5, T6, T7, T8)
sourceimpl<'zf, C1, T1: ZeroFrom<'zf, C1>, C2, T2: ZeroFrom<'zf, C2>, C3, T3: ZeroFrom<'zf, C3>, C4, T4: ZeroFrom<'zf, C4>, C5, T5: ZeroFrom<'zf, C5>, C6, T6: ZeroFrom<'zf, C6>, C7, T7: ZeroFrom<'zf, C7>, C8, T8: ZeroFrom<'zf, C8>, C9, T9: ZeroFrom<'zf, C9>> ZeroFrom<'zf, (C1, C2, C3, C4, C5, C6, C7, C8, C9)> for (T1, T2, T3, T4, T5, T6, T7, T8, T9)
sourceimpl<'zf, C1, T1: ZeroFrom<'zf, C1>, C2, T2: ZeroFrom<'zf, C2>, C3, T3: ZeroFrom<'zf, C3>, C4, T4: ZeroFrom<'zf, C4>, C5, T5: ZeroFrom<'zf, C5>, C6, T6: ZeroFrom<'zf, C6>, C7, T7: ZeroFrom<'zf, C7>, C8, T8: ZeroFrom<'zf, C8>, C9, T9: ZeroFrom<'zf, C9>, C10, T10: ZeroFrom<'zf, C10>> ZeroFrom<'zf, (C1, C2, C3, C4, C5, C6, C7, C8, C9, C10)> for (T1, T2, T3, T4, T5, T6, T7, T8, T9, T10)