use super::OrderMap;
use core::ops::{self, Bound, Index, IndexMut};
use indexmap::map::Slice;
macro_rules! impl_index {
($($range:ty),*) => {$(
impl<K, V, S> Index<$range> for OrderMap<K, V, S> {
type Output = Slice<K, V>;
fn index(&self, range: $range) -> &Self::Output {
&self.inner[range]
}
}
impl<K, V, S> IndexMut<$range> for OrderMap<K, V, S> {
fn index_mut(&mut self, range: $range) -> &mut Self::Output {
&mut self.inner[range]
}
}
)*}
}
impl_index!(
ops::Range<usize>,
ops::RangeFrom<usize>,
ops::RangeFull,
ops::RangeInclusive<usize>,
ops::RangeTo<usize>,
ops::RangeToInclusive<usize>,
(Bound<usize>, Bound<usize>)
);
#[cfg(test)]
mod tests {
use super::*;
use alloc::vec::Vec;
#[test]
fn slice_index() {
fn check(
vec_slice: &[(i32, i32)],
map_slice: &Slice<i32, i32>,
sub_slice: &Slice<i32, i32>,
) {
assert_eq!(map_slice as *const _, sub_slice as *const _);
itertools::assert_equal(
vec_slice.iter().copied(),
map_slice.iter().map(|(&k, &v)| (k, v)),
);
itertools::assert_equal(vec_slice.iter().map(|(k, _)| k), map_slice.keys());
itertools::assert_equal(vec_slice.iter().map(|(_, v)| v), map_slice.values());
}
let vec: Vec<(i32, i32)> = (0..10).map(|i| (i, i * i)).collect();
let map: OrderMap<i32, i32> = vec.iter().cloned().collect();
let slice = map.as_slice();
check(&vec[..], &map[..], &slice[..]);
for i in 0usize..10 {
assert_eq!(vec[i].1, map[i]);
assert_eq!(vec[i].1, slice[i]);
assert_eq!(map[&(i as i32)], map[i]);
assert_eq!(map[&(i as i32)], slice[i]);
check(&vec[i..], &map[i..], &slice[i..]);
check(&vec[..i], &map[..i], &slice[..i]);
check(&vec[..=i], &map[..=i], &slice[..=i]);
let bounds = (Bound::Excluded(i), Bound::Unbounded);
check(&vec[i + 1..], &map[bounds], &slice[bounds]);
for j in i..=10 {
check(&vec[i..j], &map[i..j], &slice[i..j]);
}
for j in i..10 {
check(&vec[i..=j], &map[i..=j], &slice[i..=j]);
}
}
}
#[test]
fn slice_index_mut() {
fn check_mut(
vec_slice: &[(i32, i32)],
map_slice: &mut Slice<i32, i32>,
sub_slice: &mut Slice<i32, i32>,
) {
assert_eq!(map_slice, sub_slice);
itertools::assert_equal(
vec_slice.iter().copied(),
map_slice.iter_mut().map(|(&k, &mut v)| (k, v)),
);
itertools::assert_equal(
vec_slice.iter().map(|&(_, v)| v),
map_slice.values_mut().map(|&mut v| v),
);
}
let vec: Vec<(i32, i32)> = (0..10).map(|i| (i, i * i)).collect();
let mut map: OrderMap<i32, i32> = vec.iter().cloned().collect();
let mut map2 = map.clone();
let slice = map2.as_mut_slice();
check_mut(&vec[..], &mut map[..], &mut slice[..]);
for i in 0usize..10 {
assert_eq!(&mut map[i], &mut slice[i]);
check_mut(&vec[i..], &mut map[i..], &mut slice[i..]);
check_mut(&vec[..i], &mut map[..i], &mut slice[..i]);
check_mut(&vec[..=i], &mut map[..=i], &mut slice[..=i]);
let bounds = (Bound::Excluded(i), Bound::Unbounded);
check_mut(&vec[i + 1..], &mut map[bounds], &mut slice[bounds]);
for j in i..=10 {
check_mut(&vec[i..j], &mut map[i..j], &mut slice[i..j]);
}
for j in i..10 {
check_mut(&vec[i..=j], &mut map[i..=j], &mut slice[i..=j]);
}
}
}
}