@@ -3516,7 +3516,7 @@ fn data_offset_align(align: usize) -> usize {
35163516    layout. size ( )  + layout. padding_needed_for ( align) 
35173517} 
35183518
3519- /// A uniquely owned `Rc` 
3519+ /// A uniquely owned [ `Rc`].  
35203520/// 
35213521/// This represents an `Rc` that is known to be uniquely owned -- that is, have exactly one strong 
35223522/// reference. Multiple weak pointers can be created, but attempts to upgrade those to strong 
@@ -3554,13 +3554,24 @@ fn data_offset_align(align: usize) -> usize {
35543554/// including fallible or async constructors. 
35553555#[ unstable( feature = "unique_rc_arc" ,  issue = "112566" ) ]  
35563556#[ derive( Debug ) ]  
3557- pub  struct  UniqueRc < T >  { 
3557+ pub  struct  UniqueRc < 
3558+     T :  ?Sized , 
3559+     #[ unstable( feature = "allocator_api" ,  issue = "32838" ) ]   A :  Allocator  = Global , 
3560+ >  { 
35583561    ptr :  NonNull < RcBox < T > > , 
35593562    phantom :  PhantomData < RcBox < T > > , 
3563+     alloc :  A , 
35603564} 
35613565
3566+ #[ unstable( feature = "unique_rc_arc" ,  issue = "112566" ) ]  
3567+ impl < T :  ?Sized  + Unsize < U > ,  U :  ?Sized ,  A :  Allocator >  CoerceUnsized < UniqueRc < U ,  A > > 
3568+     for  UniqueRc < T ,  A > 
3569+ { 
3570+ } 
3571+ 
3572+ // Depends on A = Global 
35623573impl < T >  UniqueRc < T >  { 
3563-     /// Creates a new `UniqueRc` 
3574+     /// Creates a new `UniqueRc`.  
35643575     /// 
35653576     /// Weak references to this `UniqueRc` can be created with [`UniqueRc::downgrade`]. Upgrading 
35663577     /// these weak references will fail before the `UniqueRc` has been converted into an [`Rc`]. 
@@ -3569,54 +3580,78 @@ impl<T> UniqueRc<T> {
35693580     #[ cfg( not( no_global_oom_handling) ) ]  
35703581    #[ unstable( feature = "unique_rc_arc" ,  issue = "112566" ) ]  
35713582    pub  fn  new ( value :  T )  -> Self  { 
3572-         Self  { 
3573-             ptr :  Box :: leak ( Box :: new ( RcBox  { 
3583+         Self :: new_in ( value,  Global ) 
3584+     } 
3585+ } 
3586+ 
3587+ impl < T ,  A :  Allocator >  UniqueRc < T ,  A >  { 
3588+     /// Creates a new `UniqueRc` in the provided allocator. 
3589+      /// 
3590+      /// Weak references to this `UniqueRc` can be created with [`UniqueRc::downgrade`]. Upgrading 
3591+      /// these weak references will fail before the `UniqueRc` has been converted into an [`Rc`]. 
3592+      /// After converting the `UniqueRc` into an [`Rc`], any weak references created beforehand will 
3593+      /// point to the new [`Rc`]. 
3594+      #[ cfg( not( no_global_oom_handling) ) ]  
3595+     #[ unstable( feature = "unique_rc_arc" ,  issue = "112566" ) ]  
3596+     pub  fn  new_in ( value :  T ,  alloc :  A )  -> Self  { 
3597+         let  ( ptr,  alloc)  = Box :: into_unique ( Box :: new_in ( 
3598+             RcBox  { 
35743599                strong :  Cell :: new ( 0 ) , 
35753600                // keep one weak reference so if all the weak pointers that are created are dropped 
35763601                // the UniqueRc still stays valid. 
35773602                weak :  Cell :: new ( 1 ) , 
35783603                value, 
3579-             } ) ) 
3580-             . into ( ) , 
3581-             phantom :  PhantomData , 
3582-         } 
3583-     } 
3584- 
3585-     /// Creates a new weak reference to the `UniqueRc` 
3586-      /// 
3587-      /// Attempting to upgrade this weak reference will fail before the `UniqueRc` has been converted 
3588-      /// to a [`Rc`] using [`UniqueRc::into_rc`]. 
3589-      #[ unstable( feature = "unique_rc_arc" ,  issue = "112566" ) ]  
3590-     pub  fn  downgrade ( this :  & Self )  -> Weak < T >  { 
3591-         // SAFETY: This pointer was allocated at creation time and we guarantee that we only have 
3592-         // one strong reference before converting to a regular Rc. 
3593-         unsafe  { 
3594-             this. ptr . as_ref ( ) . inc_weak ( ) ; 
3595-         } 
3596-         Weak  {  ptr :  this. ptr ,  alloc :  Global  } 
3604+             } , 
3605+             alloc, 
3606+         ) ) ; 
3607+         Self  {  ptr :  ptr. into ( ) ,  phantom :  PhantomData ,  alloc } 
35973608    } 
3609+ } 
35983610
3599-     /// Converts the `UniqueRc` into a regular [`Rc`] 
3611+ impl < T :  ?Sized ,  A :  Allocator >  UniqueRc < T ,  A >  { 
3612+     /// Converts the `UniqueRc` into a regular [`Rc`]. 
36003613     /// 
36013614     /// This consumes the `UniqueRc` and returns a regular [`Rc`] that contains the `value` that 
36023615     /// is passed to `into_rc`. 
36033616     /// 
36043617     /// Any weak references created before this method is called can now be upgraded to strong 
36053618     /// references. 
36063619     #[ unstable( feature = "unique_rc_arc" ,  issue = "112566" ) ]  
3607-     pub  fn  into_rc ( this :  Self )  -> Rc < T >  { 
3620+     pub  fn  into_rc ( this :  Self )  -> Rc < T ,   A >  { 
36083621        let  mut  this = ManuallyDrop :: new ( this) ; 
3622+ 
3623+         // Move the allocator out. 
3624+         // SAFETY: `this.alloc` will not be accessed again, nor dropped because it is in 
3625+         // a `ManuallyDrop`. 
3626+         let  alloc:  A  = unsafe  {  ptr:: read ( & this. alloc )  } ; 
3627+ 
36093628        // SAFETY: This pointer was allocated at creation time so we know it is valid. 
36103629        unsafe  { 
36113630            // Convert our weak reference into a strong reference 
36123631            this. ptr . as_mut ( ) . strong . set ( 1 ) ; 
3613-             Rc :: from_inner ( this. ptr ) 
3632+             Rc :: from_inner_in ( this. ptr ,  alloc) 
3633+         } 
3634+     } 
3635+ } 
3636+ 
3637+ impl < T :  ?Sized ,  A :  Allocator  + Clone >  UniqueRc < T ,  A >  { 
3638+     /// Creates a new weak reference to the `UniqueRc`. 
3639+      /// 
3640+      /// Attempting to upgrade this weak reference will fail before the `UniqueRc` has been converted 
3641+      /// to a [`Rc`] using [`UniqueRc::into_rc`]. 
3642+      #[ unstable( feature = "unique_rc_arc" ,  issue = "112566" ) ]  
3643+     pub  fn  downgrade ( this :  & Self )  -> Weak < T ,  A >  { 
3644+         // SAFETY: This pointer was allocated at creation time and we guarantee that we only have 
3645+         // one strong reference before converting to a regular Rc. 
3646+         unsafe  { 
3647+             this. ptr . as_ref ( ) . inc_weak ( ) ; 
36143648        } 
3649+         Weak  {  ptr :  this. ptr ,  alloc :  this. alloc . clone ( )  } 
36153650    } 
36163651} 
36173652
36183653#[ unstable( feature = "unique_rc_arc" ,  issue = "112566" ) ]  
3619- impl < T >  Deref  for  UniqueRc < T >  { 
3654+ impl < T :  ? Sized ,   A :   Allocator >  Deref  for  UniqueRc < T ,   A >  { 
36203655    type  Target  = T ; 
36213656
36223657    fn  deref ( & self )  -> & T  { 
@@ -3626,7 +3661,7 @@ impl<T> Deref for UniqueRc<T> {
36263661} 
36273662
36283663#[ unstable( feature = "unique_rc_arc" ,  issue = "112566" ) ]  
3629- impl < T >  DerefMut  for  UniqueRc < T >  { 
3664+ impl < T :  ? Sized ,   A :   Allocator >  DerefMut  for  UniqueRc < T ,   A >  { 
36303665    fn  deref_mut ( & mut  self )  -> & mut  T  { 
36313666        // SAFETY: This pointer was allocated at creation time so we know it is valid. We know we 
36323667        // have unique ownership and therefore it's safe to make a mutable reference because 
@@ -3636,7 +3671,7 @@ impl<T> DerefMut for UniqueRc<T> {
36363671} 
36373672
36383673#[ unstable( feature = "unique_rc_arc" ,  issue = "112566" ) ]  
3639- unsafe  impl < #[ may_dangle]   T >  Drop  for  UniqueRc < T >  { 
3674+ unsafe  impl < #[ may_dangle]   T :  ? Sized ,   A :   Allocator >  Drop  for  UniqueRc < T ,   A >  { 
36403675    fn  drop ( & mut  self )  { 
36413676        unsafe  { 
36423677            // destroy the contained object 
@@ -3646,7 +3681,7 @@ unsafe impl<#[may_dangle] T> Drop for UniqueRc<T> {
36463681            self . ptr . as_ref ( ) . dec_weak ( ) ; 
36473682
36483683            if  self . ptr . as_ref ( ) . weak ( )  == 0  { 
3649-                 Global . deallocate ( self . ptr . cast ( ) ,  Layout :: for_value_raw ( self . ptr . as_ptr ( ) ) ) ; 
3684+                 self . alloc . deallocate ( self . ptr . cast ( ) ,  Layout :: for_value_raw ( self . ptr . as_ptr ( ) ) ) ; 
36503685            } 
36513686        } 
36523687    } 
0 commit comments