> > + mut buf: MaybeUninit<T>,
>
> I think Rust doesn't guarantee no copies here, so maybe this could be
Do you think that in practice the compiler won't optimise the copy away?
It's possiblr that it does not, because it has to build the io::Result and stick the result of assume_init() in there. It all depends on the amount of inlining perhaps?
I think Box<MaybeUninit>> is the only way to guarantee no copies (assume_init for Box was only stabilized recently but it can be emulated with Box::into_raw and Box::from_raw).
> pub async fn read_uninit<T: SizedIoBuffer>(
> &self,
> offset: u64,
> buf: &mut MaybeUninit<T>,
> ) -> io::Result<&mut T>
>
> using assume_init_mut().
Are you sure that callers are ok with only getting a &mut T rather than
an owned T?
The one you have would need to be adjusted but it would work.
Another possibility by the way is to have "pub async fn read_obj<T: SizedIoBuffer>(&self, offset: u64) -> io::Result<T>" and hide the usage of MaybeUninit inside the function... That one doesn't even try to avoid copies though.
Paolo