1 #![feature(new_uninit)]
2 #![feature(get_mut_unchecked)]
4 use std::cell::{Cell, RefCell};
5 use std::rc::{Rc, Weak};
10 let r = Rc::new(RefCell::new(42));
12 *r.borrow_mut() += 10;
18 let r = Rc::new(Cell::new(42));
22 assert_eq!(r.get(), 84);
26 let r = Rc::new(RefCell::new(42));
28 *r.borrow_mut() += 10;
32 assert_eq!((*x + *y)/2, 52);
37 let r2 = Rc::into_raw(r.clone());
38 let r2 = unsafe { Rc::from_raw(r2) };
39 assert!(Rc::ptr_eq(&r, &r2));
41 assert!(Rc::try_unwrap(r2).is_ok());
45 fn test() -> Arc<i32> {
49 assert_eq!(*test(), 42);
52 // Make sure this Rc doesn't fall apart when touched
53 fn check_unique_rc<T: ?Sized>(mut r: Rc<T>) {
55 assert!(Rc::get_mut(&mut r).is_none());
57 assert!(Rc::get_mut(&mut r).is_some());
61 check_unique_rc::<[_]>(Rc::from(&[1,2,3] as &[_]));
62 check_unique_rc::<[_]>(Rc::from(vec![1,2,3]));
63 check_unique_rc::<[_]>(Rc::from(Box::new([1,2,3]) as Box<[_]>));
64 check_unique_rc::<str>(Rc::from("Hello, World!"));
68 let p = Rc::new(1) as Rc<dyn Debug>;
69 let a: *const dyn Debug = &*p;
70 let r = Rc::into_raw(p);
72 drop(unsafe { Rc::from_raw(r) });
75 /// Taken from the `Weak::into_raw` doctest.
77 let strong = Rc::new(42);
78 let weak = Rc::downgrade(&strong);
79 let raw = Weak::into_raw(weak);
81 assert_eq!(1, Rc::weak_count(&strong));
82 assert_eq!(42, unsafe { *raw });
84 drop(unsafe { Weak::from_raw(raw) });
85 assert_eq!(0, Rc::weak_count(&strong));
88 /// Taken from the `Weak::from_raw` doctest.
90 let strong = Rc::new(42);
92 let raw_1 = Weak::into_raw(Rc::downgrade(&strong));
93 let raw_2 = Weak::into_raw(Rc::downgrade(&strong));
95 assert_eq!(2, Rc::weak_count(&strong));
97 assert_eq!(42, *Weak::upgrade(&unsafe { Weak::from_raw(raw_1) }).unwrap());
98 assert_eq!(1, Rc::weak_count(&strong));
102 // Decrement the last weak count.
103 assert!(Weak::upgrade(&unsafe { Weak::from_raw(raw_2) }).is_none());
107 let mut five = Rc::<Box<u32>>::new_uninit();
109 // Deferred initialization:
110 Rc::get_mut_unchecked(&mut five).as_mut_ptr().write(Box::new(5));
113 assert_eq!(**five, 5)
116 fn rc_uninit_slice() {
117 let mut values = Rc::<[Box<usize>]>::new_uninit_slice(3);
119 let values = unsafe {
120 // Deferred initialization:
121 Rc::get_mut_unchecked(&mut values)[0].as_mut_ptr().write(Box::new(0));
122 Rc::get_mut_unchecked(&mut values)[1].as_mut_ptr().write(Box::new(1));
123 Rc::get_mut_unchecked(&mut values)[2].as_mut_ptr().write(Box::new(2));
128 for (idx, i) in values.iter().enumerate() {
129 assert_eq!(idx, **i);