rust-embedded / embedded-dma

Apache License 2.0
35 stars 12 forks source link

How implement ReadBuffer for custom structs, newtype for example? #25

Open qwerty19106 opened 5 months ago

qwerty19106 commented 5 months ago

ReadTarget allows implement ReadBuffer for some standard generic types, such as alloc::Box<[u8; N]>, heapless::Box<[u8; N]> et. al.

unsafe impl<B, T> ReadBuffer for B
where
    B: Deref<Target = T> + StableDeref + 'static,
    T: ReadTarget + ?Sized,
{...}

But it not works automatically with newtype structs with Deref:

pub struct MyArray([u8; 100]);

impl Deref for MyArray {
    type Target = [u8];
    fn deref(&self) -> &[u8] {
        &self.0
    }
}

#[entry]
fn main() -> ! {
    let a = alloc::Box::new(MyArray([0; 100]));
    unsafe {
        a.read_buffer();
    }

    loop {}
}

error[E0599]: the methodread_bufferexists for structBox, but its trait bounds were not satisfied.

I can implement ReadTarget manually, and then code will be compiled:

unsafe impl ReadTarget for MyArray {
    type Word = u8;

    fn as_read_buffer(&self) -> (*const Self::Word, usize) {
        self.deref().as_read_buffer()
    }
}

Why my code not works by using Deref only?

P.S. Full example

qwerty19106 commented 5 months ago

This repo is dead?