use wasm_dbms_api::prelude::{Encode, MemoryResult, Page, PageOffset};
use crate::memory_manager::UNCLAIMED_PAGES_PAGE;
use crate::unclaimed_pages::UnclaimedPages;
pub trait MemoryAccess {
fn page_size(&self) -> u64;
fn grow_one_page(&mut self) -> MemoryResult<Page>;
fn zero_page(&mut self, page: Page) -> MemoryResult<()>;
fn claim_page(&mut self) -> MemoryResult<Page> {
let mut ledger: UnclaimedPages = self.read_at(UNCLAIMED_PAGES_PAGE, 0)?;
if let Some(page) = ledger.pop() {
self.write_at(UNCLAIMED_PAGES_PAGE, 0, &ledger)?;
return Ok(page);
}
self.grow_one_page()
}
fn unclaim_page(&mut self, page: Page) -> MemoryResult<()> {
self.zero_page(page)?;
let mut ledger: UnclaimedPages = self.read_at(UNCLAIMED_PAGES_PAGE, 0)?;
ledger.push(page)?;
self.write_at(UNCLAIMED_PAGES_PAGE, 0, &ledger)
}
fn read_at<D>(&mut self, page: Page, offset: PageOffset) -> MemoryResult<D>
where
D: Encode;
fn write_at<E>(&mut self, page: Page, offset: PageOffset, data: &E) -> MemoryResult<()>
where
E: Encode;
fn write_at_raw(&mut self, page: Page, offset: PageOffset, buf: &[u8]) -> MemoryResult<()>;
fn zero<E>(&mut self, page: Page, offset: PageOffset, data: &E) -> MemoryResult<()>
where
E: Encode;
fn zero_raw(&mut self, page: Page, offset: PageOffset, len: PageOffset) -> MemoryResult<()>;
fn read_at_raw(
&mut self,
page: Page,
offset: PageOffset,
buf: &mut [u8],
) -> MemoryResult<usize>;
}