use std::{mem::MaybeUninit, ops::Range};
use wasmer_types::Pages;
use crate::{AsStoreRef, Memory, MemoryAccessError, buffer::MemoryBuffer};
pub(crate) mod inner;
pub(crate) use inner::*;
#[derive(Debug, derive_more::From)]
pub struct MemoryView<'a>(pub(crate) BackendMemoryView<'a>);
impl<'a> MemoryView<'a> {
pub(crate) fn new(memory: &Memory, store: &'a (impl AsStoreRef + ?Sized)) -> Self {
Self(BackendMemoryView::new(memory, store))
}
#[doc(hidden)]
pub fn data_ptr(&self) -> *mut u8 {
self.0.data_ptr()
}
pub fn data_size(&self) -> u64 {
self.0.data_size()
}
#[doc(hidden)]
pub unsafe fn data_unchecked(&self) -> &[u8] {
unsafe { self.0.data_unchecked() }
}
#[allow(clippy::mut_from_ref)]
#[doc(hidden)]
pub unsafe fn data_unchecked_mut(&self) -> &mut [u8] {
unsafe { self.0.data_unchecked_mut() }
}
pub fn size(&self) -> Pages {
self.0.size()
}
#[inline]
pub(crate) fn buffer(&'a self) -> MemoryBuffer<'a> {
self.0.buffer()
}
pub fn read(&self, offset: u64, buf: &mut [u8]) -> Result<(), MemoryAccessError> {
self.0.read(offset, buf)
}
pub fn read_u8(&self, offset: u64) -> Result<u8, MemoryAccessError> {
self.0.read_u8(offset)
}
pub fn read_uninit<'b>(
&self,
offset: u64,
buf: &'b mut [MaybeUninit<u8>],
) -> Result<&'b mut [u8], MemoryAccessError> {
self.0.read_uninit(offset, buf)
}
pub fn write(&self, offset: u64, data: &[u8]) -> Result<(), MemoryAccessError> {
self.0.write(offset, data)
}
pub fn write_u8(&self, offset: u64, val: u8) -> Result<(), MemoryAccessError> {
self.0.write_u8(offset, val)
}
pub fn copy_to_vec(&self) -> Result<Vec<u8>, MemoryAccessError> {
self.0.copy_to_vec()
}
pub fn copy_range_to_vec(&self, range: Range<u64>) -> Result<Vec<u8>, MemoryAccessError> {
self.0.copy_range_to_vec(range)
}
pub fn copy_to_memory(&self, amount: u64, new_memory: &Self) -> Result<(), MemoryAccessError> {
self.0.copy_to_memory(amount, &new_memory.0)
}
}