@@ -238,7 +238,8 @@ impl<T> Pointable for T {
238
238
// [`alloc::alloc::Layout::extend`] instead.
239
239
#[ repr( C ) ]
240
240
struct Array < T > {
241
- size : usize ,
241
+ /// The number of elements (not the number of bytes).
242
+ len : usize ,
242
243
elements : [ MaybeUninit < T > ; 0 ] ,
243
244
}
244
245
@@ -247,31 +248,31 @@ impl<T> Pointable for [MaybeUninit<T>] {
247
248
248
249
type Init = usize ;
249
250
250
- unsafe fn init ( size : Self :: Init ) -> usize {
251
- let size = mem:: size_of :: < Array < T > > ( ) + mem:: size_of :: < MaybeUninit < T > > ( ) * size ;
251
+ unsafe fn init ( len : Self :: Init ) -> usize {
252
+ let size = mem:: size_of :: < Array < T > > ( ) + mem:: size_of :: < MaybeUninit < T > > ( ) * len ;
252
253
let align = mem:: align_of :: < Array < T > > ( ) ;
253
254
let layout = alloc:: Layout :: from_size_align ( size, align) . unwrap ( ) ;
254
255
let ptr = alloc:: alloc ( layout) as * mut Array < T > ;
255
256
if ptr. is_null ( ) {
256
257
alloc:: handle_alloc_error ( layout) ;
257
258
}
258
- ( * ptr) . size = size ;
259
+ ( * ptr) . len = len ;
259
260
ptr as usize
260
261
}
261
262
262
263
unsafe fn deref < ' a > ( ptr : usize ) -> & ' a Self {
263
264
let array = & * ( ptr as * const Array < T > ) ;
264
- slice:: from_raw_parts ( array. elements . as_ptr ( ) as * const _ , array. size )
265
+ slice:: from_raw_parts ( array. elements . as_ptr ( ) as * const _ , array. len )
265
266
}
266
267
267
268
unsafe fn deref_mut < ' a > ( ptr : usize ) -> & ' a mut Self {
268
269
let array = & * ( ptr as * mut Array < T > ) ;
269
- slice:: from_raw_parts_mut ( array. elements . as_ptr ( ) as * mut _ , array. size )
270
+ slice:: from_raw_parts_mut ( array. elements . as_ptr ( ) as * mut _ , array. len )
270
271
}
271
272
272
273
unsafe fn drop ( ptr : usize ) {
273
274
let array = & * ( ptr as * mut Array < T > ) ;
274
- let size = mem:: size_of :: < Array < T > > ( ) + mem:: size_of :: < MaybeUninit < T > > ( ) * array. size ;
275
+ let size = mem:: size_of :: < Array < T > > ( ) + mem:: size_of :: < MaybeUninit < T > > ( ) * array. len ;
275
276
let align = mem:: align_of :: < Array < T > > ( ) ;
276
277
let layout = alloc:: Layout :: from_size_align ( size, align) . unwrap ( ) ;
277
278
alloc:: dealloc ( ptr as * mut u8 , layout) ;
@@ -1529,7 +1530,8 @@ impl<T: ?Sized + Pointable> Default for Shared<'_, T> {
1529
1530
1530
1531
#[ cfg( all( test, not( crossbeam_loom) ) ) ]
1531
1532
mod tests {
1532
- use super :: Shared ;
1533
+ use super :: { Owned , Shared } ;
1534
+ use std:: mem:: MaybeUninit ;
1533
1535
1534
1536
#[ test]
1535
1537
fn valid_tag_i8 ( ) {
@@ -1547,4 +1549,11 @@ mod tests {
1547
1549
use super :: Atomic ;
1548
1550
static _U: Atomic < u8 > = Atomic :: < u8 > :: null ( ) ;
1549
1551
}
1552
+
1553
+ #[ test]
1554
+ fn array_init ( ) {
1555
+ let owned = Owned :: < [ MaybeUninit < usize > ] > :: init ( 10 ) ;
1556
+ let arr: & [ MaybeUninit < usize > ] = & * owned;
1557
+ assert_eq ! ( arr. len( ) , 10 ) ;
1558
+ }
1550
1559
}
0 commit comments