Struct memory_structs::PageRange
source · pub struct PageRange(_);
Expand description
A range of Page
s that are contiguous in virtual memory.
Implementations§
source§impl PageRange
impl PageRange
sourcepub const fn new(start: Page, end: Page) -> PageRange
pub const fn new(start: Page, end: Page) -> PageRange
Creates a new range of Page
s that spans from start
to end
, both inclusive bounds.
sourcepub const fn empty() -> PageRange
pub const fn empty() -> PageRange
Creates a PageRange
that will always yield None
when iterated.
sourcepub fn from_virt_addr(
starting_addr: VirtualAddress,
size_in_bytes: usize
) -> PageRange
pub fn from_virt_addr(
starting_addr: VirtualAddress,
size_in_bytes: usize
) -> PageRange
A convenience method for creating a new PageRange
that spans all Page
s from the given VirtualAddress
to an end bound based on the given size.
sourcepub const fn start_address(&self) -> VirtualAddress
pub const fn start_address(&self) -> VirtualAddress
Returns the VirtualAddress
of the starting Page
in this PageRange
.
sourcepub const fn size_in_pages(&self) -> usize
pub const fn size_in_pages(&self) -> usize
Returns the number of Page
s covered by this iterator.
Use this instead of Iterator::count()
method. This is instant, because it doesn’t need to iterate over each entry, unlike normal iterators.
sourcepub const fn size_in_bytes(&self) -> usize
pub const fn size_in_bytes(&self) -> usize
Returns the size of this range in number of bytes.
sourcepub fn contains_address(&self, addr: VirtualAddress) -> bool
pub fn contains_address(&self, addr: VirtualAddress) -> bool
Returns true
if this PageRange
contains the given VirtualAddress
.
sourcepub fn offset_of_address(&self, addr: VirtualAddress) -> Option<usize>
pub fn offset_of_address(&self, addr: VirtualAddress) -> Option<usize>
Returns the offset of the given VirtualAddress
within this PageRange
, i.e., addr - self.start_address()
.
If the given addr
is not covered by this range of Page
s, this returns None
.
Examples
If the range covers addresses 0x2000
to 0x4000
, then offset_of_address(0x3500)
would return Some(0x1500)
.
sourcepub fn address_at_offset(&self, offset: usize) -> Option<VirtualAddress>
pub fn address_at_offset(&self, offset: usize) -> Option<VirtualAddress>
Returns the VirtualAddress
at the given offset
into this PageRange
within this PageRange
, i.e., addr - self.start_address()
.
If the given offset
is not within this range of Page
s, this returns None
.
Examples
If the range covers addresses 0x2000
to 0x4000
, then address_at_offset(0x1500)
would return Some(0x3500)
.
sourcepub fn to_extended(&self, to_include: Page) -> PageRange
pub fn to_extended(&self, to_include: Page) -> PageRange
Returns a new separate PageRange
that is extended to include the given Page
.
Methods from Deref<Target = RangeInclusive<Page>>§
1.27.0 · sourcepub fn start(&self) -> &Idx
pub fn start(&self) -> &Idx
Returns the lower bound of the range (inclusive).
When using an inclusive range for iteration, the values of start()
and
end()
are unspecified after the iteration ended. To determine
whether the inclusive range is empty, use the is_empty()
method
instead of comparing start() > end()
.
Note: the value returned by this method is unspecified after the range has been iterated to exhaustion.
Examples
assert_eq!((3..=5).start(), &3);
1.27.0 · sourcepub fn end(&self) -> &Idx
pub fn end(&self) -> &Idx
Returns the upper bound of the range (inclusive).
When using an inclusive range for iteration, the values of start()
and end()
are unspecified after the iteration ended. To determine
whether the inclusive range is empty, use the is_empty()
method
instead of comparing start() > end()
.
Note: the value returned by this method is unspecified after the range has been iterated to exhaustion.
Examples
assert_eq!((3..=5).end(), &5);
1.35.0 · sourcepub fn contains<U>(&self, item: &U) -> boolwhere
Idx: PartialOrd<U>,
U: PartialOrd<Idx> + ?Sized,
pub fn contains<U>(&self, item: &U) -> boolwhere
Idx: PartialOrd<U>,
U: PartialOrd<Idx> + ?Sized,
Returns true
if item
is contained in the range.
Examples
assert!(!(3..=5).contains(&2));
assert!( (3..=5).contains(&3));
assert!( (3..=5).contains(&4));
assert!( (3..=5).contains(&5));
assert!(!(3..=5).contains(&6));
assert!( (3..=3).contains(&3));
assert!(!(3..=2).contains(&3));
assert!( (0.0..=1.0).contains(&1.0));
assert!(!(0.0..=1.0).contains(&f32::NAN));
assert!(!(0.0..=f32::NAN).contains(&0.0));
assert!(!(f32::NAN..=1.0).contains(&1.0));
This method always returns false
after iteration has finished:
let mut r = 3..=5;
assert!(r.contains(&3) && r.contains(&5));
for _ in r.by_ref() {}
// Precise field values are unspecified here
assert!(!r.contains(&3) && !r.contains(&5));
1.47.0 · sourcepub fn is_empty(&self) -> bool
pub fn is_empty(&self) -> bool
Returns true
if the range contains no items.
Examples
assert!(!(3..=5).is_empty());
assert!(!(3..=3).is_empty());
assert!( (3..=2).is_empty());
The range is empty if either side is incomparable:
assert!(!(3.0..=5.0).is_empty());
assert!( (3.0..=f32::NAN).is_empty());
assert!( (f32::NAN..=5.0).is_empty());
This method returns true
after iteration has finished:
let mut r = 3..=5;
for _ in r.by_ref() {}
// Precise field values are unspecified here
assert!(r.is_empty());