use crate::MemoryAddr;
pub struct PageIter<const PAGE_SIZE: usize, A>
where
A: MemoryAddr,
{
start: A,
end: A,
}
impl<A, const PAGE_SIZE: usize> PageIter<PAGE_SIZE, A>
where
A: MemoryAddr,
{
pub fn new(start: A, end: A) -> Option<Self> {
if !PAGE_SIZE.is_power_of_two()
|| !start.is_aligned(PAGE_SIZE)
|| !end.is_aligned(PAGE_SIZE)
{
None
} else {
Some(Self { start, end })
}
}
}
impl<A, const PAGE_SIZE: usize> Iterator for PageIter<PAGE_SIZE, A>
where
A: MemoryAddr,
{
type Item = A;
fn next(&mut self) -> Option<Self::Item> {
if self.start < self.end {
let ret = self.start;
self.start = self.start.add(PAGE_SIZE);
Some(ret)
} else {
None
}
}
}
pub struct DynPageIter<A>
where
A: MemoryAddr,
{
start: A,
end: A,
page_size: usize,
}
impl<A> DynPageIter<A>
where
A: MemoryAddr,
{
pub fn new(start: A, end: A, page_size: usize) -> Option<Self> {
if !page_size.is_power_of_two()
|| !start.is_aligned(page_size)
|| !end.is_aligned(page_size)
{
None
} else {
Some(Self {
start,
end,
page_size,
})
}
}
}
impl<A> Iterator for DynPageIter<A>
where
A: MemoryAddr,
{
type Item = A;
fn next(&mut self) -> Option<Self::Item> {
if self.start < self.end {
let ret = self.start;
self.start = self.start.add(self.page_size);
Some(ret)
} else {
None
}
}
}