zerovec/map/
databake.rs

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
5use crate::{maps::ZeroMapBorrowed, maps::ZeroMapKV, ZeroMap};
6use databake::*;
7
8impl<'a, K, V> Bake for ZeroMap<'a, K, V>
9where
10    K: ZeroMapKV<'a> + ?Sized,
11    V: ZeroMapKV<'a> + ?Sized,
12    K::Container: Bake,
13    V::Container: Bake,
14{
15    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
23impl<'a, K, V> BakeSize for ZeroMap<'a, K, V>
24where
25    K: ZeroMapKV<'a> + ?Sized,
26    V: ZeroMapKV<'a> + ?Sized,
27    K::Container: BakeSize,
28    V::Container: BakeSize,
29{
30    fn borrows_size(&self) -> usize {
31        self.keys.borrows_size() + self.values.borrows_size()
32    }
33}
34
35impl<'a, K, V> Bake for ZeroMapBorrowed<'a, K, V>
36where
37    K: ZeroMapKV<'a> + ?Sized,
38    V: ZeroMapKV<'a> + ?Sized,
39    &'a K::Slice: Bake,
40    &'a V::Slice: Bake,
41{
42    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
50impl<'a, K, V> BakeSize for ZeroMapBorrowed<'a, K, V>
51where
52    K: ZeroMapKV<'a> + ?Sized,
53    V: ZeroMapKV<'a> + ?Sized,
54    &'a K::Slice: BakeSize,
55    &'a V::Slice: BakeSize,
56{
57    fn borrows_size(&self) -> usize {
58        self.keys.borrows_size() + self.values.borrows_size()
59    }
60}
61
62#[test]
63fn 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]
87fn 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}