@@ -704,7 +704,7 @@ impl<T> Box<[T]> {
704704 }
705705
706706 /// Constructs a new boxed slice with uninitialized contents. Returns an error if
707- /// the allocation fails
707+ /// the allocation fails.
708708 ///
709709 /// # Examples
710710 ///
@@ -739,7 +739,7 @@ impl<T> Box<[T]> {
739739 }
740740
741741 /// Constructs a new boxed slice with uninitialized contents, with the memory
742- /// being filled with `0` bytes. Returns an error if the allocation fails
742+ /// being filled with `0` bytes. Returns an error if the allocation fails.
743743 ///
744744 /// See [`MaybeUninit::zeroed`][zeroed] for examples of correct and incorrect usage
745745 /// of this method.
@@ -831,6 +831,85 @@ impl<T, A: Allocator> Box<[T], A> {
831831 pub fn new_zeroed_slice_in ( len : usize , alloc : A ) -> Box < [ mem:: MaybeUninit < T > ] , A > {
832832 unsafe { RawVec :: with_capacity_zeroed_in ( len, alloc) . into_box ( len) }
833833 }
834+
835+ /// Constructs a new boxed slice with uninitialized contents in the provided allocator. Returns an error if
836+ /// the allocation fails.
837+ ///
838+ /// # Examples
839+ ///
840+ /// ```
841+ /// #![feature(allocator_api, new_uninit)]
842+ ///
843+ /// use std::alloc::System;
844+ ///
845+ /// let mut values = Box::<[u32], _>::try_new_uninit_slice_in(3, System)?;
846+ /// let values = unsafe {
847+ /// // Deferred initialization:
848+ /// values[0].as_mut_ptr().write(1);
849+ /// values[1].as_mut_ptr().write(2);
850+ /// values[2].as_mut_ptr().write(3);
851+ /// values.assume_init()
852+ /// };
853+ ///
854+ /// assert_eq!(*values, [1, 2, 3]);
855+ /// # Ok::<(), std::alloc::AllocError>(())
856+ /// ```
857+ #[ unstable( feature = "allocator_api" , issue = "32838" ) ]
858+ #[ inline]
859+ pub fn try_new_uninit_slice_in (
860+ len : usize ,
861+ alloc : A ,
862+ ) -> Result < Box < [ mem:: MaybeUninit < T > ] , A > , AllocError > {
863+ let ptr = if T :: IS_ZST || len == 0 {
864+ NonNull :: dangling ( )
865+ } else {
866+ let layout = match Layout :: array :: < mem:: MaybeUninit < T > > ( len) {
867+ Ok ( l) => l,
868+ Err ( _) => return Err ( AllocError ) ,
869+ } ;
870+ alloc. allocate ( layout) ?. cast ( )
871+ } ;
872+ unsafe { Ok ( RawVec :: from_raw_parts_in ( ptr. as_ptr ( ) , len, alloc) . into_box ( len) ) }
873+ }
874+
875+ /// Constructs a new boxed slice with uninitialized contents in the provided allocator, with the memory
876+ /// being filled with `0` bytes. Returns an error if the allocation fails.
877+ ///
878+ /// See [`MaybeUninit::zeroed`][zeroed] for examples of correct and incorrect usage
879+ /// of this method.
880+ ///
881+ /// # Examples
882+ ///
883+ /// ```
884+ /// #![feature(allocator_api, new_uninit)]
885+ ///
886+ /// use std::alloc::System;
887+ ///
888+ /// let values = Box::<[u32], _>::try_new_zeroed_slice_in(3, System)?;
889+ /// let values = unsafe { values.assume_init() };
890+ ///
891+ /// assert_eq!(*values, [0, 0, 0]);
892+ /// # Ok::<(), std::alloc::AllocError>(())
893+ /// ```
894+ ///
895+ /// [zeroed]: mem::MaybeUninit::zeroed
896+ #[ unstable( feature = "allocator_api" , issue = "32838" ) ]
897+ #[ inline]
898+ pub fn try_new_zeroed_slice_in (
899+ len : usize ,
900+ alloc : A ,
901+ ) -> Result < Box < [ mem:: MaybeUninit < T > ] , A > , AllocError > {
902+ let ptr = if T :: IS_ZST || len == 0 {
903+ NonNull :: dangling ( )
904+ } else {
905+ let layout = match Layout :: array :: < mem:: MaybeUninit < T > > ( len) {
906+ Ok ( l) => l,
907+ Err ( _) => return Err ( AllocError ) ,
908+ } ;
909+ alloc. allocate_zeroed ( layout) ?. cast ( )
910+ } ;
911+ unsafe { Ok ( RawVec :: from_raw_parts_in ( ptr. as_ptr ( ) , len, alloc) . into_box ( len) ) }
912+ }
834913}
835914
836915impl < T , A : Allocator > Box < mem:: MaybeUninit < T > , A > {
0 commit comments