• 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 //! Impls for functions gated on the "litemap" feature.
6 
7 use super::konst::*;
8 use crate::builder::bytestr::ByteStr;
9 use crate::error::ZeroTrieBuildError;
10 use crate::zerotrie::ZeroTrieSimpleAscii;
11 use crate::ZeroTrie;
12 use alloc::borrow::Borrow;
13 use alloc::vec::Vec;
14 use litemap::LiteMap;
15 
16 impl ZeroTrieSimpleAscii<Vec<u8>> {
17     #[doc(hidden)]
try_from_litemap_with_const_builder<'a, S>( items: &LiteMap<&'a [u8], usize, S>, ) -> Result<Self, ZeroTrieBuildError> where S: litemap::store::StoreSlice<&'a [u8], usize, Slice = [(&'a [u8], usize)]>,18     pub fn try_from_litemap_with_const_builder<'a, S>(
19         items: &LiteMap<&'a [u8], usize, S>,
20     ) -> Result<Self, ZeroTrieBuildError>
21     where
22         S: litemap::store::StoreSlice<&'a [u8], usize, Slice = [(&'a [u8], usize)]>,
23     {
24         let tuples = items.as_slice();
25         let byte_str_slice = ByteStr::from_byte_slice_with_value(tuples);
26         ZeroTrieBuilderConst::<10000>::from_sorted_const_tuple_slice::<100>(byte_str_slice.into())
27             .map(|s| Self {
28                 store: s.as_bytes().to_vec(),
29             })
30     }
31 }
32 
33 impl<K, S> TryFrom<&LiteMap<K, usize, S>> for ZeroTrie<Vec<u8>>
34 where
35     // Borrow, not AsRef, because we rely on Ord being the same. Unfortunately
36     // this means `LiteMap<&str, usize>` does not work.
37     K: Borrow<[u8]>,
38     S: litemap::store::StoreSlice<K, usize, Slice = [(K, usize)]>,
39 {
40     type Error = ZeroTrieBuildError;
try_from(items: &LiteMap<K, usize, S>) -> Result<Self, ZeroTrieBuildError>41     fn try_from(items: &LiteMap<K, usize, S>) -> Result<Self, ZeroTrieBuildError> {
42         let byte_litemap = items.to_borrowed_keys::<[u8], Vec<_>>();
43         let byte_slice = byte_litemap.as_slice();
44         let byte_str_slice = ByteStr::from_byte_slice_with_value(byte_slice);
45         Self::try_from_tuple_slice(byte_str_slice)
46     }
47 }
48 
49 /// TODO(MSRV 1.83): Make this more infallible by calculating the required length,
50 /// heap-allocating the required capacity, and pointing ConstAsciiTrieBuilderStore
51 /// to the heap buffer.
52 /// ```ignore
53 /// const fn write_to_mut_buffer(buf: &mut [u8]) { buf[0] = 0; }
54 /// ```
55 const _: () = ();
56