use ascon_aead::aead::Buffer;
use ascon_aead::aead::Error;
use ascon_aead::aead::Result;
use crate::utils;
#[derive(Debug)]
pub struct PageVec {
pub ptr: *mut u8,
pub len: usize,
}
impl AsRef<[u8]> for PageVec {
fn as_ref(&self) -> &[u8] {
unsafe { std::slice::from_raw_parts(self.ptr, self.len) }
}
}
impl AsMut<[u8]> for PageVec {
fn as_mut(&mut self) -> &mut [u8] {
unsafe { std::slice::from_raw_parts_mut(self.ptr, self.len) }
}
}
impl Buffer for PageVec {
fn extend_from_slice(&mut self, other: &[u8]) -> Result<()> {
if self.len + other.len() > *utils::PAGE_SIZE {
Err(Error)
} else {
unsafe {
let start = self.ptr.add(self.len);
let sl = std::slice::from_raw_parts_mut(start, other.len());
for (dst, val) in sl.iter_mut().zip(other) {
*dst = *val;
}
}
self.len += other.len();
Ok(())
}
}
fn truncate(&mut self, len: usize) {
unsafe {
let truncate_start = self.ptr.add(len);
utils::memzero(truncate_start, self.len - len);
}
self.len = len;
}
}