use super::*;
use core::fmt::Debug;
use core::ops::{Index, IndexMut};
pub trait MemoryMap: Debug + Index<usize, Output = MemoryDescriptor> {
#[must_use]
fn meta(&self) -> MemoryMapMeta;
#[must_use]
fn key(&self) -> MemoryMapKey;
#[must_use]
fn len(&self) -> usize;
#[must_use]
fn is_empty(&self) -> bool {
self.len() == 0
}
#[must_use]
fn get(&self, index: usize) -> Option<&MemoryDescriptor> {
if index >= self.len() {
None
} else {
let offset = index * self.meta().desc_size;
unsafe {
self.buffer()
.as_ptr()
.add(offset)
.cast::<MemoryDescriptor>()
.as_ref()
}
}
}
#[must_use]
fn buffer(&self) -> &[u8];
#[must_use]
fn entries(&self) -> MemoryMapIter<'_>;
#[must_use]
fn is_sorted(&self) -> bool {
let iter = self.entries();
let iter = iter.clone().zip(iter.skip(1));
for (curr, next) in iter {
if next.phys_start < curr.phys_start {
log::debug!("next.phys_start < curr.phys_start: curr={curr:?}, next={next:?}");
return false;
}
}
true
}
}
pub trait MemoryMapMut: MemoryMap + IndexMut<usize> {
#[must_use]
fn get_mut(&mut self, index: usize) -> Option<&mut MemoryDescriptor> {
if index >= self.len() {
None
} else {
let offset = index * self.meta().desc_size;
unsafe {
self.buffer_mut()
.as_mut_ptr()
.add(offset)
.cast::<MemoryDescriptor>()
.as_mut()
}
}
}
fn sort(&mut self);
unsafe fn buffer_mut(&mut self) -> &mut [u8];
}