diff options
Diffstat (limited to 'third_party/rust/zerofrom-derive/examples')
-rw-r--r-- | third_party/rust/zerofrom-derive/examples/zf_derive.rs | 113 |
1 files changed, 113 insertions, 0 deletions
diff --git a/third_party/rust/zerofrom-derive/examples/zf_derive.rs b/third_party/rust/zerofrom-derive/examples/zf_derive.rs new file mode 100644 index 0000000000..a1bde83733 --- /dev/null +++ b/third_party/rust/zerofrom-derive/examples/zf_derive.rs @@ -0,0 +1,113 @@ +// This file is part of ICU4X. For terms of use, please see the file +// called LICENSE at the top level of the ICU4X source tree +// (online at: https://github.com/unicode-org/icu4x/blob/main/LICENSE ). + +#![allow(unused)] + +use std::borrow::Cow; +use zerofrom::ZeroFrom; +use zerovec::{maps::ZeroMapKV, ule::AsULE, VarZeroVec, ZeroMap, ZeroVec}; + +#[derive(ZeroFrom, Copy, Clone)] +pub struct IntExample { + x: u32, +} + +#[derive(ZeroFrom, Copy, Clone)] +pub struct GenericsExample<T> { + x: u32, + y: T, +} + +#[derive(ZeroFrom, Copy, Clone)] +pub struct GenericsExampleWithDefault<T, U = usize> { + x: T, + y: U, +} + +#[derive(ZeroFrom)] +pub struct CowExample<'a> { + x: u8, + y: &'a str, + z: Cow<'a, str>, + w: Cow<'a, [u8]>, +} + +#[derive(ZeroFrom)] +pub struct ZeroVecExample<'a> { + var: VarZeroVec<'a, str>, + vec: ZeroVec<'a, u16>, +} + +#[derive(ZeroFrom)] +pub struct ZeroVecExampleWithGenerics<'a, T: AsULE> { + gen: ZeroVec<'a, T>, + vec: ZeroVec<'a, u16>, + bare: T, +} + +#[derive(ZeroFrom)] +pub struct HasTuples<'data> { + pub bar: (&'data str, &'data str), +} + +pub fn assert_zf_tuples<'b>(x: &'b HasTuples) -> HasTuples<'b> { + HasTuples::zero_from(x) +} +pub fn assert_zf_generics<'a, 'b>( + x: &'b ZeroVecExampleWithGenerics<'a, u8>, +) -> ZeroVecExampleWithGenerics<'b, u8> { + ZeroVecExampleWithGenerics::<'b, u8>::zero_from(x) +} + +#[derive(ZeroFrom)] +pub struct ZeroMapGenericExample<'a, T: for<'b> ZeroMapKV<'b> + ?Sized> { + map: ZeroMap<'a, str, T>, +} + +pub fn assert_zf_map<'b>(x: &'b ZeroMapGenericExample<str>) -> ZeroMapGenericExample<'b, str> { + ZeroMapGenericExample::zero_from(x) +} + +#[derive(Clone, ZeroFrom)] +pub struct CloningZF1 { + #[zerofrom(clone)] // Vec is not ZeroFrom, so it needs to be cloned + vec: Vec<u8>, +} + +#[derive(Clone, ZeroFrom)] +pub struct CloningZF2<'data> { + #[zerofrom(clone)] // Cow is ZeroFrom, but we force a clone + cow: Cow<'data, str>, +} + +#[derive(ZeroFrom)] +pub enum CloningZF3<'data> { + Cow(#[zerofrom(clone)] Cow<'data, str>), +} + +#[derive(ZeroFrom)] +#[zerofrom(may_borrow(T))] // instead of treating T as a copy type, we want to allow zerofromming T too +pub struct GenericsThatAreAlsoZf<T> { + x: T, + y: Option<T>, +} + +pub fn assert_zf_generics_may_borrow<'a, 'b>( + x: &'b GenericsThatAreAlsoZf<&'a str>, +) -> GenericsThatAreAlsoZf<&'b str> { + GenericsThatAreAlsoZf::<&'b str>::zero_from(x) +} + +#[derive(ZeroFrom)] +pub struct UsesGenericsThatAreAlsoZf<'a> { + x: GenericsThatAreAlsoZf<&'a str>, +} + +// Ensure it works with invariant types too +#[derive(ZeroFrom)] +pub struct UsesGenericsThatAreAlsoZfWithMap<'a> { + x: GenericsThatAreAlsoZf<ZeroMap<'a, str, str>>, +} + +fn main() {} |