> +fn derive_opaque_or_error(input: DeriveInput) -> > Result<proc_macro2::TokenStream, MacroError> { > + is_transparent_repr(&input, "#[derive(Wrapper)]")?; > + > + let name = &input.ident; > + let field = &get_unnamed_field(&input, "#[derive(Wrapper)]")?; > + let typ = &field.ty; > + > + // TODO: how to add "::qemu_api"? For now, this is only used in the > + // qemu_api crate so it's not a problem. > + Ok(quote! { > + unsafe impl crate::cell::Wrapper for #name { > + type Wrapped = <#typ as crate::cell::Wrapper>::Wrapped; > + } > + impl #name { > + pub unsafe fn from_raw<'a>(ptr: *mut <Self as > crate::cell::Wrapper>::Wrapped) -> &'a Self { > + let ptr = > ::std::ptr::NonNull::new(ptr).unwrap().cast::<Self>(); > + unsafe { ptr.as_ref() } > + } > + > + pub const fn as_mut_ptr(&self) -> *mut <Self as > crate::cell::Wrapper>::Wrapped { > + self.0.as_mut_ptr() > + } > + > + pub const fn as_ptr(&self) -> *const <Self as > crate::cell::Wrapper>::Wrapped { > + self.0.as_ptr() > + }
What about also adding as_void_ptr? Then DeviceState can benefit from this in qdev_init_clock_in. > + } > + }) > +} > + Others are fine for me. Nice improvement! Reviewed-by: Zhao Liu <zhao1....@intel.com>