use std::convert::TryFrom;
use std::fmt;
use crate::buf::Buf;
#[derive(Debug)]
pub struct BufMmap<'a, T>
where
T: std::default::Default,
{
pub(crate) addr: u64,
pub(crate) len: u16,
pub(crate) data: &'a mut [u8],
pub(crate) user: T,
}
impl<T> Buf<T> for BufMmap<'_, T>
where
T: std::default::Default,
{
fn get_data(&self) -> &[u8] {
&self.data[0..]
}
fn get_data_mut(&mut self) -> &mut [u8] {
&mut self.data[0..]
}
fn get_capacity(&self) -> u16 {
u16::try_from(self.data.len()).unwrap()
}
fn get_len(&self) -> u16 {
self.len
}
fn set_len(&mut self, len: u16) {
if len > self.get_capacity() {
panic!("len too large {} vs {}", len, self.get_capacity());
}
self.len = len;
}
fn get_user(&self) -> &T {
&self.user
}
fn get_user_mut(&mut self) -> &mut T {
&mut self.user
}
}
impl<'a, T> fmt::Display for BufMmap<'a, T>
where
T: std::default::Default,
{
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
write!(
f,
"BufMMap addr={} len={} capacity={} data={:?}",
self.addr,
self.len,
self.get_capacity(),
&(self.data[0]) as *const u8
)
}
}
impl<'a, T> Drop for BufMmap<'a, T>
where
T: std::default::Default,
{
fn drop(&mut self) {}
}