1 | use super::{ |
2 | Bucket, Entries, IndexMap, IntoIter, IntoKeys, IntoValues, Iter, IterMut, Keys, Values, |
3 | ValuesMut, |
4 | }; |
5 | use crate::util::try_simplify_range; |
6 | |
7 | use alloc::boxed::Box; |
8 | use alloc::vec::Vec; |
9 | use core::cmp::Ordering; |
10 | use core::fmt; |
11 | use core::hash::{Hash, Hasher}; |
12 | use core::ops::{self, Bound, Index, IndexMut, RangeBounds}; |
13 | |
14 | /// A dynamically-sized slice of key-value pairs in an [`IndexMap`]. |
15 | /// |
16 | /// This supports indexed operations much like a `[(K, V)]` slice, |
17 | /// but not any hashed operations on the map keys. |
18 | /// |
19 | /// Unlike `IndexMap`, `Slice` does consider the order for [`PartialEq`] |
20 | /// and [`Eq`], and it also implements [`PartialOrd`], [`Ord`], and [`Hash`]. |
21 | #[repr (transparent)] |
22 | pub struct Slice<K, V> { |
23 | pub(crate) entries: [Bucket<K, V>], |
24 | } |
25 | |
26 | // SAFETY: `Slice<K, V>` is a transparent wrapper around `[Bucket<K, V>]`, |
27 | // and reference lifetimes are bound together in function signatures. |
28 | #[allow (unsafe_code)] |
29 | impl<K, V> Slice<K, V> { |
30 | pub(super) const fn from_slice(entries: &[Bucket<K, V>]) -> &Self { |
31 | unsafe { &*(entries as *const [Bucket<K, V>] as *const Self) } |
32 | } |
33 | |
34 | pub(super) fn from_mut_slice(entries: &mut [Bucket<K, V>]) -> &mut Self { |
35 | unsafe { &mut *(entries as *mut [Bucket<K, V>] as *mut Self) } |
36 | } |
37 | |
38 | pub(super) fn from_boxed(entries: Box<[Bucket<K, V>]>) -> Box<Self> { |
39 | unsafe { Box::from_raw(Box::into_raw(entries) as *mut Self) } |
40 | } |
41 | |
42 | fn into_boxed(self: Box<Self>) -> Box<[Bucket<K, V>]> { |
43 | unsafe { Box::from_raw(Box::into_raw(self) as *mut [Bucket<K, V>]) } |
44 | } |
45 | } |
46 | |
47 | impl<K, V> Slice<K, V> { |
48 | pub(crate) fn into_entries(self: Box<Self>) -> Vec<Bucket<K, V>> { |
49 | self.into_boxed().into_vec() |
50 | } |
51 | |
52 | /// Returns an empty slice. |
53 | pub const fn new<'a>() -> &'a Self { |
54 | Self::from_slice(&[]) |
55 | } |
56 | |
57 | /// Returns an empty mutable slice. |
58 | pub fn new_mut<'a>() -> &'a mut Self { |
59 | Self::from_mut_slice(&mut []) |
60 | } |
61 | |
62 | /// Return the number of key-value pairs in the map slice. |
63 | #[inline ] |
64 | pub const fn len(&self) -> usize { |
65 | self.entries.len() |
66 | } |
67 | |
68 | /// Returns true if the map slice contains no elements. |
69 | #[inline ] |
70 | pub const fn is_empty(&self) -> bool { |
71 | self.entries.is_empty() |
72 | } |
73 | |
74 | /// Get a key-value pair by index. |
75 | /// |
76 | /// Valid indices are *0 <= index < self.len()* |
77 | pub fn get_index(&self, index: usize) -> Option<(&K, &V)> { |
78 | self.entries.get(index).map(Bucket::refs) |
79 | } |
80 | |
81 | /// Get a key-value pair by index, with mutable access to the value. |
82 | /// |
83 | /// Valid indices are *0 <= index < self.len()* |
84 | pub fn get_index_mut(&mut self, index: usize) -> Option<(&K, &mut V)> { |
85 | self.entries.get_mut(index).map(Bucket::ref_mut) |
86 | } |
87 | |
88 | /// Returns a slice of key-value pairs in the given range of indices. |
89 | /// |
90 | /// Valid indices are *0 <= index < self.len()* |
91 | pub fn get_range<R: RangeBounds<usize>>(&self, range: R) -> Option<&Self> { |
92 | let range = try_simplify_range(range, self.entries.len())?; |
93 | self.entries.get(range).map(Slice::from_slice) |
94 | } |
95 | |
96 | /// Returns a mutable slice of key-value pairs in the given range of indices. |
97 | /// |
98 | /// Valid indices are *0 <= index < self.len()* |
99 | pub fn get_range_mut<R: RangeBounds<usize>>(&mut self, range: R) -> Option<&mut Self> { |
100 | let range = try_simplify_range(range, self.entries.len())?; |
101 | self.entries.get_mut(range).map(Slice::from_mut_slice) |
102 | } |
103 | |
104 | /// Get the first key-value pair. |
105 | pub fn first(&self) -> Option<(&K, &V)> { |
106 | self.entries.first().map(Bucket::refs) |
107 | } |
108 | |
109 | /// Get the first key-value pair, with mutable access to the value. |
110 | pub fn first_mut(&mut self) -> Option<(&K, &mut V)> { |
111 | self.entries.first_mut().map(Bucket::ref_mut) |
112 | } |
113 | |
114 | /// Get the last key-value pair. |
115 | pub fn last(&self) -> Option<(&K, &V)> { |
116 | self.entries.last().map(Bucket::refs) |
117 | } |
118 | |
119 | /// Get the last key-value pair, with mutable access to the value. |
120 | pub fn last_mut(&mut self) -> Option<(&K, &mut V)> { |
121 | self.entries.last_mut().map(Bucket::ref_mut) |
122 | } |
123 | |
124 | /// Divides one slice into two at an index. |
125 | /// |
126 | /// ***Panics*** if `index > len`. |
127 | pub fn split_at(&self, index: usize) -> (&Self, &Self) { |
128 | let (first, second) = self.entries.split_at(index); |
129 | (Self::from_slice(first), Self::from_slice(second)) |
130 | } |
131 | |
132 | /// Divides one mutable slice into two at an index. |
133 | /// |
134 | /// ***Panics*** if `index > len`. |
135 | pub fn split_at_mut(&mut self, index: usize) -> (&mut Self, &mut Self) { |
136 | let (first, second) = self.entries.split_at_mut(index); |
137 | (Self::from_mut_slice(first), Self::from_mut_slice(second)) |
138 | } |
139 | |
140 | /// Returns the first key-value pair and the rest of the slice, |
141 | /// or `None` if it is empty. |
142 | pub fn split_first(&self) -> Option<((&K, &V), &Self)> { |
143 | if let [first, rest @ ..] = &self.entries { |
144 | Some((first.refs(), Self::from_slice(rest))) |
145 | } else { |
146 | None |
147 | } |
148 | } |
149 | |
150 | /// Returns the first key-value pair and the rest of the slice, |
151 | /// with mutable access to the value, or `None` if it is empty. |
152 | pub fn split_first_mut(&mut self) -> Option<((&K, &mut V), &mut Self)> { |
153 | if let [first, rest @ ..] = &mut self.entries { |
154 | Some((first.ref_mut(), Self::from_mut_slice(rest))) |
155 | } else { |
156 | None |
157 | } |
158 | } |
159 | |
160 | /// Returns the last key-value pair and the rest of the slice, |
161 | /// or `None` if it is empty. |
162 | pub fn split_last(&self) -> Option<((&K, &V), &Self)> { |
163 | if let [rest @ .., last] = &self.entries { |
164 | Some((last.refs(), Self::from_slice(rest))) |
165 | } else { |
166 | None |
167 | } |
168 | } |
169 | |
170 | /// Returns the last key-value pair and the rest of the slice, |
171 | /// with mutable access to the value, or `None` if it is empty. |
172 | pub fn split_last_mut(&mut self) -> Option<((&K, &mut V), &mut Self)> { |
173 | if let [rest @ .., last] = &mut self.entries { |
174 | Some((last.ref_mut(), Self::from_mut_slice(rest))) |
175 | } else { |
176 | None |
177 | } |
178 | } |
179 | |
180 | /// Return an iterator over the key-value pairs of the map slice. |
181 | pub fn iter(&self) -> Iter<'_, K, V> { |
182 | Iter::new(&self.entries) |
183 | } |
184 | |
185 | /// Return an iterator over the key-value pairs of the map slice. |
186 | pub fn iter_mut(&mut self) -> IterMut<'_, K, V> { |
187 | IterMut::new(&mut self.entries) |
188 | } |
189 | |
190 | /// Return an iterator over the keys of the map slice. |
191 | pub fn keys(&self) -> Keys<'_, K, V> { |
192 | Keys::new(&self.entries) |
193 | } |
194 | |
195 | /// Return an owning iterator over the keys of the map slice. |
196 | pub fn into_keys(self: Box<Self>) -> IntoKeys<K, V> { |
197 | IntoKeys::new(self.into_entries()) |
198 | } |
199 | |
200 | /// Return an iterator over the values of the map slice. |
201 | pub fn values(&self) -> Values<'_, K, V> { |
202 | Values::new(&self.entries) |
203 | } |
204 | |
205 | /// Return an iterator over mutable references to the the values of the map slice. |
206 | pub fn values_mut(&mut self) -> ValuesMut<'_, K, V> { |
207 | ValuesMut::new(&mut self.entries) |
208 | } |
209 | |
210 | /// Return an owning iterator over the values of the map slice. |
211 | pub fn into_values(self: Box<Self>) -> IntoValues<K, V> { |
212 | IntoValues::new(self.into_entries()) |
213 | } |
214 | |
215 | /// Search over a sorted map for a key. |
216 | /// |
217 | /// Returns the position where that key is present, or the position where it can be inserted to |
218 | /// maintain the sort. See [`slice::binary_search`] for more details. |
219 | /// |
220 | /// Computes in **O(log(n))** time, which is notably less scalable than looking the key up in |
221 | /// the map this is a slice from using [`IndexMap::get_index_of`], but this can also position |
222 | /// missing keys. |
223 | pub fn binary_search_keys(&self, x: &K) -> Result<usize, usize> |
224 | where |
225 | K: Ord, |
226 | { |
227 | self.binary_search_by(|p, _| p.cmp(x)) |
228 | } |
229 | |
230 | /// Search over a sorted map with a comparator function. |
231 | /// |
232 | /// Returns the position where that value is present, or the position where it can be inserted |
233 | /// to maintain the sort. See [`slice::binary_search_by`] for more details. |
234 | /// |
235 | /// Computes in **O(log(n))** time. |
236 | #[inline ] |
237 | pub fn binary_search_by<'a, F>(&'a self, mut f: F) -> Result<usize, usize> |
238 | where |
239 | F: FnMut(&'a K, &'a V) -> Ordering, |
240 | { |
241 | self.entries.binary_search_by(move |a| f(&a.key, &a.value)) |
242 | } |
243 | |
244 | /// Search over a sorted map with an extraction function. |
245 | /// |
246 | /// Returns the position where that value is present, or the position where it can be inserted |
247 | /// to maintain the sort. See [`slice::binary_search_by_key`] for more details. |
248 | /// |
249 | /// Computes in **O(log(n))** time. |
250 | #[inline ] |
251 | pub fn binary_search_by_key<'a, B, F>(&'a self, b: &B, mut f: F) -> Result<usize, usize> |
252 | where |
253 | F: FnMut(&'a K, &'a V) -> B, |
254 | B: Ord, |
255 | { |
256 | self.binary_search_by(|k, v| f(k, v).cmp(b)) |
257 | } |
258 | |
259 | /// Returns the index of the partition point of a sorted map according to the given predicate |
260 | /// (the index of the first element of the second partition). |
261 | /// |
262 | /// See [`slice::partition_point`] for more details. |
263 | /// |
264 | /// Computes in **O(log(n))** time. |
265 | #[must_use ] |
266 | pub fn partition_point<P>(&self, mut pred: P) -> usize |
267 | where |
268 | P: FnMut(&K, &V) -> bool, |
269 | { |
270 | self.entries |
271 | .partition_point(move |a| pred(&a.key, &a.value)) |
272 | } |
273 | } |
274 | |
275 | impl<'a, K, V> IntoIterator for &'a Slice<K, V> { |
276 | type IntoIter = Iter<'a, K, V>; |
277 | type Item = (&'a K, &'a V); |
278 | |
279 | fn into_iter(self) -> Self::IntoIter { |
280 | self.iter() |
281 | } |
282 | } |
283 | |
284 | impl<'a, K, V> IntoIterator for &'a mut Slice<K, V> { |
285 | type IntoIter = IterMut<'a, K, V>; |
286 | type Item = (&'a K, &'a mut V); |
287 | |
288 | fn into_iter(self) -> Self::IntoIter { |
289 | self.iter_mut() |
290 | } |
291 | } |
292 | |
293 | impl<K, V> IntoIterator for Box<Slice<K, V>> { |
294 | type IntoIter = IntoIter<K, V>; |
295 | type Item = (K, V); |
296 | |
297 | fn into_iter(self) -> Self::IntoIter { |
298 | IntoIter::new(self.into_entries()) |
299 | } |
300 | } |
301 | |
302 | impl<K, V> Default for &'_ Slice<K, V> { |
303 | fn default() -> Self { |
304 | Slice::from_slice(&[]) |
305 | } |
306 | } |
307 | |
308 | impl<K, V> Default for &'_ mut Slice<K, V> { |
309 | fn default() -> Self { |
310 | Slice::from_mut_slice(&mut []) |
311 | } |
312 | } |
313 | |
314 | impl<K, V> Default for Box<Slice<K, V>> { |
315 | fn default() -> Self { |
316 | Slice::from_boxed(entries:Box::default()) |
317 | } |
318 | } |
319 | |
320 | impl<K: Clone, V: Clone> Clone for Box<Slice<K, V>> { |
321 | fn clone(&self) -> Self { |
322 | Slice::from_boxed(self.entries.to_vec().into_boxed_slice()) |
323 | } |
324 | } |
325 | |
326 | impl<K: Copy, V: Copy> From<&Slice<K, V>> for Box<Slice<K, V>> { |
327 | fn from(slice: &Slice<K, V>) -> Self { |
328 | Slice::from_boxed(entries:Box::from(&slice.entries)) |
329 | } |
330 | } |
331 | |
332 | impl<K: fmt::Debug, V: fmt::Debug> fmt::Debug for Slice<K, V> { |
333 | fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { |
334 | f.debug_list().entries(self).finish() |
335 | } |
336 | } |
337 | |
338 | impl<K: PartialEq, V: PartialEq> PartialEq for Slice<K, V> { |
339 | fn eq(&self, other: &Self) -> bool { |
340 | self.len() == other.len() && self.iter().eq(other) |
341 | } |
342 | } |
343 | |
344 | impl<K: Eq, V: Eq> Eq for Slice<K, V> {} |
345 | |
346 | impl<K: PartialOrd, V: PartialOrd> PartialOrd for Slice<K, V> { |
347 | fn partial_cmp(&self, other: &Self) -> Option<Ordering> { |
348 | self.iter().partial_cmp(other) |
349 | } |
350 | } |
351 | |
352 | impl<K: Ord, V: Ord> Ord for Slice<K, V> { |
353 | fn cmp(&self, other: &Self) -> Ordering { |
354 | self.iter().cmp(other) |
355 | } |
356 | } |
357 | |
358 | impl<K: Hash, V: Hash> Hash for Slice<K, V> { |
359 | fn hash<H: Hasher>(&self, state: &mut H) { |
360 | self.len().hash(state); |
361 | for (key: &K, value: &V) in self { |
362 | key.hash(state); |
363 | value.hash(state); |
364 | } |
365 | } |
366 | } |
367 | |
368 | impl<K, V> Index<usize> for Slice<K, V> { |
369 | type Output = V; |
370 | |
371 | fn index(&self, index: usize) -> &V { |
372 | &self.entries[index].value |
373 | } |
374 | } |
375 | |
376 | impl<K, V> IndexMut<usize> for Slice<K, V> { |
377 | fn index_mut(&mut self, index: usize) -> &mut V { |
378 | &mut self.entries[index].value |
379 | } |
380 | } |
381 | |
382 | // We can't have `impl<I: RangeBounds<usize>> Index<I>` because that conflicts |
383 | // both upstream with `Index<usize>` and downstream with `Index<&Q>`. |
384 | // Instead, we repeat the implementations for all the core range types. |
385 | macro_rules! impl_index { |
386 | ($($range:ty),*) => {$( |
387 | impl<K, V, S> Index<$range> for IndexMap<K, V, S> { |
388 | type Output = Slice<K, V>; |
389 | |
390 | fn index(&self, range: $range) -> &Self::Output { |
391 | Slice::from_slice(&self.as_entries()[range]) |
392 | } |
393 | } |
394 | |
395 | impl<K, V, S> IndexMut<$range> for IndexMap<K, V, S> { |
396 | fn index_mut(&mut self, range: $range) -> &mut Self::Output { |
397 | Slice::from_mut_slice(&mut self.as_entries_mut()[range]) |
398 | } |
399 | } |
400 | |
401 | impl<K, V> Index<$range> for Slice<K, V> { |
402 | type Output = Slice<K, V>; |
403 | |
404 | fn index(&self, range: $range) -> &Self { |
405 | Self::from_slice(&self.entries[range]) |
406 | } |
407 | } |
408 | |
409 | impl<K, V> IndexMut<$range> for Slice<K, V> { |
410 | fn index_mut(&mut self, range: $range) -> &mut Self { |
411 | Self::from_mut_slice(&mut self.entries[range]) |
412 | } |
413 | } |
414 | )*} |
415 | } |
416 | impl_index!( |
417 | ops::Range<usize>, |
418 | ops::RangeFrom<usize>, |
419 | ops::RangeFull, |
420 | ops::RangeInclusive<usize>, |
421 | ops::RangeTo<usize>, |
422 | ops::RangeToInclusive<usize>, |
423 | (Bound<usize>, Bound<usize>) |
424 | ); |
425 | |
426 | #[cfg (test)] |
427 | mod tests { |
428 | use super::*; |
429 | use alloc::vec::Vec; |
430 | |
431 | #[test ] |
432 | fn slice_index() { |
433 | fn check( |
434 | vec_slice: &[(i32, i32)], |
435 | map_slice: &Slice<i32, i32>, |
436 | sub_slice: &Slice<i32, i32>, |
437 | ) { |
438 | assert_eq!(map_slice as *const _, sub_slice as *const _); |
439 | itertools::assert_equal( |
440 | vec_slice.iter().copied(), |
441 | map_slice.iter().map(|(&k, &v)| (k, v)), |
442 | ); |
443 | itertools::assert_equal(vec_slice.iter().map(|(k, _)| k), map_slice.keys()); |
444 | itertools::assert_equal(vec_slice.iter().map(|(_, v)| v), map_slice.values()); |
445 | } |
446 | |
447 | let vec: Vec<(i32, i32)> = (0..10).map(|i| (i, i * i)).collect(); |
448 | let map: IndexMap<i32, i32> = vec.iter().cloned().collect(); |
449 | let slice = map.as_slice(); |
450 | |
451 | // RangeFull |
452 | check(&vec[..], &map[..], &slice[..]); |
453 | |
454 | for i in 0usize..10 { |
455 | // Index |
456 | assert_eq!(vec[i].1, map[i]); |
457 | assert_eq!(vec[i].1, slice[i]); |
458 | assert_eq!(map[&(i as i32)], map[i]); |
459 | assert_eq!(map[&(i as i32)], slice[i]); |
460 | |
461 | // RangeFrom |
462 | check(&vec[i..], &map[i..], &slice[i..]); |
463 | |
464 | // RangeTo |
465 | check(&vec[..i], &map[..i], &slice[..i]); |
466 | |
467 | // RangeToInclusive |
468 | check(&vec[..=i], &map[..=i], &slice[..=i]); |
469 | |
470 | // (Bound<usize>, Bound<usize>) |
471 | let bounds = (Bound::Excluded(i), Bound::Unbounded); |
472 | check(&vec[i + 1..], &map[bounds], &slice[bounds]); |
473 | |
474 | for j in i..=10 { |
475 | // Range |
476 | check(&vec[i..j], &map[i..j], &slice[i..j]); |
477 | } |
478 | |
479 | for j in i..10 { |
480 | // RangeInclusive |
481 | check(&vec[i..=j], &map[i..=j], &slice[i..=j]); |
482 | } |
483 | } |
484 | } |
485 | |
486 | #[test ] |
487 | fn slice_index_mut() { |
488 | fn check_mut( |
489 | vec_slice: &[(i32, i32)], |
490 | map_slice: &mut Slice<i32, i32>, |
491 | sub_slice: &mut Slice<i32, i32>, |
492 | ) { |
493 | assert_eq!(map_slice, sub_slice); |
494 | itertools::assert_equal( |
495 | vec_slice.iter().copied(), |
496 | map_slice.iter_mut().map(|(&k, &mut v)| (k, v)), |
497 | ); |
498 | itertools::assert_equal( |
499 | vec_slice.iter().map(|&(_, v)| v), |
500 | map_slice.values_mut().map(|&mut v| v), |
501 | ); |
502 | } |
503 | |
504 | let vec: Vec<(i32, i32)> = (0..10).map(|i| (i, i * i)).collect(); |
505 | let mut map: IndexMap<i32, i32> = vec.iter().cloned().collect(); |
506 | let mut map2 = map.clone(); |
507 | let slice = map2.as_mut_slice(); |
508 | |
509 | // RangeFull |
510 | check_mut(&vec[..], &mut map[..], &mut slice[..]); |
511 | |
512 | for i in 0usize..10 { |
513 | // IndexMut |
514 | assert_eq!(&mut map[i], &mut slice[i]); |
515 | |
516 | // RangeFrom |
517 | check_mut(&vec[i..], &mut map[i..], &mut slice[i..]); |
518 | |
519 | // RangeTo |
520 | check_mut(&vec[..i], &mut map[..i], &mut slice[..i]); |
521 | |
522 | // RangeToInclusive |
523 | check_mut(&vec[..=i], &mut map[..=i], &mut slice[..=i]); |
524 | |
525 | // (Bound<usize>, Bound<usize>) |
526 | let bounds = (Bound::Excluded(i), Bound::Unbounded); |
527 | check_mut(&vec[i + 1..], &mut map[bounds], &mut slice[bounds]); |
528 | |
529 | for j in i..=10 { |
530 | // Range |
531 | check_mut(&vec[i..j], &mut map[i..j], &mut slice[i..j]); |
532 | } |
533 | |
534 | for j in i..10 { |
535 | // RangeInclusive |
536 | check_mut(&vec[i..=j], &mut map[i..=j], &mut slice[i..=j]); |
537 | } |
538 | } |
539 | } |
540 | } |
541 | |