1- use core:: {
2- mem,
3- mem:: MaybeUninit ,
4- ops:: { Deref , DerefMut } ,
5- slice,
6- } ;
1+ use core:: { mem, mem:: MaybeUninit } ;
72
83pub ( crate ) fn init_array < T , const N : usize > ( default : impl Fn ( ) -> T ) -> [ T ; N ] {
94 // SAFETY: common MaybeUninit pattern, used in unstable `MaybeUninit::uninit_array`
@@ -12,11 +7,12 @@ pub(crate) fn init_array<T, const N: usize>(default: impl Fn() -> T) -> [T; N] {
127 elem. write ( default ( ) ) ;
138 }
149 // SAFETY: all elements have been initialized
15- // I used `std ::mem::transmute_copy` because `transmute` doesn't work here
10+ // I used `core ::mem::transmute_copy` because `transmute` doesn't work here
1611 // see https://users.rust-lang.org/t/transmuting-a-generic-array/45645
1712 unsafe { mem:: transmute_copy ( & array) }
1813}
1914
15+ #[ cfg( feature = "write" ) ]
2016/// A hack for const-expression-sized array, as discussed here:
2117/// https://users.rust-lang.org/t/is-slice-from-raw-parts-unsound-in-case-of-a-repr-c-struct-with-consecutive-arrays/88368
2218#[ repr( C ) ]
@@ -31,29 +27,38 @@ pub(crate) struct ArrayWithHeaderAndTrailer<
3127 trailer : [ T ; TRAILER_SIZE ] ,
3228}
3329
34- impl < T , const HEADER_SIZE : usize , const N : usize , const TRAILER_SIZE : usize > Deref
30+ #[ cfg( feature = "write" ) ]
31+ impl < T , const HEADER_SIZE : usize , const N : usize , const TRAILER_SIZE : usize > core:: ops:: Deref
3532 for ArrayWithHeaderAndTrailer < T , HEADER_SIZE , N , TRAILER_SIZE >
3633{
3734 type Target = [ T ] ;
3835 fn deref ( & self ) -> & Self :: Target {
3936 // SAFETY: see struct documentation
4037 unsafe {
41- slice:: from_raw_parts ( self as * const _ as * const T , HEADER_SIZE + N + TRAILER_SIZE )
38+ core:: slice:: from_raw_parts (
39+ self as * const _ as * const T ,
40+ HEADER_SIZE + N + TRAILER_SIZE ,
41+ )
4242 }
4343 }
4444}
4545
46- impl < T , const HEADER_SIZE : usize , const N : usize , const TRAILER_SIZE : usize > DerefMut
46+ #[ cfg( feature = "write" ) ]
47+ impl < T , const HEADER_SIZE : usize , const N : usize , const TRAILER_SIZE : usize > core:: ops:: DerefMut
4748 for ArrayWithHeaderAndTrailer < T , HEADER_SIZE , N , TRAILER_SIZE >
4849{
4950 fn deref_mut ( & mut self ) -> & mut Self :: Target {
5051 // SAFETY: see struct documentation
5152 unsafe {
52- slice:: from_raw_parts_mut ( self as * mut _ as * mut T , HEADER_SIZE + N + TRAILER_SIZE )
53+ core:: slice:: from_raw_parts_mut (
54+ self as * mut _ as * mut T ,
55+ HEADER_SIZE + N + TRAILER_SIZE ,
56+ )
5357 }
5458 }
5559}
5660
61+ #[ cfg( feature = "write" ) ]
5762impl < T , const HEADER_SIZE : usize , const N : usize , const TRAILER_SIZE : usize >
5863 ArrayWithHeaderAndTrailer < T , HEADER_SIZE , N , TRAILER_SIZE >
5964{
@@ -66,6 +71,7 @@ impl<T, const HEADER_SIZE: usize, const N: usize, const TRAILER_SIZE: usize>
6671 }
6772}
6873
74+ #[ cfg( feature = "write" ) ]
6975impl < T , const HEADER_SIZE : usize , const N : usize , const TRAILER_SIZE : usize > Default
7076 for ArrayWithHeaderAndTrailer < T , HEADER_SIZE , N , TRAILER_SIZE >
7177where
0 commit comments