@@ -90,11 +90,8 @@ impl<'a> AsciiStr<'a> {
9090 #[ inline]
9191 pub fn read_u64 ( & self ) -> u64 {
9292 debug_assert ! ( self . check_len( 8 ) ) ;
93- let mut value = 0_u64 ;
94- let src = self . ptr ;
95- let dst = & mut value as * mut _ as * mut u8 ;
96- unsafe { ptr:: copy_nonoverlapping ( src, dst, 8 ) } ;
97- value
93+ let src = self . ptr as * const u64 ;
94+ u64:: from_le ( unsafe { ptr:: read_unaligned ( src) } )
9895 }
9996
10097 #[ inline]
@@ -159,26 +156,22 @@ pub trait ByteSlice: AsRef<[u8]> + AsMut<[u8]> {
159156 #[ inline]
160157 fn read_u64 ( & self ) -> u64 {
161158 debug_assert ! ( self . as_ref( ) . len( ) >= 8 ) ;
162- let mut value = 0_u64 ;
163- let src = self . as_ref ( ) . as_ptr ( ) ;
164- let dst = & mut value as * mut _ as * mut u8 ;
165- unsafe { ptr:: copy_nonoverlapping ( src, dst, 8 ) } ;
166- value
159+ let src = self . as_ref ( ) . as_ptr ( ) as * const u64 ;
160+ u64:: from_le ( unsafe { ptr:: read_unaligned ( src) } )
167161 }
168162
169163 #[ inline]
170164 fn write_u64 ( & mut self , value : u64 ) {
171165 debug_assert ! ( self . as_ref( ) . len( ) >= 8 ) ;
172- let src = & value as * const _ as * const u8 ;
173- let dst = self . as_mut ( ) . as_mut_ptr ( ) ;
174- unsafe { ptr:: copy_nonoverlapping ( src, dst, 8 ) } ;
166+ let dst = self . as_mut ( ) . as_mut_ptr ( ) as * mut u64 ;
167+ unsafe { ptr:: write_unaligned ( dst, u64:: to_le ( value) ) } ;
175168 }
176169}
177170
178171impl ByteSlice for [ u8 ] { }
179172
180173#[ inline]
181- pub fn is_8digits_le ( v : u64 ) -> bool {
174+ pub fn is_8digits ( v : u64 ) -> bool {
182175 let a = v. wrapping_add ( 0x4646_4646_4646_4646 ) ;
183176 let b = v. wrapping_sub ( 0x3030_3030_3030_3030 ) ;
184177 ( a | b) & 0x8080_8080_8080_8080 == 0
@@ -212,3 +205,23 @@ impl AdjustedMantissa {
212205 }
213206 }
214207}
208+
209+ #[ cfg( test) ]
210+ mod tests {
211+ use super :: * ;
212+
213+ #[ test]
214+ fn test_read_write_u64 ( ) {
215+ let bytes = b"01234567" ;
216+ let string = AsciiStr :: new ( bytes) ;
217+ let int = string. read_u64 ( ) ;
218+ assert_eq ! ( int, 0x3736353433323130 ) ;
219+
220+ let int = bytes. read_u64 ( ) ;
221+ assert_eq ! ( int, 0x3736353433323130 ) ;
222+
223+ let mut slc = [ 0u8 ; 8 ] ;
224+ slc. write_u64 ( 0x3736353433323130 ) ;
225+ assert_eq ! ( & slc, bytes) ;
226+ }
227+ }
0 commit comments