rust-embedded / embedded-dma

Apache License 2.0
35 stars 12 forks source link

API to unsafely use any buffer? #12

Open Dirbaio opened 3 years ago

Dirbaio commented 3 years ago

Maybe embedded-dma could provide an (unsafe, obviously) API to use any buffer with minimal fuss?

Something like this:

struct UnsafeWriteBuffer<'a, T: ?Sized>{
    inner: &'a mut T,
}

impl<'a, T:?Sized> UnsafeWriteBuffer<'a, T>{
    pub unsafe fn new(inner: &'a mut T) -> Self{
        Self { inner }
    }
}

impl<'a, T:?Sized> Deref for UnsafeWriteBuffer<'a, T>{ 
    type Target = T;
    fn deref(&self) -> &Self::Target {
        self.inner
    }
}
impl<'a, T:?Sized> DerefMut for UnsafeWriteBuffer<'a, T>{ 
    fn deref_mut(&mut self) -> &mut Self::Target {
        self.inner
    }
}

unsafe impl<'a, T:?Sized> StableDeref for UnsafeWriteBuffer<'a, T>{ 
}

unsafe impl<'a, T: WriteTarget + ?Sized> WriteBuffer for UnsafeWriteBuffer<'a, T>{ 
    type Word = T::Word;

    unsafe fn write_buffer(&mut self) -> (*mut Self::Word, usize) {
        self.inner.as_write_buffer()
    }
}