• 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 super::*;
6 use alloc::vec::Vec;
7 
8 type MapF<K, V> = fn(&(K, V)) -> (&K, &V);
9 
10 #[inline]
map_f<K, V>(input: &(K, V)) -> (&K, &V)11 fn map_f<K, V>(input: &(K, V)) -> (&K, &V) {
12     (&input.0, &input.1)
13 }
14 
15 type MapFMut<K, V> = fn(&mut (K, V)) -> (&K, &mut V);
16 
17 #[inline]
map_f_mut<K, V>(input: &mut (K, V)) -> (&K, &mut V)18 fn map_f_mut<K, V>(input: &mut (K, V)) -> (&K, &mut V) {
19     (&input.0, &mut input.1)
20 }
21 
22 impl<K, V> StoreConstEmpty<K, V> for Vec<(K, V)> {
23     const EMPTY: Vec<(K, V)> = Vec::new();
24 }
25 
26 impl<K, V> Store<K, V> for Vec<(K, V)> {
27     #[inline]
lm_len(&self) -> usize28     fn lm_len(&self) -> usize {
29         self.as_slice().len()
30     }
31 
32     #[inline]
lm_is_empty(&self) -> bool33     fn lm_is_empty(&self) -> bool {
34         self.as_slice().is_empty()
35     }
36 
37     #[inline]
lm_get(&self, index: usize) -> Option<(&K, &V)>38     fn lm_get(&self, index: usize) -> Option<(&K, &V)> {
39         self.as_slice().get(index).map(map_f)
40     }
41 
42     #[inline]
lm_last(&self) -> Option<(&K, &V)>43     fn lm_last(&self) -> Option<(&K, &V)> {
44         self.as_slice().last().map(map_f)
45     }
46 
47     #[inline]
lm_binary_search_by<F>(&self, mut cmp: F) -> Result<usize, usize> where F: FnMut(&K) -> Ordering,48     fn lm_binary_search_by<F>(&self, mut cmp: F) -> Result<usize, usize>
49     where
50         F: FnMut(&K) -> Ordering,
51     {
52         self.as_slice().binary_search_by(|(k, _)| cmp(k))
53     }
54 }
55 
56 impl<K, V> StoreSlice<K, V> for Vec<(K, V)> {
57     type Slice = [(K, V)];
58 
lm_get_range(&self, range: Range<usize>) -> Option<&Self::Slice>59     fn lm_get_range(&self, range: Range<usize>) -> Option<&Self::Slice> {
60         self.get(range)
61     }
62 }
63 
64 impl<K, V> StoreMut<K, V> for Vec<(K, V)> {
65     #[inline]
lm_with_capacity(capacity: usize) -> Self66     fn lm_with_capacity(capacity: usize) -> Self {
67         Self::with_capacity(capacity)
68     }
69 
70     #[inline]
lm_reserve(&mut self, additional: usize)71     fn lm_reserve(&mut self, additional: usize) {
72         self.reserve(additional)
73     }
74 
75     #[inline]
lm_get_mut(&mut self, index: usize) -> Option<(&K, &mut V)>76     fn lm_get_mut(&mut self, index: usize) -> Option<(&K, &mut V)> {
77         self.as_mut_slice().get_mut(index).map(map_f_mut)
78     }
79 
80     #[inline]
lm_push(&mut self, key: K, value: V)81     fn lm_push(&mut self, key: K, value: V) {
82         self.push((key, value))
83     }
84 
85     #[inline]
lm_insert(&mut self, index: usize, key: K, value: V)86     fn lm_insert(&mut self, index: usize, key: K, value: V) {
87         self.insert(index, (key, value))
88     }
89 
90     #[inline]
lm_remove(&mut self, index: usize) -> (K, V)91     fn lm_remove(&mut self, index: usize) -> (K, V) {
92         self.remove(index)
93     }
94 
95     #[inline]
lm_clear(&mut self)96     fn lm_clear(&mut self) {
97         self.clear()
98     }
99 
100     #[inline]
lm_retain<F>(&mut self, mut predicate: F) where F: FnMut(&K, &V) -> bool,101     fn lm_retain<F>(&mut self, mut predicate: F)
102     where
103         F: FnMut(&K, &V) -> bool,
104     {
105         self.retain(|(k, v)| predicate(k, v))
106     }
107 }
108 
109 impl<K: Ord, V> StoreFromIterable<K, V> for Vec<(K, V)> {
lm_sort_from_iter<I: IntoIterator<Item = (K, V)>>(iter: I) -> Self110     fn lm_sort_from_iter<I: IntoIterator<Item = (K, V)>>(iter: I) -> Self {
111         let iter = iter.into_iter();
112         let mut container = match iter.size_hint() {
113             (_, Some(upper)) => Self::with_capacity(upper),
114             (lower, None) => Self::with_capacity(lower),
115         };
116 
117         for (key, value) in iter {
118             if let Some(last) = container.lm_last() {
119                 if last.0 >= &key {
120                     match container.lm_binary_search_by(|k| k.cmp(&key)) {
121                         #[allow(clippy::unwrap_used)] // Index came from binary_search
122                         Ok(found) => {
123                             let _ =
124                                 core::mem::replace(container.lm_get_mut(found).unwrap().1, value);
125                         }
126                         Err(ins) => {
127                             container.insert(ins, (key, value));
128                         }
129                     }
130                 } else {
131                     container.push((key, value))
132                 }
133             } else {
134                 container.push((key, value))
135             }
136         }
137 
138         container
139     }
140 }
141 
142 impl<'a, K: 'a, V: 'a> StoreIterable<'a, K, V> for Vec<(K, V)> {
143     type KeyValueIter = core::iter::Map<core::slice::Iter<'a, (K, V)>, MapF<K, V>>;
144 
145     #[inline]
lm_iter(&'a self) -> Self::KeyValueIter146     fn lm_iter(&'a self) -> Self::KeyValueIter {
147         self.as_slice().iter().map(map_f)
148     }
149 }
150 
151 impl<'a, K: 'a, V: 'a> StoreIterableMut<'a, K, V> for Vec<(K, V)> {
152     type KeyValueIterMut = core::iter::Map<core::slice::IterMut<'a, (K, V)>, MapFMut<K, V>>;
153 
154     #[inline]
lm_iter_mut(&'a mut self) -> Self::KeyValueIterMut155     fn lm_iter_mut(&'a mut self) -> Self::KeyValueIterMut {
156         self.as_mut_slice().iter_mut().map(map_f_mut)
157     }
158 }
159 
160 impl<K, V> StoreIntoIterator<K, V> for Vec<(K, V)> {
161     type KeyValueIntoIter = alloc::vec::IntoIter<(K, V)>;
162 
163     #[inline]
lm_into_iter(self) -> Self::KeyValueIntoIter164     fn lm_into_iter(self) -> Self::KeyValueIntoIter {
165         IntoIterator::into_iter(self)
166     }
167 
168     #[inline]
lm_extend_end(&mut self, other: Self)169     fn lm_extend_end(&mut self, other: Self) {
170         self.extend(other)
171     }
172 
173     #[inline]
lm_extend_start(&mut self, other: Self)174     fn lm_extend_start(&mut self, other: Self) {
175         self.splice(0..0, other);
176     }
177 }
178 
179 impl<K, V> StoreFromIterator<K, V> for Vec<(K, V)> {}
180 
181 #[test]
test_vec_impl()182 fn test_vec_impl() {
183     crate::testing::check_store_full::<Vec<(u32, u64)>>();
184 }
185