• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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