@@ -4034,7 +4034,7 @@ impl<T: core::error::Error + ?Sized> core::error::Error for Arc<T> {
40344034/// reference. Multiple weak pointers can be created, but attempts to upgrade those to strong 
40354035/// references will fail unless the `UniqueArc` they point to has been converted into a regular `Arc`. 
40364036/// 
4037- /// Because they are  uniquely owned, the contents of a `UniqueArc` can be freely mutated. A common 
4037+ /// Because it is  uniquely owned, the contents of a `UniqueArc` can be freely mutated. A common 
40384038/// use case is to have an object be mutable during its initialization phase but then have it become 
40394039/// immutable and converted to a normal `Arc`. 
40404040/// 
@@ -4045,7 +4045,6 @@ impl<T: core::error::Error + ?Sized> core::error::Error for Arc<T> {
40454045/// use std::sync::{Arc, Weak, UniqueArc}; 
40464046/// 
40474047/// struct Gadget { 
4048- ///     #[allow(dead_code)] 
40494048///     me: Weak<Gadget>, 
40504049/// } 
40514050/// 
@@ -4065,7 +4064,6 @@ impl<T: core::error::Error + ?Sized> core::error::Error for Arc<T> {
40654064/// previous example, `UniqueArc` allows for more flexibility in the construction of cyclic data, 
40664065/// including fallible or async constructors. 
40674066#[ unstable( feature = "unique_rc_arc" ,  issue = "112566" ) ]  
4068- #[ derive( Debug ) ]  
40694067pub  struct  UniqueArc < 
40704068    T :  ?Sized , 
40714069    #[ unstable( feature = "allocator_api" ,  issue = "32838" ) ]   A :  Allocator  = Global , 
@@ -4080,13 +4078,248 @@ pub struct UniqueArc<
40804078} 
40814079
40824080#[ unstable( feature = "unique_rc_arc" ,  issue = "112566" ) ]  
4081+ unsafe  impl < T :  ?Sized  + Sync  + Send ,  A :  Allocator  + Send >  Send  for  UniqueArc < T ,  A >  { } 
4082+ 
4083+ #[ unstable( feature = "unique_rc_arc" ,  issue = "112566" ) ]  
4084+ unsafe  impl < T :  ?Sized  + Sync  + Send ,  A :  Allocator  + Sync >  Sync  for  UniqueArc < T ,  A >  { } 
4085+ 
4086+ #[ unstable( feature = "unique_rc_arc" ,  issue = "112566" ) ]  
4087+ // #[unstable(feature = "coerce_unsized", issue = "18598")] 
40834088impl < T :  ?Sized  + Unsize < U > ,  U :  ?Sized ,  A :  Allocator >  CoerceUnsized < UniqueArc < U ,  A > > 
40844089    for  UniqueArc < T ,  A > 
40854090{ 
40864091} 
40874092
4088- // Depends on A = Global 
4089- impl < T >  UniqueArc < T >  { 
4093+ //#[unstable(feature = "unique_rc_arc", issue = "112566")] 
4094+ #[ unstable( feature = "dispatch_from_dyn" ,  issue = "none" ) ]  
4095+ impl < T :  ?Sized  + Unsize < U > ,  U :  ?Sized >  DispatchFromDyn < UniqueArc < U > >  for  UniqueArc < T >  { } 
4096+ 
4097+ #[ unstable( feature = "unique_rc_arc" ,  issue = "112566" ) ]  
4098+ impl < T :  ?Sized  + fmt:: Display ,  A :  Allocator >  fmt:: Display  for  UniqueArc < T ,  A >  { 
4099+     fn  fmt ( & self ,  f :  & mut  fmt:: Formatter < ' _ > )  -> fmt:: Result  { 
4100+         fmt:: Display :: fmt ( & * * self ,  f) 
4101+     } 
4102+ } 
4103+ 
4104+ #[ unstable( feature = "unique_rc_arc" ,  issue = "112566" ) ]  
4105+ impl < T :  ?Sized  + fmt:: Debug ,  A :  Allocator >  fmt:: Debug  for  UniqueArc < T ,  A >  { 
4106+     fn  fmt ( & self ,  f :  & mut  fmt:: Formatter < ' _ > )  -> fmt:: Result  { 
4107+         fmt:: Debug :: fmt ( & * * self ,  f) 
4108+     } 
4109+ } 
4110+ 
4111+ #[ unstable( feature = "unique_rc_arc" ,  issue = "112566" ) ]  
4112+ impl < T :  ?Sized ,  A :  Allocator >  fmt:: Pointer  for  UniqueArc < T ,  A >  { 
4113+     fn  fmt ( & self ,  f :  & mut  fmt:: Formatter < ' _ > )  -> fmt:: Result  { 
4114+         fmt:: Pointer :: fmt ( & ( & raw  const  * * self ) ,  f) 
4115+     } 
4116+ } 
4117+ 
4118+ #[ unstable( feature = "unique_rc_arc" ,  issue = "112566" ) ]  
4119+ impl < T :  ?Sized ,  A :  Allocator >  borrow:: Borrow < T >  for  UniqueArc < T ,  A >  { 
4120+     fn  borrow ( & self )  -> & T  { 
4121+         & * * self 
4122+     } 
4123+ } 
4124+ 
4125+ #[ unstable( feature = "unique_rc_arc" ,  issue = "112566" ) ]  
4126+ impl < T :  ?Sized ,  A :  Allocator >  borrow:: BorrowMut < T >  for  UniqueArc < T ,  A >  { 
4127+     fn  borrow_mut ( & mut  self )  -> & mut  T  { 
4128+         & mut  * * self 
4129+     } 
4130+ } 
4131+ 
4132+ #[ unstable( feature = "unique_rc_arc" ,  issue = "112566" ) ]  
4133+ impl < T :  ?Sized ,  A :  Allocator >  AsRef < T >  for  UniqueArc < T ,  A >  { 
4134+     fn  as_ref ( & self )  -> & T  { 
4135+         & * * self 
4136+     } 
4137+ } 
4138+ 
4139+ #[ unstable( feature = "unique_rc_arc" ,  issue = "112566" ) ]  
4140+ impl < T :  ?Sized ,  A :  Allocator >  AsMut < T >  for  UniqueArc < T ,  A >  { 
4141+     fn  as_mut ( & mut  self )  -> & mut  T  { 
4142+         & mut  * * self 
4143+     } 
4144+ } 
4145+ 
4146+ #[ unstable( feature = "unique_rc_arc" ,  issue = "112566" ) ]  
4147+ impl < T :  ?Sized ,  A :  Allocator >  Unpin  for  UniqueArc < T ,  A >  { } 
4148+ 
4149+ #[ unstable( feature = "unique_rc_arc" ,  issue = "112566" ) ]  
4150+ impl < T :  ?Sized  + PartialEq ,  A :  Allocator >  PartialEq  for  UniqueArc < T ,  A >  { 
4151+     /// Equality for two `UniqueArc`s. 
4152+ /// 
4153+ /// Two `UniqueArc`s are equal if their inner values are equal. 
4154+ /// 
4155+ /// # Examples 
4156+ /// 
4157+ /// ``` 
4158+ /// #![feature(unique_rc_arc)] 
4159+ /// use std::sync::UniqueArc; 
4160+ /// 
4161+ /// let five = UniqueArc::new(5); 
4162+ /// 
4163+ /// assert!(five == UniqueArc::new(5)); 
4164+ /// ``` 
4165+ #[ inline]  
4166+     fn  eq ( & self ,  other :  & Self )  -> bool  { 
4167+         PartialEq :: eq ( & * * self ,  & * * other) 
4168+     } 
4169+ 
4170+     /// Inequality for two `UniqueArc`s. 
4171+ /// 
4172+ /// Two `UniqueArc`s are not equal if their inner values are not equal. 
4173+ /// 
4174+ /// # Examples 
4175+ /// 
4176+ /// ``` 
4177+ /// #![feature(unique_rc_arc)] 
4178+ /// use std::sync::UniqueArc; 
4179+ /// 
4180+ /// let five = UniqueArc::new(5); 
4181+ /// 
4182+ /// assert!(five != UniqueArc::new(6)); 
4183+ /// ``` 
4184+ #[ inline]  
4185+     fn  ne ( & self ,  other :  & Self )  -> bool  { 
4186+         PartialEq :: ne ( & * * self ,  & * * other) 
4187+     } 
4188+ } 
4189+ 
4190+ #[ unstable( feature = "unique_rc_arc" ,  issue = "112566" ) ]  
4191+ impl < T :  ?Sized  + PartialOrd ,  A :  Allocator >  PartialOrd  for  UniqueArc < T ,  A >  { 
4192+     /// Partial comparison for two `UniqueArc`s. 
4193+ /// 
4194+ /// The two are compared by calling `partial_cmp()` on their inner values. 
4195+ /// 
4196+ /// # Examples 
4197+ /// 
4198+ /// ``` 
4199+ /// #![feature(unique_rc_arc)] 
4200+ /// use std::sync::UniqueArc; 
4201+ /// use std::cmp::Ordering; 
4202+ /// 
4203+ /// let five = UniqueArc::new(5); 
4204+ /// 
4205+ /// assert_eq!(Some(Ordering::Less), five.partial_cmp(&UniqueArc::new(6))); 
4206+ /// ``` 
4207+ #[ inline( always) ]  
4208+     fn  partial_cmp ( & self ,  other :  & UniqueArc < T ,  A > )  -> Option < Ordering >  { 
4209+         ( * * self ) . partial_cmp ( & * * other) 
4210+     } 
4211+ 
4212+     /// Less-than comparison for two `UniqueArc`s. 
4213+ /// 
4214+ /// The two are compared by calling `<` on their inner values. 
4215+ /// 
4216+ /// # Examples 
4217+ /// 
4218+ /// ``` 
4219+ /// #![feature(unique_rc_arc)] 
4220+ /// use std::sync::UniqueArc; 
4221+ /// 
4222+ /// let five = UniqueArc::new(5); 
4223+ /// 
4224+ /// assert!(five < UniqueArc::new(6)); 
4225+ /// ``` 
4226+ #[ inline( always) ]  
4227+     fn  lt ( & self ,  other :  & UniqueArc < T ,  A > )  -> bool  { 
4228+         * * self  < * * other
4229+     } 
4230+ 
4231+     /// 'Less than or equal to' comparison for two `UniqueArc`s. 
4232+ /// 
4233+ /// The two are compared by calling `<=` on their inner values. 
4234+ /// 
4235+ /// # Examples 
4236+ /// 
4237+ /// ``` 
4238+ /// #![feature(unique_rc_arc)] 
4239+ /// use std::sync::UniqueArc; 
4240+ /// 
4241+ /// let five = UniqueArc::new(5); 
4242+ /// 
4243+ /// assert!(five <= UniqueArc::new(5)); 
4244+ /// ``` 
4245+ #[ inline( always) ]  
4246+     fn  le ( & self ,  other :  & UniqueArc < T ,  A > )  -> bool  { 
4247+         * * self  <= * * other
4248+     } 
4249+ 
4250+     /// Greater-than comparison for two `UniqueArc`s. 
4251+ /// 
4252+ /// The two are compared by calling `>` on their inner values. 
4253+ /// 
4254+ /// # Examples 
4255+ /// 
4256+ /// ``` 
4257+ /// #![feature(unique_rc_arc)] 
4258+ /// use std::sync::UniqueArc; 
4259+ /// 
4260+ /// let five = UniqueArc::new(5); 
4261+ /// 
4262+ /// assert!(five > UniqueArc::new(4)); 
4263+ /// ``` 
4264+ #[ inline( always) ]  
4265+     fn  gt ( & self ,  other :  & UniqueArc < T ,  A > )  -> bool  { 
4266+         * * self  > * * other
4267+     } 
4268+ 
4269+     /// 'Greater than or equal to' comparison for two `UniqueArc`s. 
4270+ /// 
4271+ /// The two are compared by calling `>=` on their inner values. 
4272+ /// 
4273+ /// # Examples 
4274+ /// 
4275+ /// ``` 
4276+ /// #![feature(unique_rc_arc)] 
4277+ /// use std::sync::UniqueArc; 
4278+ /// 
4279+ /// let five = UniqueArc::new(5); 
4280+ /// 
4281+ /// assert!(five >= UniqueArc::new(5)); 
4282+ /// ``` 
4283+ #[ inline( always) ]  
4284+     fn  ge ( & self ,  other :  & UniqueArc < T ,  A > )  -> bool  { 
4285+         * * self  >= * * other
4286+     } 
4287+ } 
4288+ 
4289+ #[ unstable( feature = "unique_rc_arc" ,  issue = "112566" ) ]  
4290+ impl < T :  ?Sized  + Ord ,  A :  Allocator >  Ord  for  UniqueArc < T ,  A >  { 
4291+     /// Comparison for two `UniqueArc`s. 
4292+ /// 
4293+ /// The two are compared by calling `cmp()` on their inner values. 
4294+ /// 
4295+ /// # Examples 
4296+ /// 
4297+ /// ``` 
4298+ /// #![feature(unique_rc_arc)] 
4299+ /// use std::sync::UniqueArc; 
4300+ /// use std::cmp::Ordering; 
4301+ /// 
4302+ /// let five = UniqueArc::new(5); 
4303+ /// 
4304+ /// assert_eq!(Ordering::Less, five.cmp(&UniqueArc::new(6))); 
4305+ /// ``` 
4306+ #[ inline]  
4307+     fn  cmp ( & self ,  other :  & UniqueArc < T ,  A > )  -> Ordering  { 
4308+         ( * * self ) . cmp ( & * * other) 
4309+     } 
4310+ } 
4311+ 
4312+ #[ unstable( feature = "unique_rc_arc" ,  issue = "112566" ) ]  
4313+ impl < T :  ?Sized  + Eq ,  A :  Allocator >  Eq  for  UniqueArc < T ,  A >  { } 
4314+ 
4315+ #[ unstable( feature = "unique_rc_arc" ,  issue = "112566" ) ]  
4316+ impl < T :  ?Sized  + Hash ,  A :  Allocator >  Hash  for  UniqueArc < T ,  A >  { 
4317+     fn  hash < H :  Hasher > ( & self ,  state :  & mut  H )  { 
4318+         ( * * self ) . hash ( state) ; 
4319+     } 
4320+ } 
4321+ 
4322+ impl < T >  UniqueArc < T ,  Global >  { 
40904323    /// Creates a new `UniqueArc`. 
40914324/// 
40924325/// Weak references to this `UniqueArc` can be created with [`UniqueArc::downgrade`]. Upgrading 
@@ -4095,6 +4328,7 @@ impl<T> UniqueArc<T> {
40954328/// point to the new [`Arc`]. 
40964329#[ cfg( not( no_global_oom_handling) ) ]  
40974330    #[ unstable( feature = "unique_rc_arc" ,  issue = "112566" ) ]  
4331+     #[ must_use]  
40984332    pub  fn  new ( value :  T )  -> Self  { 
40994333        Self :: new_in ( value,  Global ) 
41004334    } 
@@ -4109,6 +4343,8 @@ impl<T, A: Allocator> UniqueArc<T, A> {
41094343/// point to the new [`Arc`]. 
41104344#[ cfg( not( no_global_oom_handling) ) ]  
41114345    #[ unstable( feature = "unique_rc_arc" ,  issue = "112566" ) ]  
4346+     #[ must_use]  
4347+     // #[unstable(feature = "allocator_api", issue = "32838")] 
41124348    pub  fn  new_in ( data :  T ,  alloc :  A )  -> Self  { 
41134349        let  ( ptr,  alloc)  = Box :: into_unique ( Box :: new_in ( 
41144350            ArcInner  { 
@@ -4133,6 +4369,7 @@ impl<T: ?Sized, A: Allocator> UniqueArc<T, A> {
41334369/// Any weak references created before this method is called can now be upgraded to strong 
41344370/// references. 
41354371#[ unstable( feature = "unique_rc_arc" ,  issue = "112566" ) ]  
4372+     #[ must_use]  
41364373    pub  fn  into_arc ( this :  Self )  -> Arc < T ,  A >  { 
41374374        let  this = ManuallyDrop :: new ( this) ; 
41384375
@@ -4156,6 +4393,7 @@ impl<T: ?Sized, A: Allocator + Clone> UniqueArc<T, A> {
41564393/// Attempting to upgrade this weak reference will fail before the `UniqueArc` has been converted 
41574394/// to a [`Arc`] using [`UniqueArc::into_arc`]. 
41584395#[ unstable( feature = "unique_rc_arc" ,  issue = "112566" ) ]  
4396+     #[ must_use]  
41594397    pub  fn  downgrade ( this :  & Self )  -> Weak < T ,  A >  { 
41604398        // Using a relaxed ordering is alright here, as knowledge of the 
41614399        // original reference prevents other threads from erroneously deleting 
@@ -4197,6 +4435,9 @@ impl<T: ?Sized, A: Allocator> DerefMut for UniqueArc<T, A> {
41974435        // SAFETY: This pointer was allocated at creation time so we know it is valid. We know we 
41984436        // have unique ownership and therefore it's safe to make a mutable reference because 
41994437        // `UniqueArc` owns the only strong reference to itself. 
4438+         // We also need to be careful to only create a mutable reference to the `data` field, 
4439+         // as a mutable reference to the entire `ArcInner` would assert uniqueness over the 
4440+         // ref count fields too, invalidating any attempt by `Weak`s to access the ref count. 
42004441        unsafe  {  & mut  ( * self . ptr . as_ptr ( ) ) . data  } 
42014442    } 
42024443} 
0 commit comments