1 // This file is part of ICU4X. For terms of use, please see the file
2 // called LICENSE at the top level of the ICU4X source tree
3 // (online at: https://github.com/unicode-org/icu4x/blob/main/LICENSE ).
4
5 #![allow(unused)]
6
7 use std::{borrow::Cow, marker::PhantomData};
8 use zerofrom::ZeroFrom;
9 use zerovec::{maps::ZeroMapKV, ule::AsULE, VarZeroVec, ZeroMap, ZeroVec};
10
11 #[derive(ZeroFrom, Copy, Clone)]
12 pub struct IntExample {
13 x: u32,
14 }
15
16 #[derive(ZeroFrom, Copy, Clone)]
17 pub struct GenericsExample<T> {
18 x: u32,
19 y: T,
20 }
21
22 #[derive(ZeroFrom, Copy, Clone)]
23 pub struct GenericsExampleWithDefault<T, U = usize> {
24 x: T,
25 y: U,
26 }
27
28 #[derive(ZeroFrom)]
29 pub struct CowExample<'a> {
30 x: u8,
31 y: &'a str,
32 z: Cow<'a, str>,
33 w: Cow<'a, [u8]>,
34 }
35
36 #[derive(ZeroFrom)]
37 pub struct ZeroVecExample<'a> {
38 var: VarZeroVec<'a, str>,
39 vec: ZeroVec<'a, u16>,
40 }
41
42 #[derive(ZeroFrom)]
43 pub struct ZeroVecExampleWithGenerics<'a, T: AsULE> {
44 gen: ZeroVec<'a, T>,
45 vec: ZeroVec<'a, u16>,
46 bare: T,
47 }
48
49 #[derive(ZeroFrom)]
50 pub struct HasTuples<'data> {
51 pub bar: (&'data str, &'data str),
52 }
53
assert_zf_tuples<'b>(x: &'b HasTuples) -> HasTuples<'b>54 pub fn assert_zf_tuples<'b>(x: &'b HasTuples) -> HasTuples<'b> {
55 HasTuples::zero_from(x)
56 }
assert_zf_generics<'a, 'b>( x: &'b ZeroVecExampleWithGenerics<'a, u8>, ) -> ZeroVecExampleWithGenerics<'b, u8>57 pub fn assert_zf_generics<'a, 'b>(
58 x: &'b ZeroVecExampleWithGenerics<'a, u8>,
59 ) -> ZeroVecExampleWithGenerics<'b, u8> {
60 ZeroVecExampleWithGenerics::<'b, u8>::zero_from(x)
61 }
62
63 #[derive(ZeroFrom)]
64 pub struct ZeroMapGenericExample<'a, T: for<'b> ZeroMapKV<'b> + ?Sized> {
65 map: ZeroMap<'a, str, T>,
66 }
67
assert_zf_map<'b>(x: &'b ZeroMapGenericExample<str>) -> ZeroMapGenericExample<'b, str>68 pub fn assert_zf_map<'b>(x: &'b ZeroMapGenericExample<str>) -> ZeroMapGenericExample<'b, str> {
69 ZeroMapGenericExample::zero_from(x)
70 }
71
72 #[derive(Clone, ZeroFrom)]
73 pub struct CloningZF1 {
74 #[zerofrom(clone)] // Vec is not ZeroFrom, so it needs to be cloned
75 vec: Vec<u8>,
76 }
77
78 #[derive(Clone, ZeroFrom)]
79 pub struct CloningZF2<'data> {
80 #[zerofrom(clone)] // Cow is ZeroFrom, but we force a clone
81 cow: Cow<'data, str>,
82 }
83
84 #[derive(ZeroFrom)]
85 pub enum CloningZF3<'data> {
86 Cow(#[zerofrom(clone)] Cow<'data, str>),
87 }
88
89 #[derive(ZeroFrom)]
90 #[zerofrom(may_borrow(T, Q))] // instead of treating T as a copy type, we want to allow zerofromming T too
91 pub struct GenericsThatAreAlsoZf<T, Q: ?Sized, Ignored: ?Sized> {
92 x: T,
93 y: Option<T>,
94 ignored: PhantomData<Ignored>,
95 q: Q,
96 }
97
assert_zf_generics_may_borrow<'a, 'b>( x: &'b GenericsThatAreAlsoZf<&'a str, usize, str>, ) -> GenericsThatAreAlsoZf<&'b str, usize, str>98 pub fn assert_zf_generics_may_borrow<'a, 'b>(
99 x: &'b GenericsThatAreAlsoZf<&'a str, usize, str>,
100 ) -> GenericsThatAreAlsoZf<&'b str, usize, str> {
101 GenericsThatAreAlsoZf::<&'b str, usize, str>::zero_from(x)
102 }
103
104 #[derive(ZeroFrom)]
105 pub struct UsesGenericsThatAreAlsoZf<'a> {
106 x: GenericsThatAreAlsoZf<&'a str, usize, str>,
107 }
108
109 // Ensure it works with invariant types too
110 #[derive(ZeroFrom)]
111 pub struct UsesGenericsThatAreAlsoZfWithMap<'a> {
112 x: GenericsThatAreAlsoZf<ZeroMap<'a, str, str>, usize, str>,
113 }
114
main()115 fn main() {}
116