Skip to content

Commit

Permalink
Factor Mappings a bit better
Browse files Browse the repository at this point in the history
  • Loading branch information
saethlin committed Sep 25, 2022
1 parent e018c79 commit a9111f5
Showing 1 changed file with 15 additions and 36 deletions.
51 changes: 15 additions & 36 deletions src/machine.rs
Original file line number Diff line number Diff line change
Expand Up @@ -320,57 +320,36 @@ impl Mappings {
self.v.iter()
}

fn binary_search(&self, addr: Size) -> Result<usize, usize> {
self.v.binary_search_by(|map| {
if map.range.start > addr {
Ordering::Greater
} else if map.range.end < addr {
Ordering::Less
} else {
Ordering::Equal
}
})
}

pub fn insert(&mut self, new: Mapping) {
let idx = self
.v
.binary_search_by(|map| {
if map.range.start > new.range.start {
Ordering::Greater
} else if map.range.end < new.range.start {
Ordering::Less
} else {
Ordering::Equal
}
})
.unwrap_err();
let idx = self.binary_search(new.range.start).unwrap_err();
self.v.insert(idx, new);
}

pub fn remove(&mut self, addr: Size) -> Option<Mapping> {
if !self.v.get(0)?.contains(addr) && !self.v.last()?.contains(addr) {
return None;
}
let idx = self
.v
.binary_search_by(|map| {
if map.range.start > addr {
Ordering::Greater
} else if map.range.end < addr {
Ordering::Less
} else {
Ordering::Equal
}
})
.ok()?;
let idx = self.binary_search(addr).ok()?;
Some(self.v.remove(idx))
}

pub fn get(&self, addr: Size) -> Option<&Mapping> {
if !self.v.get(0)?.contains(addr) && !self.v.last()?.contains(addr) {
return None;
}
let idx = self
.v
.binary_search_by(|map| {
if map.range.start > addr {
Ordering::Greater
} else if map.range.end < addr {
Ordering::Less
} else {
Ordering::Equal
}
})
.ok()?;
let idx = self.binary_search(addr).ok()?;
self.v.get(idx)
}
}
Expand Down

0 comments on commit a9111f5

Please sign in to comment.