azur 0.3.1

A no_std Rust crate that implements an executor/reactor and futures using io_uring
Documentation
use core::mem::MaybeUninit;

use super::{
    IoBuf,
    IoBufMut,
};

pub struct ArrayBuf<const N: usize> {
    array: [MaybeUninit<u8>; N],
    len: usize,
}

impl<const N: usize> Default for ArrayBuf<N> {
    fn default() -> Self {
        Self {
            array: [MaybeUninit::uninit(); N],
            len: 0,
        }
    }
}

impl<const N: usize> AsRef<[u8]> for ArrayBuf<N> {
    fn as_ref(&self) -> &[u8] {
        unsafe { &*(&self.array[..self.len] as *const [MaybeUninit<u8>] as *const [u8]) }
    }
}

unsafe impl<const N: usize> IoBuf for ArrayBuf<N> {}

unsafe impl<const N: usize> IoBufMut for ArrayBuf<N> {
    fn uninit_bytes(&mut self) -> &mut [MaybeUninit<u8>] {
        &mut self.array
    }

    unsafe fn set_len(&mut self, new_len: usize) {
        debug_assert!(new_len <= N);
        self.len = new_len;
    }
}