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 #[cfg(feature = "alloc")] 6 use crate::map::ZeroMapKV; 7 use crate::ule::*; 8 use crate::vecs::VarZeroVecFormat; 9 use crate::{VarZeroSlice, VarZeroVec, ZeroSlice, ZeroVec}; 10 #[cfg(feature = "alloc")] 11 use crate::{ZeroMap, ZeroMap2d}; 12 use zerofrom::ZeroFrom; 13 14 impl<'zf, T> ZeroFrom<'zf, ZeroVec<'_, T>> for ZeroVec<'zf, T> 15 where 16 T: 'static + AsULE, 17 { 18 #[inline] zero_from(other: &'zf ZeroVec<'_, T>) -> Self19 fn zero_from(other: &'zf ZeroVec<'_, T>) -> Self { 20 ZeroVec::new_borrowed(other.as_ule_slice()) 21 } 22 } 23 24 impl<'zf, T> ZeroFrom<'zf, ZeroSlice<T>> for ZeroVec<'zf, T> 25 where 26 T: 'static + AsULE, 27 { 28 #[inline] zero_from(other: &'zf ZeroSlice<T>) -> Self29 fn zero_from(other: &'zf ZeroSlice<T>) -> Self { 30 ZeroVec::new_borrowed(other.as_ule_slice()) 31 } 32 } 33 34 impl<'zf, T> ZeroFrom<'zf, ZeroSlice<T>> for &'zf ZeroSlice<T> 35 where 36 T: 'static + AsULE, 37 { 38 #[inline] zero_from(other: &'zf ZeroSlice<T>) -> Self39 fn zero_from(other: &'zf ZeroSlice<T>) -> Self { 40 other 41 } 42 } 43 44 impl<'zf, T, F: VarZeroVecFormat> ZeroFrom<'zf, VarZeroSlice<T, F>> for VarZeroVec<'zf, T, F> 45 where 46 T: 'static + VarULE + ?Sized, 47 { 48 #[inline] zero_from(other: &'zf VarZeroSlice<T, F>) -> Self49 fn zero_from(other: &'zf VarZeroSlice<T, F>) -> Self { 50 other.into() 51 } 52 } 53 54 impl<'zf, T, F: VarZeroVecFormat> ZeroFrom<'zf, VarZeroVec<'_, T, F>> for VarZeroVec<'zf, T, F> 55 where 56 T: 'static + VarULE + ?Sized, 57 { 58 #[inline] zero_from(other: &'zf VarZeroVec<'_, T, F>) -> Self59 fn zero_from(other: &'zf VarZeroVec<'_, T, F>) -> Self { 60 other.as_slice().into() 61 } 62 } 63 64 impl<'zf, T> ZeroFrom<'zf, VarZeroSlice<T>> for &'zf VarZeroSlice<T> 65 where 66 T: 'static + VarULE + ?Sized, 67 { 68 #[inline] zero_from(other: &'zf VarZeroSlice<T>) -> Self69 fn zero_from(other: &'zf VarZeroSlice<T>) -> Self { 70 other 71 } 72 } 73 74 #[cfg(feature = "alloc")] 75 impl<'zf, 's, K, V> ZeroFrom<'zf, ZeroMap<'s, K, V>> for ZeroMap<'zf, K, V> 76 where 77 K: 'static + for<'b> ZeroMapKV<'b> + ?Sized, 78 V: 'static + for<'b> ZeroMapKV<'b> + ?Sized, 79 <K as ZeroMapKV<'zf>>::Container: ZeroFrom<'zf, <K as ZeroMapKV<'s>>::Container>, 80 <V as ZeroMapKV<'zf>>::Container: ZeroFrom<'zf, <V as ZeroMapKV<'s>>::Container>, 81 { zero_from(other: &'zf ZeroMap<'s, K, V>) -> Self82 fn zero_from(other: &'zf ZeroMap<'s, K, V>) -> Self { 83 ZeroMap { 84 keys: K::Container::zero_from(&other.keys), 85 values: V::Container::zero_from(&other.values), 86 } 87 } 88 } 89 90 #[cfg(feature = "alloc")] 91 impl<'zf, 's, K0, K1, V> ZeroFrom<'zf, ZeroMap2d<'s, K0, K1, V>> for ZeroMap2d<'zf, K0, K1, V> 92 where 93 K0: 'static + for<'b> ZeroMapKV<'b> + ?Sized, 94 K1: 'static + for<'b> ZeroMapKV<'b> + ?Sized, 95 V: 'static + for<'b> ZeroMapKV<'b> + ?Sized, 96 <K0 as ZeroMapKV<'zf>>::Container: ZeroFrom<'zf, <K0 as ZeroMapKV<'s>>::Container>, 97 <K1 as ZeroMapKV<'zf>>::Container: ZeroFrom<'zf, <K1 as ZeroMapKV<'s>>::Container>, 98 <V as ZeroMapKV<'zf>>::Container: ZeroFrom<'zf, <V as ZeroMapKV<'s>>::Container>, 99 { zero_from(other: &'zf ZeroMap2d<'s, K0, K1, V>) -> Self100 fn zero_from(other: &'zf ZeroMap2d<'s, K0, K1, V>) -> Self { 101 ZeroMap2d { 102 keys0: K0::Container::zero_from(&other.keys0), 103 joiner: ZeroVec::zero_from(&other.joiner), 104 keys1: K1::Container::zero_from(&other.keys1), 105 values: V::Container::zero_from(&other.values), 106 } 107 } 108 } 109