Skip to content

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

Open
@qwerty19106

Description

@qwerty19106

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 method read_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

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions