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 use crate::{maps::ZeroMapBorrowed, maps::ZeroMapKV, ZeroMap};
6 use databake::*;
7
8 impl<'a, K, V> Bake for ZeroMap<'a, K, V>
9 where
10 K: ZeroMapKV<'a> + ?Sized,
11 V: ZeroMapKV<'a> + ?Sized,
12 K::Container: Bake,
13 V::Container: Bake,
14 {
bake(&self, env: &CrateEnv) -> TokenStream15 fn bake(&self, env: &CrateEnv) -> TokenStream {
16 env.insert("zerovec");
17 let keys = self.keys.bake(env);
18 let values = self.values.bake(env);
19 quote! { unsafe { #[allow(unused_unsafe)] zerovec::ZeroMap::from_parts_unchecked(#keys, #values) } }
20 }
21 }
22
23 impl<'a, K, V> BakeSize for ZeroMap<'a, K, V>
24 where
25 K: ZeroMapKV<'a> + ?Sized,
26 V: ZeroMapKV<'a> + ?Sized,
27 K::Container: BakeSize,
28 V::Container: BakeSize,
29 {
borrows_size(&self) -> usize30 fn borrows_size(&self) -> usize {
31 self.keys.borrows_size() + self.values.borrows_size()
32 }
33 }
34
35 impl<'a, K, V> Bake for ZeroMapBorrowed<'a, K, V>
36 where
37 K: ZeroMapKV<'a> + ?Sized,
38 V: ZeroMapKV<'a> + ?Sized,
39 &'a K::Slice: Bake,
40 &'a V::Slice: Bake,
41 {
bake(&self, env: &CrateEnv) -> TokenStream42 fn bake(&self, env: &CrateEnv) -> TokenStream {
43 env.insert("zerovec");
44 let keys = self.keys.bake(env);
45 let values = self.values.bake(env);
46 quote! { unsafe { #[allow(unused_unsafe)] zerovec::maps::ZeroMapBorrowed::from_parts_unchecked(#keys, #values) } }
47 }
48 }
49
50 impl<'a, K, V> BakeSize for ZeroMapBorrowed<'a, K, V>
51 where
52 K: ZeroMapKV<'a> + ?Sized,
53 V: ZeroMapKV<'a> + ?Sized,
54 &'a K::Slice: BakeSize,
55 &'a V::Slice: BakeSize,
56 {
borrows_size(&self) -> usize57 fn borrows_size(&self) -> usize {
58 self.keys.borrows_size() + self.values.borrows_size()
59 }
60 }
61
62 #[test]
test_baked_map()63 fn test_baked_map() {
64 test_bake!(
65 ZeroMap<str, str>,
66 const,
67 unsafe {
68 #[allow(unused_unsafe)]
69 crate::ZeroMap::from_parts_unchecked(
70 unsafe {
71 crate::vecs::VarZeroVec16::from_bytes_unchecked(
72 b"\x02\0\0\0\0\0\0\0\x02\0\0\0adbc"
73 )
74 },
75 unsafe {
76 crate::vecs::VarZeroVec16::from_bytes_unchecked(
77 b"\x02\0\0\0\0\0\0\0\x04\0\0\0ERA1ERA0"
78 )
79 },
80 )
81 },
82 zerovec
83 );
84 }
85
86 #[test]
test_baked_borrowed_map()87 fn test_baked_borrowed_map() {
88 test_bake!(
89 ZeroMapBorrowed<str, str>,
90 const,
91 unsafe {
92 #[allow(unused_unsafe)]
93 crate::maps::ZeroMapBorrowed::from_parts_unchecked(
94 unsafe {
95 crate::vecs::VarZeroSlice16::from_bytes_unchecked(
96 b"\x02\0\0\0\0\0\0\0\x02\0\0\0adbc"
97 )
98 },
99 unsafe {
100 crate::vecs::VarZeroSlice16::from_bytes_unchecked(
101 b"\x02\0\0\0\0\0\0\0\x04\0\0\0ERA1ERA0"
102 )
103 },
104 )
105 },
106 zerovec
107 );
108 }
109