81 lines
2.5 KiB
Rust
81 lines
2.5 KiB
Rust
// This file is part of ICU4X. For terms of use, please see the file
|
|
// called LICENSE at the top level of the ICU4X source tree
|
|
// (online at: https://github.com/unicode-org/icu4x/blob/main/LICENSE ).
|
|
|
|
use crate::LiteMap;
|
|
use databake::*;
|
|
|
|
/// Bakes a LiteMap into Rust code for fast runtime construction from data. Use this impl during
|
|
/// code generation, such as in a `build.rs` script.
|
|
///
|
|
/// For the most efficient bake, bake the [`LiteMap`] with a slice store. Use functions such as
|
|
/// the following for converting an allocated [`LiteMap`] to a borrowing [`LiteMap`]:
|
|
///
|
|
/// - [`LiteMap::to_borrowed_keys()`]
|
|
/// - [`LiteMap::to_borrowed_values()`]
|
|
/// - [`LiteMap::to_borrowed_keys_values()`]
|
|
/// - [`LiteMap::as_sliced()`]
|
|
///
|
|
/// # Examples
|
|
///
|
|
/// ```
|
|
/// use databake::*;
|
|
/// use litemap::LiteMap;
|
|
///
|
|
/// // Construct the LiteMap fully owned and allocated:
|
|
/// let mut litemap_alloc: LiteMap<usize, String, Vec<_>> = LiteMap::new_vec();
|
|
/// litemap_alloc.insert(1usize, "one".to_string());
|
|
/// litemap_alloc.insert(2usize, "two".to_string());
|
|
/// litemap_alloc.insert(10usize, "ten".to_string());
|
|
///
|
|
/// // Convert to a borrowed type for baking:
|
|
/// let litemap_str: LiteMap<usize, &str, Vec<_>> =
|
|
/// litemap_alloc.to_borrowed_values();
|
|
/// let litemap_slice: LiteMap<usize, &str, &[_]> = litemap_str.as_sliced();
|
|
///
|
|
/// // The bake will now work for const construction:
|
|
/// let mut ctx = Default::default();
|
|
/// println!(
|
|
/// "const FOO: LiteMap<usize, &str, &[(usize, &str)]> = {};",
|
|
/// litemap_slice.bake(&mut ctx)
|
|
/// );
|
|
/// ```
|
|
impl<K, V, S> Bake for LiteMap<K, V, S>
|
|
where
|
|
S: Bake,
|
|
{
|
|
fn bake(&self, env: &CrateEnv) -> TokenStream {
|
|
env.insert("litemap");
|
|
let store = self.values.bake(env);
|
|
quote! { litemap::LiteMap::from_sorted_store_unchecked(#store) }
|
|
}
|
|
}
|
|
|
|
#[test]
|
|
fn test_baked_map() {
|
|
// Const construction:
|
|
test_bake!(
|
|
LiteMap<usize, &str, &[(usize, &str)]>,
|
|
const: crate::LiteMap::from_sorted_store_unchecked(
|
|
&[
|
|
(1usize, "one"),
|
|
(2usize, "two"),
|
|
(10usize, "ten")
|
|
]
|
|
),
|
|
litemap
|
|
);
|
|
// Non-const construction:
|
|
test_bake!(
|
|
LiteMap<usize, String, Vec<(usize, String)>>,
|
|
crate::LiteMap::from_sorted_store_unchecked(
|
|
alloc::vec![
|
|
(1usize, "one".to_owned()),
|
|
(2usize, "two".to_owned()),
|
|
(10usize, "ten".to_owned()),
|
|
]
|
|
),
|
|
litemap
|
|
);
|
|
}
|