Skip to main content

macho_core/model/addr/
range.rs

1use std::fmt;
2
3use super::types::{ThinFileOffset, Va};
4
5#[derive(Clone, Copy, PartialEq, Eq)]
6/// The AddressRange type.
7pub struct AddressRange<A: Copy> {
8    /// The start field.
9    pub start: A,
10    /// The size field.
11    pub size: u64,
12}
13
14impl<A: Copy + fmt::Debug + std::ops::Add<u64, Output = A>> AddressRange<A> {
15    /// Performs new.
16    pub fn new(start: A, size: u64) -> Self {
17        Self { start, size }
18    }
19
20    /// Performs end.
21    pub fn end(&self) -> A {
22        self.start + self.size
23    }
24
25    /// Performs is_empty.
26    pub fn is_empty(&self) -> bool {
27        self.size == 0
28    }
29}
30
31impl<A: Copy + fmt::Debug + std::ops::Add<u64, Output = A> + PartialOrd> AddressRange<A> {
32    /// Performs contains.
33    pub fn contains(&self, addr: A) -> bool {
34        addr >= self.start && addr < self.end()
35    }
36}
37
38impl<A: Copy + fmt::Debug> fmt::Debug for AddressRange<A> {
39    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
40        f.debug_struct("AddressRange")
41            .field("start", &self.start)
42            .field("size", &self.size)
43            .finish()
44    }
45}
46
47/// The FileRange type.
48pub type FileRange = AddressRange<ThinFileOffset>;
49/// The VaRange type.
50pub type VaRange = AddressRange<Va>;