@@ -372,27 +372,28 @@ impl<T, const N: usize> [T; N] {
372
372
///
373
373
/// # Examples
374
374
/// ```
375
- /// let x = [1,2,3];
375
+ /// # #![feature(array_map)]
376
+ /// let x = [1, 2, 3];
376
377
/// let y = x.map(|v| v + 1);
377
- /// assert_eq!(y, [2,3, 4]);
378
+ /// assert_eq!(y, [2, 3, 4]);
378
379
/// ```
379
380
#[ unstable( feature = "array_map" , issue = "77777" ) ]
380
- pub fn map < F , S > ( self , mut f : F ) -> [ S ; N ]
381
+ pub fn map < F , U > ( self , mut f : F ) -> [ U ; N ]
381
382
where
382
- F : FnMut ( T ) -> S ,
383
+ F : FnMut ( T ) -> U ,
383
384
{
384
385
use crate :: mem:: MaybeUninit ;
385
386
struct Guard < T , const N : usize > {
386
387
dst : * mut T ,
387
- curr_init : usize ,
388
+ initialized : usize ,
388
389
}
389
390
390
391
impl < T , const N : usize > Drop for Guard < T , N > {
391
392
fn drop ( & mut self ) {
392
- debug_assert ! ( self . curr_init <= N ) ;
393
+ debug_assert ! ( self . initialized <= N ) ;
393
394
394
395
let initialized_part =
395
- crate :: ptr:: slice_from_raw_parts_mut ( self . dst , self . curr_init ) ;
396
+ crate :: ptr:: slice_from_raw_parts_mut ( self . dst , self . initialized ) ;
396
397
// SAFETY: this raw slice will contain only initialized objects
397
398
// that's why, it is allowed to drop it.
398
399
unsafe {
@@ -401,16 +402,16 @@ impl<T, const N: usize> [T; N] {
401
402
}
402
403
}
403
404
let mut dst = MaybeUninit :: uninit_array :: < N > ( ) ;
404
- let mut guard: Guard < S , N > = Guard { dst : & mut dst as * mut _ as * mut S , curr_init : 0 } ;
405
- for ( i , e ) in IntoIter :: new ( self ) . enumerate ( ) {
406
- dst[ i ] = MaybeUninit :: new ( f ( e ) ) ;
407
- guard. curr_init += 1 ;
405
+ let mut guard: Guard < U , N > = Guard { dst : & mut dst as * mut _ as * mut U , initialized : 0 } ;
406
+ for ( src , dst ) in IntoIter :: new ( self ) . zip ( & mut dst ) {
407
+ dst. write ( f ( src ) ) ;
408
+ guard. initialized += 1 ;
408
409
}
409
- // FIXME convert to crate::mem::transmute when works with generics
410
- // unsafe { crate::mem::transmute::<[MaybeUninit<S >; N], [S ; N]>(dst) }
410
+ // FIXME: Convert to crate::mem::transmute once it works with generics.
411
+ // unsafe { crate::mem::transmute::<[MaybeUninit<U >; N], [U ; N]>(dst) }
411
412
crate :: mem:: forget ( guard) ;
412
413
// SAFETY: At this point we've properly initialized the whole array
413
- // and we just need to cast it to the correct type
414
- unsafe { ( & mut dst as * mut _ as * mut [ S ; N ] ) . read ( ) }
414
+ // and we just need to cast it to the correct type.
415
+ unsafe { ( & mut dst as * mut _ as * mut [ U ; N ] ) . read ( ) }
415
416
}
416
417
}
0 commit comments