@@ -58,71 +58,51 @@ pub trait FromMemoryView: Sized {
5858 // fn read_boxed(view: &dyn MemoryView, offset: u64) -> Result<Box<Self>, Box<dyn error::ErrorType>>;
5959}
6060
61- macro_rules! impl_from_memory_copy {
62- ( $type: ty) => {
63- impl FromMemoryView for $type {
64- type DecodeError = Infallible ;
65-
66- fn read_object<M : MemoryView >(
67- view: & M ,
68- offset: u64 ,
69- ) -> Result <Self , MemoryDecodeError <M :: AccessError , Self :: DecodeError >> {
70- let mut result = MaybeUninit :: uninit( ) ;
71-
72- {
73- let result_memory = unsafe {
74- slice:: from_raw_parts_mut(
75- result. as_mut_ptr( ) as * mut u8 ,
76- mem:: size_of:: <$type>( ) ,
77- )
78- } ;
79-
80- view. read_memory( offset, result_memory)
81- . map_err( MemoryDecodeError :: MemoryAccess ) ?;
82- }
83-
84- Ok ( unsafe { result. assume_init( ) } )
85- }
86- }
61+ /// Marker trait for types that can be trivially constructed by copying their
62+ /// underlying data.
63+ ///
64+ /// For types implementing this trait:
65+ /// - [`FromMemoryView`] is automatically implemented.
66+ /// - The associated [`DecodeError`] is fixed to [`Infallible`], since decoding
67+ /// cannot fail.
68+ pub trait CopyConstructable : Copy { }
69+
70+ impl < T : CopyConstructable > FromMemoryView for T {
71+ type DecodeError = Infallible ;
8772
88- impl <const N : usize > FromMemoryView for [ $type; N ] {
89- type DecodeError = Infallible ;
90-
91- fn read_object<M : MemoryView >(
92- view: & M ,
93- offset: u64 ,
94- ) -> Result <Self , MemoryDecodeError <M :: AccessError , Self :: DecodeError >> {
95- let mut result = MaybeUninit :: uninit( ) ;
96-
97- {
98- let result_memory = unsafe {
99- slice:: from_raw_parts_mut(
100- result. as_mut_ptr( ) as * mut u8 ,
101- mem:: size_of:: <$type>( ) * N ,
102- )
103- } ;
104-
105- view. read_memory( offset, result_memory)
106- . map_err( MemoryDecodeError :: MemoryAccess ) ?;
107- }
108-
109- Ok ( unsafe { result. assume_init( ) } )
110- }
111- }
112- } ;
73+ fn read_object < M : MemoryView > (
74+ view : & M ,
75+ offset : u64 ,
76+ ) -> Result < Self , MemoryDecodeError < M :: AccessError , Self :: DecodeError > > {
77+ let mut result = MaybeUninit :: uninit ( ) ;
78+
79+ let result_memory = unsafe {
80+ slice:: from_raw_parts_mut ( result. as_mut_ptr ( ) as * mut u8 , mem:: size_of :: < T > ( ) )
81+ } ;
82+
83+ view. read_memory ( offset, result_memory)
84+ . map_err ( MemoryDecodeError :: MemoryAccess ) ?;
85+
86+ Ok ( unsafe { result. assume_init ( ) } )
87+ }
11388}
11489
115- impl_from_memory_copy ! ( i8 ) ;
116- impl_from_memory_copy ! ( u8 ) ;
117- impl_from_memory_copy ! ( i16 ) ;
118- impl_from_memory_copy ! ( u16 ) ;
119- impl_from_memory_copy ! ( i32 ) ;
120- impl_from_memory_copy ! ( u32 ) ;
121- impl_from_memory_copy ! ( i64 ) ;
122- impl_from_memory_copy ! ( u64 ) ;
123-
124- impl_from_memory_copy ! ( f32 ) ;
125- impl_from_memory_copy ! ( f64 ) ;
90+ impl < T : CopyConstructable , const N : usize > CopyConstructable for [ T ; N ] { }
91+
92+ impl CopyConstructable for u8 { }
93+ impl CopyConstructable for i8 { }
94+
95+ impl CopyConstructable for u16 { }
96+ impl CopyConstructable for i16 { }
97+
98+ impl CopyConstructable for u32 { }
99+ impl CopyConstructable for i32 { }
100+
101+ impl CopyConstructable for u64 { }
102+ impl CopyConstructable for i64 { }
103+
104+ impl CopyConstructable for f32 { }
105+ impl CopyConstructable for f64 { }
126106
127107impl FromMemoryView for bool {
128108 type DecodeError = Infallible ;
0 commit comments