add new_cyclic_in for rc · qinheping/verify-rust-std@ea236f0 (original) (raw)
`@@ -687,6 +687,54 @@ impl<T, A: Allocator> Rc<T, A> {
`
687
687
`}
`
688
688
`}
`
689
689
``
``
690
`+
/// TODO: document
`
``
691
`+
#[cfg(not(no_global_oom_handling))]
`
``
692
`+
#[unstable(feature = "allocator_api", issue = "32838")]
`
``
693
`+
pub fn new_cyclic_in(data_fn: F, alloc: A) -> Rc<T, A>
`
``
694
`+
where
`
``
695
`+
F: FnOnce(&Weak<T, A>) -> T,
`
``
696
`+
{
`
``
697
`+
// Construct the inner in the "uninitialized" state with a single
`
``
698
`+
// weak reference.
`
``
699
`+
let uninit_ptr: NonNull<_> = Box::leak(
`
``
700
`+
Box::new_in(RcBox {
`
``
701
`+
strong: Cell::new(0),
`
``
702
`+
weak: Cell::new(1),
`
``
703
`+
value: mem::MaybeUninit::::uninit(),
`
``
704
`+
}),
`
``
705
`+
alloc,
`
``
706
`+
)
`
``
707
`+
.into();
`
``
708
+
``
709
`+
let init_ptr: NonNull<RcBox> = uninit_ptr.cast();
`
``
710
+
``
711
`+
let weak = Weak { ptr: init_ptr, alloc: Global };
`
``
712
+
``
713
`+
// It's important we don't give up ownership of the weak pointer, or
`
``
714
`` +
// else the memory might be freed by the time data_fn
returns. If
``
``
715
`+
// we really wanted to pass ownership, we could create an additional
`
``
716
`+
// weak pointer for ourselves, but this would result in additional
`
``
717
`+
// updates to the weak reference count which might not be necessary
`
``
718
`+
// otherwise.
`
``
719
`+
let data = data_fn(&weak);
`
``
720
+
``
721
`+
let strong = unsafe {
`
``
722
`+
let inner = init_ptr.as_ptr();
`
``
723
`+
ptr::write(ptr::addr_of_mut!((*inner).value), data);
`
``
724
+
``
725
`+
let prev_value = (*inner).strong.get();
`
``
726
`+
debug_assert_eq!(prev_value, 0, "No prior strong references should exist");
`
``
727
`+
(*inner).strong.set(1);
`
``
728
+
``
729
`+
Rc::from_inner(init_ptr)
`
``
730
`+
};
`
``
731
+
``
732
`+
// Strong references should collectively own a shared weak reference,
`
``
733
`+
// so don't run the destructor for our old weak reference.
`
``
734
`+
mem::forget(weak);
`
``
735
`+
strong
`
``
736
`+
}
`
``
737
+
690
738
`` /// Constructs a new Rc
with uninitialized contents in the provided allocator.
``
691
739
`///
`
692
740
`/// # Examples
`
`@@ -1662,7 +1710,11 @@ impl<T: ?Sized, A: Allocator> Rc<T, A> {
`
1662
1710
`#[inline]
`
1663
1711
`#[stable(feature = "rc_unique", since = "1.4.0")]
`
1664
1712
`pub fn get_mut(this: &mut Self) -> Option<&mut T> {
`
1665
``
`-
if Rc::is_unique(this) { unsafe { Some(Rc::get_mut_unchecked(this)) } } else { None }
`
``
1713
`+
if Rc::is_unique(this) {
`
``
1714
`+
unsafe { Some(Rc::get_mut_unchecked(this)) }
`
``
1715
`+
} else {
`
``
1716
`+
None
`
``
1717
`+
}
`
1666
1718
`}
`
1667
1719
``
1668
1720
`` /// Returns a mutable reference into the given Rc
,
``
`@@ -3239,7 +3291,11 @@ impl<T: ?Sized, A: Allocator> Weak<T, A> {
`
3239
3291
`#[must_use]
`
3240
3292
`#[stable(feature = "weak_counts", since = "1.41.0")]
`
3241
3293
`pub fn strong_count(&self) -> usize {
`
3242
``
`-
if let Some(inner) = self.inner() { inner.strong() } else { 0 }
`
``
3294
`+
if let Some(inner) = self.inner() {
`
``
3295
`+
inner.strong()
`
``
3296
`+
} else {
`
``
3297
`+
0
`
``
3298
`+
}
`
3243
3299
`}
`
3244
3300
``
3245
3301
`` /// Gets the number of Weak
pointers pointing to this allocation.
``