|
1 | 1 | use super::{Bucket, Entries, IndexMap, Iter, IterMut, Keys, Values, ValuesMut};
|
| 2 | +use crate::util::simplify_range; |
2 | 3 |
|
3 | 4 | use core::cmp::Ordering;
|
4 | 5 | use core::fmt;
|
5 | 6 | use core::hash::{Hash, Hasher};
|
6 |
| -use core::ops::{self, Index, IndexMut}; |
| 7 | +use core::ops::{self, Bound, Index, IndexMut}; |
7 | 8 |
|
8 | 9 | /// A dynamically-sized slice of key-value pairs in an `IndexMap`.
|
9 | 10 | ///
|
@@ -317,3 +318,41 @@ impl_index!(
|
317 | 318 | ops::RangeTo<usize>,
|
318 | 319 | ops::RangeToInclusive<usize>
|
319 | 320 | );
|
| 321 | + |
| 322 | +// NB: with MSRV 1.53, we can forward `Bound` pairs to direct slice indexing like other ranges |
| 323 | + |
| 324 | +impl<K, V, S> Index<(Bound<usize>, Bound<usize>)> for IndexMap<K, V, S> { |
| 325 | + type Output = Slice<K, V>; |
| 326 | + |
| 327 | + fn index(&self, range: (Bound<usize>, Bound<usize>)) -> &Self::Output { |
| 328 | + let entries = self.as_entries(); |
| 329 | + let range = simplify_range(range, entries.len()); |
| 330 | + Slice::from_slice(&entries[range]) |
| 331 | + } |
| 332 | +} |
| 333 | + |
| 334 | +impl<K, V, S> IndexMut<(Bound<usize>, Bound<usize>)> for IndexMap<K, V, S> { |
| 335 | + fn index_mut(&mut self, range: (Bound<usize>, Bound<usize>)) -> &mut Self::Output { |
| 336 | + let entries = self.as_entries_mut(); |
| 337 | + let range = simplify_range(range, entries.len()); |
| 338 | + Slice::from_mut_slice(&mut entries[range]) |
| 339 | + } |
| 340 | +} |
| 341 | + |
| 342 | +impl<K, V> Index<(Bound<usize>, Bound<usize>)> for Slice<K, V> { |
| 343 | + type Output = Slice<K, V>; |
| 344 | + |
| 345 | + fn index(&self, range: (Bound<usize>, Bound<usize>)) -> &Self { |
| 346 | + let entries = &self.entries; |
| 347 | + let range = simplify_range(range, entries.len()); |
| 348 | + Slice::from_slice(&entries[range]) |
| 349 | + } |
| 350 | +} |
| 351 | + |
| 352 | +impl<K, V> IndexMut<(Bound<usize>, Bound<usize>)> for Slice<K, V> { |
| 353 | + fn index_mut(&mut self, range: (Bound<usize>, Bound<usize>)) -> &mut Self { |
| 354 | + let entries = &mut self.entries; |
| 355 | + let range = simplify_range(range, entries.len()); |
| 356 | + Slice::from_mut_slice(&mut entries[range]) |
| 357 | + } |
| 358 | +} |
0 commit comments