use super::*;
use alloc::{collections::BTreeMap, format, vec};
#[derive(Eq, PartialEq, Debug)]
pub struct StupidU32Map<V> {
btm: BTreeMap<u32, V>,
}
impl<V> StupidU32Map<V>
where
V: Eq + Clone,
{
pub fn new() -> StupidU32Map<V> {
StupidU32Map {
btm: BTreeMap::new(),
}
}
pub fn insert<R: RangeBounds<u32>>(&mut self, range: R, value: V) {
let start = match range.start_bound() {
Bound::Unbounded => u32::MIN,
Bound::Included(&t) => t,
Bound::Excluded(&t) => t + 1,
};
let end = match range.end_bound() {
Bound::Unbounded => u32::MAX,
Bound::Included(&t) => t,
Bound::Excluded(&t) => t - 1,
};
for k in start..=end {
self.btm.insert(k, value.clone());
}
}
}
impl<V> From<SegmentMap<u32, V>> for StupidU32Map<V>
where
V: Eq + Clone,
{
fn from(range_map: SegmentMap<u32, V>) -> Self {
let mut stupid = Self::new();
for (range, value) in range_map.iter() {
stupid.insert(range, value.clone());
}
stupid
}
}
#[test]
fn empty_map_is_empty() {
let range_map: SegmentMap<u32, bool> = SegmentMap::new();
assert_eq!(range_map.into_vec(), vec![]);
}
#[test]
fn insert_into_empty_map() {
let mut range_map: SegmentMap<u32, bool> = SegmentMap::new();
range_map.insert(0..50, false);
assert_eq!(range_map.into_vec(), vec![(Segment::from(0..50), false)]);
}
#[test]
fn new_same_value_immediately_following_stored() {
let mut range_map: SegmentMap<u32, bool> = SegmentMap::new();
range_map.insert(1..3, false);
range_map.insert(3..5, false);
assert_eq!(range_map.into_vec(), vec![(Segment::from(1..5), false)]);
}
#[test]
fn new_different_value_immediately_following_stored() {
let mut range_map: SegmentMap<u32, bool> = SegmentMap::new();
range_map.insert(1..3, false);
range_map.insert(3..5, true);
assert_eq!(
range_map.into_vec(),
vec![(Segment::from(1..3), false), (Segment::from(3..5), true)]
);
}
#[test]
fn new_same_value_overlapping_end_of_stored() {
let mut range_map: SegmentMap<u32, bool> = SegmentMap::new();
range_map.insert(1..4, false);
range_map.insert(3..5, false);
assert_eq!(range_map.into_vec(), vec![(Segment::from(1..5), false)]);
}
#[test]
fn new_different_value_overlapping_end_of_stored() {
let mut range_map: SegmentMap<u32, bool> = SegmentMap::new();
range_map.insert(1..4, false);
range_map.insert(3..5, true);
assert_eq!(
range_map.into_vec(),
vec![(Segment::from(1..3), false), (Segment::from(3..5), true)]
);
}
#[test]
fn new_same_value_immediately_preceding_stored() {
let mut range_map: SegmentMap<u32, bool> = SegmentMap::new();
range_map.insert(3..5, false);
range_map.insert(1..3, false);
assert_eq!(range_map.into_vec(), vec![(Segment::from(1..5), false)]);
}
#[test]
fn new_different_value_immediately_preceding_stored() {
let mut range_map: SegmentMap<u32, bool> = SegmentMap::new();
range_map.insert(3..5, true);
range_map.insert(1..3, false);
assert_eq!(
range_map.into_vec(),
vec![(Segment::from(1..3), false), (Segment::from(3..5), true)]
);
}
#[test]
fn new_same_value_wholly_inside_stored() {
let mut range_map: SegmentMap<u32, bool> = SegmentMap::new();
range_map.insert(1..5, false);
range_map.insert(2..4, false);
assert_eq!(range_map.into_vec(), vec![(Segment::from(1..5), false)]);
}
#[test]
fn new_different_value_wholly_inside_stored() {
let mut range_map: SegmentMap<u32, bool> = SegmentMap::new();
range_map.insert(1..5, true);
range_map.insert(2..4, false);
assert_eq!(
range_map.into_vec(),
vec![
(Segment::from(1..2), true),
(Segment::from(2..4), false),
(Segment::from(4..5), true)
]
);
}
#[test]
fn replace_at_end_of_existing_range_should_coalesce() {
let mut range_map: SegmentMap<u32, bool> = SegmentMap::new();
range_map.insert(1..3, false);
range_map.insert(3..5, true);
range_map.insert(3..5, false);
assert_eq!(range_map.into_vec(), vec![(Segment::from(1..5), false)]);
}
#[test]
fn lots_of_interesting_ranges() {
use permutator::Permutation;
let mut ranges_with_values = [
(2..3, false),
(2..3, false),
(2..3, true),
(3..5, true),
(4..6, true),
(5..7, true),
(2..6, true),
];
ranges_with_values.permutation().for_each(|permutation| {
let mut range_map: SegmentMap<u32, bool> = SegmentMap::new();
let mut stupid: StupidU32Map<bool> = StupidU32Map::new();
for (k, v) in permutation {
range_map.insert(k.clone(), v);
stupid.insert(k, v);
let stupid2: StupidU32Map<bool> = range_map.clone().into();
assert_eq!(stupid, stupid2);
}
});
}
#[test]
fn get() {
let mut range_map: SegmentMap<u32, bool> = SegmentMap::new();
range_map.insert(0..50, false);
assert_eq!(range_map.get(&49), Some(&false));
assert_eq!(range_map.get(&50), None);
}
#[test]
fn get_key_value() {
let mut range_map: SegmentMap<u32, bool> = SegmentMap::new();
range_map.insert(0..50, false);
assert_eq!(
range_map.get_range_value(&49),
Some((&Segment::from(0..50), &false))
);
assert_eq!(range_map.get_range_value(&50), None);
}
#[test]
fn remove_from_empty_map() {
let mut range_map: SegmentMap<u32, bool> = SegmentMap::new();
range_map.remove(0..50);
assert_eq!(range_map.into_vec(), vec![]);
}
#[test]
fn remove_non_covered_range_before_stored() {
let mut range_map: SegmentMap<u32, bool> = SegmentMap::new();
range_map.insert(25..75, false);
range_map.remove(0..25);
assert_eq!(range_map.into_vec(), vec![(Segment::from(25..75), false)]);
}
#[test]
fn remove_non_covered_range_after_stored() {
let mut range_map: SegmentMap<u32, bool> = SegmentMap::new();
range_map.insert(25..75, false);
range_map.remove(75..100);
assert_eq!(range_map.into_vec(), vec![(Segment::from(25..75), false)]);
}
#[test]
fn remove_overlapping_start_of_stored() {
let mut range_map: SegmentMap<u32, bool> = SegmentMap::new();
range_map.insert(25..75, false);
range_map.remove(0..30);
assert_eq!(range_map.into_vec(), vec![(Segment::from(30..75), false)]);
}
#[test]
fn remove_middle_of_stored() {
let mut range_map: SegmentMap<u32, bool> = SegmentMap::new();
range_map.insert(25..75, false);
range_map.remove(30..70);
assert_eq!(
range_map.into_vec(),
vec![
(Segment::from(25..30), false),
(Segment::from(70..75), false)
]
);
}
#[test]
fn remove_overlapping_end_of_stored() {
let mut range_map: SegmentMap<u32, bool> = SegmentMap::new();
range_map.insert(25..75, false);
range_map.remove(70..100);
assert_eq!(range_map.into_vec(), vec![(Segment::from(25..70), false)]);
}
#[test]
fn remove_exactly_stored() {
let mut range_map: SegmentMap<u32, bool> = SegmentMap::new();
range_map.insert(25..75, false);
range_map.remove(25..75);
assert_eq!(range_map.into_vec(), vec![]);
}
#[test]
fn remove_superset_of_stored() {
let mut range_map: SegmentMap<u32, bool> = SegmentMap::new();
range_map.insert(25..75, false);
range_map.remove(0..100);
assert_eq!(range_map.into_vec(), vec![]);
}
#[test]
fn map_debug_repr_looks_right() {
let mut map: SegmentMap<u32, ()> = SegmentMap::new();
assert_eq!(format!("{:?}", map), "{}");
map.insert(2..5, ());
assert_eq!(format!("{:?}", map), "{[2, 5): ()}");
map.insert(6..7, ());
map.insert(8..9, ());
assert_eq!(format!("{:?}", map), "{[2, 5): (), [6, 7): (), [8, 9): ()}");
}