]> git.lizzy.rs Git - rust.git/blob - src/libcore/cell.rs
Auto merge of #35627 - apasel422:coerce-cell, r=alexcrichton
[rust.git] / src / libcore / cell.rs
1 // Copyright 2012-2014 The Rust Project Developers. See the COPYRIGHT
2 // file at the top-level directory of this distribution and at
3 // http://rust-lang.org/COPYRIGHT.
4 //
5 // Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
6 // http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
7 // <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
8 // option. This file may not be copied, modified, or distributed
9 // except according to those terms.
10
11 //! Shareable mutable containers.
12 //!
13 //! Values of the `Cell<T>` and `RefCell<T>` types may be mutated through shared references (i.e.
14 //! the common `&T` type), whereas most Rust types can only be mutated through unique (`&mut T`)
15 //! references. We say that `Cell<T>` and `RefCell<T>` provide 'interior mutability', in contrast
16 //! with typical Rust types that exhibit 'inherited mutability'.
17 //!
18 //! Cell types come in two flavors: `Cell<T>` and `RefCell<T>`. `Cell<T>` provides `get` and `set`
19 //! methods that change the interior value with a single method call. `Cell<T>` though is only
20 //! compatible with types that implement `Copy`. For other types, one must use the `RefCell<T>`
21 //! type, acquiring a write lock before mutating.
22 //!
23 //! `RefCell<T>` uses Rust's lifetimes to implement 'dynamic borrowing', a process whereby one can
24 //! claim temporary, exclusive, mutable access to the inner value. Borrows for `RefCell<T>`s are
25 //! tracked 'at runtime', unlike Rust's native reference types which are entirely tracked
26 //! statically, at compile time. Because `RefCell<T>` borrows are dynamic it is possible to attempt
27 //! to borrow a value that is already mutably borrowed; when this happens it results in thread
28 //! panic.
29 //!
30 //! # When to choose interior mutability
31 //!
32 //! The more common inherited mutability, where one must have unique access to mutate a value, is
33 //! one of the key language elements that enables Rust to reason strongly about pointer aliasing,
34 //! statically preventing crash bugs. Because of that, inherited mutability is preferred, and
35 //! interior mutability is something of a last resort. Since cell types enable mutation where it
36 //! would otherwise be disallowed though, there are occasions when interior mutability might be
37 //! appropriate, or even *must* be used, e.g.
38 //!
39 //! * Introducing mutability 'inside' of something immutable
40 //! * Implementation details of logically-immutable methods.
41 //! * Mutating implementations of `Clone`.
42 //!
43 //! ## Introducing mutability 'inside' of something immutable
44 //!
45 //! Many shared smart pointer types, including `Rc<T>` and `Arc<T>`, provide containers that can be
46 //! cloned and shared between multiple parties. Because the contained values may be
47 //! multiply-aliased, they can only be borrowed with `&`, not `&mut`. Without cells it would be
48 //! impossible to mutate data inside of these smart pointers at all.
49 //!
50 //! It's very common then to put a `RefCell<T>` inside shared pointer types to reintroduce
51 //! mutability:
52 //!
53 //! ```
54 //! use std::collections::HashMap;
55 //! use std::cell::RefCell;
56 //! use std::rc::Rc;
57 //!
58 //! fn main() {
59 //!     let shared_map: Rc<RefCell<_>> = Rc::new(RefCell::new(HashMap::new()));
60 //!     shared_map.borrow_mut().insert("africa", 92388);
61 //!     shared_map.borrow_mut().insert("kyoto", 11837);
62 //!     shared_map.borrow_mut().insert("piccadilly", 11826);
63 //!     shared_map.borrow_mut().insert("marbles", 38);
64 //! }
65 //! ```
66 //!
67 //! Note that this example uses `Rc<T>` and not `Arc<T>`. `RefCell<T>`s are for single-threaded
68 //! scenarios. Consider using `RwLock<T>` or `Mutex<T>` if you need shared mutability in a
69 //! multi-threaded situation.
70 //!
71 //! ## Implementation details of logically-immutable methods
72 //!
73 //! Occasionally it may be desirable not to expose in an API that there is mutation happening
74 //! "under the hood". This may be because logically the operation is immutable, but e.g. caching
75 //! forces the implementation to perform mutation; or because you must employ mutation to implement
76 //! a trait method that was originally defined to take `&self`.
77 //!
78 //! ```
79 //! # #![allow(dead_code)]
80 //! use std::cell::RefCell;
81 //!
82 //! struct Graph {
83 //!     edges: Vec<(i32, i32)>,
84 //!     span_tree_cache: RefCell<Option<Vec<(i32, i32)>>>
85 //! }
86 //!
87 //! impl Graph {
88 //!     fn minimum_spanning_tree(&self) -> Vec<(i32, i32)> {
89 //!         // Create a new scope to contain the lifetime of the
90 //!         // dynamic borrow
91 //!         {
92 //!             // Take a reference to the inside of cache cell
93 //!             let mut cache = self.span_tree_cache.borrow_mut();
94 //!             if cache.is_some() {
95 //!                 return cache.as_ref().unwrap().clone();
96 //!             }
97 //!
98 //!             let span_tree = self.calc_span_tree();
99 //!             *cache = Some(span_tree);
100 //!         }
101 //!
102 //!         // Recursive call to return the just-cached value.
103 //!         // Note that if we had not let the previous borrow
104 //!         // of the cache fall out of scope then the subsequent
105 //!         // recursive borrow would cause a dynamic thread panic.
106 //!         // This is the major hazard of using `RefCell`.
107 //!         self.minimum_spanning_tree()
108 //!     }
109 //! #   fn calc_span_tree(&self) -> Vec<(i32, i32)> { vec![] }
110 //! }
111 //! ```
112 //!
113 //! ## Mutating implementations of `Clone`
114 //!
115 //! This is simply a special - but common - case of the previous: hiding mutability for operations
116 //! that appear to be immutable. The `clone` method is expected to not change the source value, and
117 //! is declared to take `&self`, not `&mut self`. Therefore any mutation that happens in the
118 //! `clone` method must use cell types. For example, `Rc<T>` maintains its reference counts within a
119 //! `Cell<T>`.
120 //!
121 //! ```
122 //! use std::cell::Cell;
123 //!
124 //! struct Rc<T> {
125 //!     ptr: *mut RcBox<T>
126 //! }
127 //!
128 //! struct RcBox<T> {
129 //! # #[allow(dead_code)]
130 //!     value: T,
131 //!     refcount: Cell<usize>
132 //! }
133 //!
134 //! impl<T> Clone for Rc<T> {
135 //!     fn clone(&self) -> Rc<T> {
136 //!         unsafe {
137 //!             (*self.ptr).refcount.set((*self.ptr).refcount.get() + 1);
138 //!             Rc { ptr: self.ptr }
139 //!         }
140 //!     }
141 //! }
142 //! ```
143 //!
144
145 #![stable(feature = "rust1", since = "1.0.0")]
146
147 use clone::Clone;
148 use cmp::{PartialEq, Eq, PartialOrd, Ord, Ordering};
149 use convert::From;
150 use default::Default;
151 use fmt::{self, Debug, Display};
152 use marker::{Copy, PhantomData, Send, Sync, Sized, Unsize};
153 use ops::{Deref, DerefMut, Drop, FnOnce, CoerceUnsized};
154 use option::Option;
155 use option::Option::{None, Some};
156 use result::Result;
157 use result::Result::{Ok, Err};
158
159 /// A mutable memory location that admits only `Copy` data.
160 ///
161 /// See the [module-level documentation](index.html) for more.
162 #[stable(feature = "rust1", since = "1.0.0")]
163 pub struct Cell<T> {
164     value: UnsafeCell<T>,
165 }
166
167 impl<T:Copy> Cell<T> {
168     /// Creates a new `Cell` containing the given value.
169     ///
170     /// # Examples
171     ///
172     /// ```
173     /// use std::cell::Cell;
174     ///
175     /// let c = Cell::new(5);
176     /// ```
177     #[stable(feature = "rust1", since = "1.0.0")]
178     #[inline]
179     pub const fn new(value: T) -> Cell<T> {
180         Cell {
181             value: UnsafeCell::new(value),
182         }
183     }
184
185     /// Returns a copy of the contained value.
186     ///
187     /// # Examples
188     ///
189     /// ```
190     /// use std::cell::Cell;
191     ///
192     /// let c = Cell::new(5);
193     ///
194     /// let five = c.get();
195     /// ```
196     #[inline]
197     #[stable(feature = "rust1", since = "1.0.0")]
198     pub fn get(&self) -> T {
199         unsafe{ *self.value.get() }
200     }
201
202     /// Sets the contained value.
203     ///
204     /// # Examples
205     ///
206     /// ```
207     /// use std::cell::Cell;
208     ///
209     /// let c = Cell::new(5);
210     ///
211     /// c.set(10);
212     /// ```
213     #[inline]
214     #[stable(feature = "rust1", since = "1.0.0")]
215     pub fn set(&self, value: T) {
216         unsafe {
217             *self.value.get() = value;
218         }
219     }
220
221     /// Returns a reference to the underlying `UnsafeCell`.
222     ///
223     /// # Examples
224     ///
225     /// ```
226     /// #![feature(as_unsafe_cell)]
227     ///
228     /// use std::cell::Cell;
229     ///
230     /// let c = Cell::new(5);
231     ///
232     /// let uc = c.as_unsafe_cell();
233     /// ```
234     #[inline]
235     #[unstable(feature = "as_unsafe_cell", issue = "27708")]
236     #[rustc_deprecated(since = "1.12.0", reason = "renamed to as_ptr")]
237     pub fn as_unsafe_cell(&self) -> &UnsafeCell<T> {
238         &self.value
239     }
240
241     /// Returns a raw pointer to the underlying data in this cell.
242     ///
243     /// # Examples
244     ///
245     /// ```
246     /// use std::cell::Cell;
247     ///
248     /// let c = Cell::new(5);
249     ///
250     /// let ptr = c.as_ptr();
251     /// ```
252     #[inline]
253     #[stable(feature = "cell_as_ptr", since = "1.12.0")]
254     pub fn as_ptr(&self) -> *mut T {
255         self.value.get()
256     }
257
258     /// Returns a mutable reference to the underlying data.
259     ///
260     /// This call borrows `Cell` mutably (at compile-time) which guarantees
261     /// that we possess the only reference.
262     ///
263     /// # Examples
264     ///
265     /// ```
266     /// use std::cell::Cell;
267     ///
268     /// let mut c = Cell::new(5);
269     /// *c.get_mut() += 1;
270     ///
271     /// assert_eq!(c.get(), 6);
272     /// ```
273     #[inline]
274     #[stable(feature = "cell_get_mut", since = "1.11.0")]
275     pub fn get_mut(&mut self) -> &mut T {
276         unsafe {
277             &mut *self.value.get()
278         }
279     }
280 }
281
282 #[stable(feature = "rust1", since = "1.0.0")]
283 unsafe impl<T> Send for Cell<T> where T: Send {}
284
285 #[stable(feature = "rust1", since = "1.0.0")]
286 impl<T> !Sync for Cell<T> {}
287
288 #[stable(feature = "rust1", since = "1.0.0")]
289 impl<T:Copy> Clone for Cell<T> {
290     #[inline]
291     fn clone(&self) -> Cell<T> {
292         Cell::new(self.get())
293     }
294 }
295
296 #[stable(feature = "rust1", since = "1.0.0")]
297 impl<T:Default + Copy> Default for Cell<T> {
298     #[inline]
299     fn default() -> Cell<T> {
300         Cell::new(Default::default())
301     }
302 }
303
304 #[stable(feature = "rust1", since = "1.0.0")]
305 impl<T:PartialEq + Copy> PartialEq for Cell<T> {
306     #[inline]
307     fn eq(&self, other: &Cell<T>) -> bool {
308         self.get() == other.get()
309     }
310 }
311
312 #[stable(feature = "cell_eq", since = "1.2.0")]
313 impl<T:Eq + Copy> Eq for Cell<T> {}
314
315 #[stable(feature = "cell_ord", since = "1.10.0")]
316 impl<T:PartialOrd + Copy> PartialOrd for Cell<T> {
317     #[inline]
318     fn partial_cmp(&self, other: &Cell<T>) -> Option<Ordering> {
319         self.get().partial_cmp(&other.get())
320     }
321
322     #[inline]
323     fn lt(&self, other: &Cell<T>) -> bool {
324         self.get() < other.get()
325     }
326
327     #[inline]
328     fn le(&self, other: &Cell<T>) -> bool {
329         self.get() <= other.get()
330     }
331
332     #[inline]
333     fn gt(&self, other: &Cell<T>) -> bool {
334         self.get() > other.get()
335     }
336
337     #[inline]
338     fn ge(&self, other: &Cell<T>) -> bool {
339         self.get() >= other.get()
340     }
341 }
342
343 #[stable(feature = "cell_ord", since = "1.10.0")]
344 impl<T:Ord + Copy> Ord for Cell<T> {
345     #[inline]
346     fn cmp(&self, other: &Cell<T>) -> Ordering {
347         self.get().cmp(&other.get())
348     }
349 }
350
351 #[stable(feature = "cell_from", since = "1.12.0")]
352 impl<T: Copy> From<T> for Cell<T> {
353     fn from(t: T) -> Cell<T> {
354         Cell::new(t)
355     }
356 }
357
358 #[unstable(feature = "coerce_unsized", issue = "27732")]
359 impl<T: CoerceUnsized<U>, U> CoerceUnsized<Cell<U>> for Cell<T> {}
360
361 /// A mutable memory location with dynamically checked borrow rules
362 ///
363 /// See the [module-level documentation](index.html) for more.
364 #[stable(feature = "rust1", since = "1.0.0")]
365 pub struct RefCell<T: ?Sized> {
366     borrow: Cell<BorrowFlag>,
367     value: UnsafeCell<T>,
368 }
369
370 /// An enumeration of values returned from the `state` method on a `RefCell<T>`.
371 #[derive(Copy, Clone, PartialEq, Eq, Debug)]
372 #[unstable(feature = "borrow_state", issue = "27733")]
373 pub enum BorrowState {
374     /// The cell is currently being read, there is at least one active `borrow`.
375     Reading,
376     /// The cell is currently being written to, there is an active `borrow_mut`.
377     Writing,
378     /// There are no outstanding borrows on this cell.
379     Unused,
380 }
381
382 /// An error returned by [`RefCell::try_borrow`](struct.RefCell.html#method.try_borrow).
383 #[unstable(feature = "try_borrow", issue = "35070")]
384 pub struct BorrowError<'a, T: 'a + ?Sized> {
385     marker: PhantomData<&'a RefCell<T>>,
386 }
387
388 #[unstable(feature = "try_borrow", issue = "35070")]
389 impl<'a, T: ?Sized> Debug for BorrowError<'a, T> {
390     fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
391         f.debug_struct("BorrowError").finish()
392     }
393 }
394
395 #[unstable(feature = "try_borrow", issue = "35070")]
396 impl<'a, T: ?Sized> Display for BorrowError<'a, T> {
397     fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
398         Display::fmt("already mutably borrowed", f)
399     }
400 }
401
402 /// An error returned by [`RefCell::try_borrow_mut`](struct.RefCell.html#method.try_borrow_mut).
403 #[unstable(feature = "try_borrow", issue = "35070")]
404 pub struct BorrowMutError<'a, T: 'a + ?Sized> {
405     marker: PhantomData<&'a RefCell<T>>,
406 }
407
408 #[unstable(feature = "try_borrow", issue = "35070")]
409 impl<'a, T: ?Sized> Debug for BorrowMutError<'a, T> {
410     fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
411         f.debug_struct("BorrowMutError").finish()
412     }
413 }
414
415 #[unstable(feature = "try_borrow", issue = "35070")]
416 impl<'a, T: ?Sized> Display for BorrowMutError<'a, T> {
417     fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
418         Display::fmt("already borrowed", f)
419     }
420 }
421
422 // Values [1, MAX-1] represent the number of `Ref` active
423 // (will not outgrow its range since `usize` is the size of the address space)
424 type BorrowFlag = usize;
425 const UNUSED: BorrowFlag = 0;
426 const WRITING: BorrowFlag = !0;
427
428 impl<T> RefCell<T> {
429     /// Creates a new `RefCell` containing `value`.
430     ///
431     /// # Examples
432     ///
433     /// ```
434     /// use std::cell::RefCell;
435     ///
436     /// let c = RefCell::new(5);
437     /// ```
438     #[stable(feature = "rust1", since = "1.0.0")]
439     #[inline]
440     pub const fn new(value: T) -> RefCell<T> {
441         RefCell {
442             value: UnsafeCell::new(value),
443             borrow: Cell::new(UNUSED),
444         }
445     }
446
447     /// Consumes the `RefCell`, returning the wrapped value.
448     ///
449     /// # Examples
450     ///
451     /// ```
452     /// use std::cell::RefCell;
453     ///
454     /// let c = RefCell::new(5);
455     ///
456     /// let five = c.into_inner();
457     /// ```
458     #[stable(feature = "rust1", since = "1.0.0")]
459     #[inline]
460     pub fn into_inner(self) -> T {
461         // Since this function takes `self` (the `RefCell`) by value, the
462         // compiler statically verifies that it is not currently borrowed.
463         // Therefore the following assertion is just a `debug_assert!`.
464         debug_assert!(self.borrow.get() == UNUSED);
465         unsafe { self.value.into_inner() }
466     }
467 }
468
469 impl<T: ?Sized> RefCell<T> {
470     /// Query the current state of this `RefCell`
471     ///
472     /// The returned value can be dispatched on to determine if a call to
473     /// `borrow` or `borrow_mut` would succeed.
474     ///
475     /// # Examples
476     ///
477     /// ```
478     /// #![feature(borrow_state)]
479     ///
480     /// use std::cell::{BorrowState, RefCell};
481     ///
482     /// let c = RefCell::new(5);
483     ///
484     /// match c.borrow_state() {
485     ///     BorrowState::Writing => println!("Cannot be borrowed"),
486     ///     BorrowState::Reading => println!("Cannot be borrowed mutably"),
487     ///     BorrowState::Unused => println!("Can be borrowed (mutably as well)"),
488     /// }
489     /// ```
490     #[unstable(feature = "borrow_state", issue = "27733")]
491     #[inline]
492     pub fn borrow_state(&self) -> BorrowState {
493         match self.borrow.get() {
494             WRITING => BorrowState::Writing,
495             UNUSED => BorrowState::Unused,
496             _ => BorrowState::Reading,
497         }
498     }
499
500     /// Immutably borrows the wrapped value.
501     ///
502     /// The borrow lasts until the returned `Ref` exits scope. Multiple
503     /// immutable borrows can be taken out at the same time.
504     ///
505     /// # Panics
506     ///
507     /// Panics if the value is currently mutably borrowed. For a non-panicking variant, use
508     /// [`try_borrow`](#method.try_borrow).
509     ///
510     /// # Examples
511     ///
512     /// ```
513     /// use std::cell::RefCell;
514     ///
515     /// let c = RefCell::new(5);
516     ///
517     /// let borrowed_five = c.borrow();
518     /// let borrowed_five2 = c.borrow();
519     /// ```
520     ///
521     /// An example of panic:
522     ///
523     /// ```
524     /// use std::cell::RefCell;
525     /// use std::thread;
526     ///
527     /// let result = thread::spawn(move || {
528     ///    let c = RefCell::new(5);
529     ///    let m = c.borrow_mut();
530     ///
531     ///    let b = c.borrow(); // this causes a panic
532     /// }).join();
533     ///
534     /// assert!(result.is_err());
535     /// ```
536     #[stable(feature = "rust1", since = "1.0.0")]
537     #[inline]
538     pub fn borrow(&self) -> Ref<T> {
539         self.try_borrow().expect("already mutably borrowed")
540     }
541
542     /// Immutably borrows the wrapped value, returning an error if the value is currently mutably
543     /// borrowed.
544     ///
545     /// The borrow lasts until the returned `Ref` exits scope. Multiple immutable borrows can be
546     /// taken out at the same time.
547     ///
548     /// This is the non-panicking variant of [`borrow`](#method.borrow).
549     ///
550     /// # Examples
551     ///
552     /// ```
553     /// #![feature(try_borrow)]
554     ///
555     /// use std::cell::RefCell;
556     ///
557     /// let c = RefCell::new(5);
558     ///
559     /// {
560     ///     let m = c.borrow_mut();
561     ///     assert!(c.try_borrow().is_err());
562     /// }
563     ///
564     /// {
565     ///     let m = c.borrow();
566     ///     assert!(c.try_borrow().is_ok());
567     /// }
568     /// ```
569     #[unstable(feature = "try_borrow", issue = "35070")]
570     #[inline]
571     pub fn try_borrow(&self) -> Result<Ref<T>, BorrowError<T>> {
572         match BorrowRef::new(&self.borrow) {
573             Some(b) => Ok(Ref {
574                 value: unsafe { &*self.value.get() },
575                 borrow: b,
576             }),
577             None => Err(BorrowError { marker: PhantomData }),
578         }
579     }
580
581     /// Mutably borrows the wrapped value.
582     ///
583     /// The borrow lasts until the returned `RefMut` exits scope. The value
584     /// cannot be borrowed while this borrow is active.
585     ///
586     /// # Panics
587     ///
588     /// Panics if the value is currently borrowed. For a non-panicking variant, use
589     /// [`try_borrow_mut`](#method.try_borrow_mut).
590     ///
591     /// # Examples
592     ///
593     /// ```
594     /// use std::cell::RefCell;
595     ///
596     /// let c = RefCell::new(5);
597     ///
598     /// *c.borrow_mut() = 7;
599     ///
600     /// assert_eq!(*c.borrow(), 7);
601     /// ```
602     ///
603     /// An example of panic:
604     ///
605     /// ```
606     /// use std::cell::RefCell;
607     /// use std::thread;
608     ///
609     /// let result = thread::spawn(move || {
610     ///    let c = RefCell::new(5);
611     ///    let m = c.borrow();
612     ///
613     ///    let b = c.borrow_mut(); // this causes a panic
614     /// }).join();
615     ///
616     /// assert!(result.is_err());
617     /// ```
618     #[stable(feature = "rust1", since = "1.0.0")]
619     #[inline]
620     pub fn borrow_mut(&self) -> RefMut<T> {
621         self.try_borrow_mut().expect("already borrowed")
622     }
623
624     /// Mutably borrows the wrapped value, returning an error if the value is currently borrowed.
625     ///
626     /// The borrow lasts until the returned `RefMut` exits scope. The value cannot be borrowed
627     /// while this borrow is active.
628     ///
629     /// This is the non-panicking variant of [`borrow_mut`](#method.borrow_mut).
630     ///
631     /// # Examples
632     ///
633     /// ```
634     /// #![feature(try_borrow)]
635     ///
636     /// use std::cell::RefCell;
637     ///
638     /// let c = RefCell::new(5);
639     ///
640     /// {
641     ///     let m = c.borrow();
642     ///     assert!(c.try_borrow_mut().is_err());
643     /// }
644     ///
645     /// assert!(c.try_borrow_mut().is_ok());
646     /// ```
647     #[unstable(feature = "try_borrow", issue = "35070")]
648     #[inline]
649     pub fn try_borrow_mut(&self) -> Result<RefMut<T>, BorrowMutError<T>> {
650         match BorrowRefMut::new(&self.borrow) {
651             Some(b) => Ok(RefMut {
652                 value: unsafe { &mut *self.value.get() },
653                 borrow: b,
654             }),
655             None => Err(BorrowMutError { marker: PhantomData }),
656         }
657     }
658
659     /// Returns a reference to the underlying `UnsafeCell`.
660     ///
661     /// This can be used to circumvent `RefCell`'s safety checks.
662     ///
663     /// This function is `unsafe` because `UnsafeCell`'s field is public.
664     ///
665     /// # Examples
666     ///
667     /// ```
668     /// #![feature(as_unsafe_cell)]
669     ///
670     /// use std::cell::RefCell;
671     ///
672     /// let c = RefCell::new(5);
673     /// let c = unsafe { c.as_unsafe_cell() };
674     /// ```
675     #[inline]
676     #[unstable(feature = "as_unsafe_cell", issue = "27708")]
677     #[rustc_deprecated(since = "1.12.0", reason = "renamed to as_ptr")]
678     pub unsafe fn as_unsafe_cell(&self) -> &UnsafeCell<T> {
679         &self.value
680     }
681
682     /// Returns a raw pointer to the underlying data in this cell.
683     ///
684     /// # Examples
685     ///
686     /// ```
687     /// use std::cell::RefCell;
688     ///
689     /// let c = RefCell::new(5);
690     ///
691     /// let ptr = c.as_ptr();
692     /// ```
693     #[inline]
694     #[stable(feature = "cell_as_ptr", since = "1.12.0")]
695     pub fn as_ptr(&self) -> *mut T {
696         self.value.get()
697     }
698
699     /// Returns a mutable reference to the underlying data.
700     ///
701     /// This call borrows `RefCell` mutably (at compile-time) so there is no
702     /// need for dynamic checks.
703     ///
704     /// # Examples
705     ///
706     /// ```
707     /// use std::cell::RefCell;
708     ///
709     /// let mut c = RefCell::new(5);
710     /// *c.get_mut() += 1;
711     ///
712     /// assert_eq!(c, RefCell::new(6));
713     /// ```
714     #[inline]
715     #[stable(feature = "cell_get_mut", since = "1.11.0")]
716     pub fn get_mut(&mut self) -> &mut T {
717         unsafe {
718             &mut *self.value.get()
719         }
720     }
721 }
722
723 #[stable(feature = "rust1", since = "1.0.0")]
724 unsafe impl<T: ?Sized> Send for RefCell<T> where T: Send {}
725
726 #[stable(feature = "rust1", since = "1.0.0")]
727 impl<T: ?Sized> !Sync for RefCell<T> {}
728
729 #[stable(feature = "rust1", since = "1.0.0")]
730 impl<T: Clone> Clone for RefCell<T> {
731     #[inline]
732     fn clone(&self) -> RefCell<T> {
733         RefCell::new(self.borrow().clone())
734     }
735 }
736
737 #[stable(feature = "rust1", since = "1.0.0")]
738 impl<T:Default> Default for RefCell<T> {
739     #[inline]
740     fn default() -> RefCell<T> {
741         RefCell::new(Default::default())
742     }
743 }
744
745 #[stable(feature = "rust1", since = "1.0.0")]
746 impl<T: ?Sized + PartialEq> PartialEq for RefCell<T> {
747     #[inline]
748     fn eq(&self, other: &RefCell<T>) -> bool {
749         *self.borrow() == *other.borrow()
750     }
751 }
752
753 #[stable(feature = "cell_eq", since = "1.2.0")]
754 impl<T: ?Sized + Eq> Eq for RefCell<T> {}
755
756 #[stable(feature = "cell_ord", since = "1.10.0")]
757 impl<T: ?Sized + PartialOrd> PartialOrd for RefCell<T> {
758     #[inline]
759     fn partial_cmp(&self, other: &RefCell<T>) -> Option<Ordering> {
760         self.borrow().partial_cmp(&*other.borrow())
761     }
762
763     #[inline]
764     fn lt(&self, other: &RefCell<T>) -> bool {
765         *self.borrow() < *other.borrow()
766     }
767
768     #[inline]
769     fn le(&self, other: &RefCell<T>) -> bool {
770         *self.borrow() <= *other.borrow()
771     }
772
773     #[inline]
774     fn gt(&self, other: &RefCell<T>) -> bool {
775         *self.borrow() > *other.borrow()
776     }
777
778     #[inline]
779     fn ge(&self, other: &RefCell<T>) -> bool {
780         *self.borrow() >= *other.borrow()
781     }
782 }
783
784 #[stable(feature = "cell_ord", since = "1.10.0")]
785 impl<T: ?Sized + Ord> Ord for RefCell<T> {
786     #[inline]
787     fn cmp(&self, other: &RefCell<T>) -> Ordering {
788         self.borrow().cmp(&*other.borrow())
789     }
790 }
791
792 #[stable(feature = "cell_from", since = "1.12.0")]
793 impl<T> From<T> for RefCell<T> {
794     fn from(t: T) -> RefCell<T> {
795         RefCell::new(t)
796     }
797 }
798
799 #[unstable(feature = "coerce_unsized", issue = "27732")]
800 impl<T: CoerceUnsized<U>, U> CoerceUnsized<RefCell<U>> for RefCell<T> {}
801
802 struct BorrowRef<'b> {
803     borrow: &'b Cell<BorrowFlag>,
804 }
805
806 impl<'b> BorrowRef<'b> {
807     #[inline]
808     fn new(borrow: &'b Cell<BorrowFlag>) -> Option<BorrowRef<'b>> {
809         match borrow.get() {
810             WRITING => None,
811             b => {
812                 borrow.set(b + 1);
813                 Some(BorrowRef { borrow: borrow })
814             },
815         }
816     }
817 }
818
819 impl<'b> Drop for BorrowRef<'b> {
820     #[inline]
821     fn drop(&mut self) {
822         let borrow = self.borrow.get();
823         debug_assert!(borrow != WRITING && borrow != UNUSED);
824         self.borrow.set(borrow - 1);
825     }
826 }
827
828 impl<'b> Clone for BorrowRef<'b> {
829     #[inline]
830     fn clone(&self) -> BorrowRef<'b> {
831         // Since this Ref exists, we know the borrow flag
832         // is not set to WRITING.
833         let borrow = self.borrow.get();
834         debug_assert!(borrow != UNUSED);
835         // Prevent the borrow counter from overflowing.
836         assert!(borrow != WRITING);
837         self.borrow.set(borrow + 1);
838         BorrowRef { borrow: self.borrow }
839     }
840 }
841
842 /// Wraps a borrowed reference to a value in a `RefCell` box.
843 /// A wrapper type for an immutably borrowed value from a `RefCell<T>`.
844 ///
845 /// See the [module-level documentation](index.html) for more.
846 #[stable(feature = "rust1", since = "1.0.0")]
847 pub struct Ref<'b, T: ?Sized + 'b> {
848     value: &'b T,
849     borrow: BorrowRef<'b>,
850 }
851
852 #[stable(feature = "rust1", since = "1.0.0")]
853 impl<'b, T: ?Sized> Deref for Ref<'b, T> {
854     type Target = T;
855
856     #[inline]
857     fn deref(&self) -> &T {
858         self.value
859     }
860 }
861
862 impl<'b, T: ?Sized> Ref<'b, T> {
863     /// Copies a `Ref`.
864     ///
865     /// The `RefCell` is already immutably borrowed, so this cannot fail.
866     ///
867     /// This is an associated function that needs to be used as
868     /// `Ref::clone(...)`.  A `Clone` implementation or a method would interfere
869     /// with the widespread use of `r.borrow().clone()` to clone the contents of
870     /// a `RefCell`.
871     #[unstable(feature = "cell_extras",
872                reason = "likely to be moved to a method, pending language changes",
873                issue = "27746")]
874     #[inline]
875     pub fn clone(orig: &Ref<'b, T>) -> Ref<'b, T> {
876         Ref {
877             value: orig.value,
878             borrow: orig.borrow.clone(),
879         }
880     }
881
882     /// Make a new `Ref` for a component of the borrowed data.
883     ///
884     /// The `RefCell` is already immutably borrowed, so this cannot fail.
885     ///
886     /// This is an associated function that needs to be used as `Ref::map(...)`.
887     /// A method would interfere with methods of the same name on the contents
888     /// of a `RefCell` used through `Deref`.
889     ///
890     /// # Example
891     ///
892     /// ```
893     /// use std::cell::{RefCell, Ref};
894     ///
895     /// let c = RefCell::new((5, 'b'));
896     /// let b1: Ref<(u32, char)> = c.borrow();
897     /// let b2: Ref<u32> = Ref::map(b1, |t| &t.0);
898     /// assert_eq!(*b2, 5)
899     /// ```
900     #[stable(feature = "cell_map", since = "1.8.0")]
901     #[inline]
902     pub fn map<U: ?Sized, F>(orig: Ref<'b, T>, f: F) -> Ref<'b, U>
903         where F: FnOnce(&T) -> &U
904     {
905         Ref {
906             value: f(orig.value),
907             borrow: orig.borrow,
908         }
909     }
910 }
911
912 #[unstable(feature = "coerce_unsized", issue = "27732")]
913 impl<'b, T: ?Sized + Unsize<U>, U: ?Sized> CoerceUnsized<Ref<'b, U>> for Ref<'b, T> {}
914
915 impl<'b, T: ?Sized> RefMut<'b, T> {
916     /// Make a new `RefMut` for a component of the borrowed data, e.g. an enum
917     /// variant.
918     ///
919     /// The `RefCell` is already mutably borrowed, so this cannot fail.
920     ///
921     /// This is an associated function that needs to be used as
922     /// `RefMut::map(...)`.  A method would interfere with methods of the same
923     /// name on the contents of a `RefCell` used through `Deref`.
924     ///
925     /// # Example
926     ///
927     /// ```
928     /// use std::cell::{RefCell, RefMut};
929     ///
930     /// let c = RefCell::new((5, 'b'));
931     /// {
932     ///     let b1: RefMut<(u32, char)> = c.borrow_mut();
933     ///     let mut b2: RefMut<u32> = RefMut::map(b1, |t| &mut t.0);
934     ///     assert_eq!(*b2, 5);
935     ///     *b2 = 42;
936     /// }
937     /// assert_eq!(*c.borrow(), (42, 'b'));
938     /// ```
939     #[stable(feature = "cell_map", since = "1.8.0")]
940     #[inline]
941     pub fn map<U: ?Sized, F>(orig: RefMut<'b, T>, f: F) -> RefMut<'b, U>
942         where F: FnOnce(&mut T) -> &mut U
943     {
944         RefMut {
945             value: f(orig.value),
946             borrow: orig.borrow,
947         }
948     }
949 }
950
951 struct BorrowRefMut<'b> {
952     borrow: &'b Cell<BorrowFlag>,
953 }
954
955 impl<'b> Drop for BorrowRefMut<'b> {
956     #[inline]
957     fn drop(&mut self) {
958         let borrow = self.borrow.get();
959         debug_assert!(borrow == WRITING);
960         self.borrow.set(UNUSED);
961     }
962 }
963
964 impl<'b> BorrowRefMut<'b> {
965     #[inline]
966     fn new(borrow: &'b Cell<BorrowFlag>) -> Option<BorrowRefMut<'b>> {
967         match borrow.get() {
968             UNUSED => {
969                 borrow.set(WRITING);
970                 Some(BorrowRefMut { borrow: borrow })
971             },
972             _ => None,
973         }
974     }
975 }
976
977 /// A wrapper type for a mutably borrowed value from a `RefCell<T>`.
978 ///
979 /// See the [module-level documentation](index.html) for more.
980 #[stable(feature = "rust1", since = "1.0.0")]
981 pub struct RefMut<'b, T: ?Sized + 'b> {
982     value: &'b mut T,
983     borrow: BorrowRefMut<'b>,
984 }
985
986 #[stable(feature = "rust1", since = "1.0.0")]
987 impl<'b, T: ?Sized> Deref for RefMut<'b, T> {
988     type Target = T;
989
990     #[inline]
991     fn deref(&self) -> &T {
992         self.value
993     }
994 }
995
996 #[stable(feature = "rust1", since = "1.0.0")]
997 impl<'b, T: ?Sized> DerefMut for RefMut<'b, T> {
998     #[inline]
999     fn deref_mut(&mut self) -> &mut T {
1000         self.value
1001     }
1002 }
1003
1004 #[unstable(feature = "coerce_unsized", issue = "27732")]
1005 impl<'b, T: ?Sized + Unsize<U>, U: ?Sized> CoerceUnsized<RefMut<'b, U>> for RefMut<'b, T> {}
1006
1007 /// The core primitive for interior mutability in Rust.
1008 ///
1009 /// `UnsafeCell<T>` is a type that wraps some `T` and indicates unsafe interior operations on the
1010 /// wrapped type. Types with an `UnsafeCell<T>` field are considered to have an 'unsafe interior'.
1011 /// The `UnsafeCell<T>` type is the only legal way to obtain aliasable data that is considered
1012 /// mutable. In general, transmuting an `&T` type into an `&mut T` is considered undefined behavior.
1013 ///
1014 /// The compiler makes optimizations based on the knowledge that `&T` is not mutably aliased or
1015 /// mutated, and that `&mut T` is unique. When building abstractions like `Cell`, `RefCell`,
1016 /// `Mutex`, etc, you need to turn these optimizations off. `UnsafeCell` is the only legal way
1017 /// to do this. When `UnsafeCell<T>` is immutably aliased, it is still safe to obtain a mutable
1018 /// reference to its interior and/or to mutate it. However, it is up to the abstraction designer
1019 /// to ensure that no two mutable references obtained this way are active at the same time, and
1020 /// that there are no active mutable references or mutations when an immutable reference is obtained
1021 /// from the cell. This is often done via runtime checks.
1022 ///
1023 /// Note that while mutating or mutably aliasing the contents of an `& UnsafeCell<T>` is
1024 /// okay (provided you enforce the invariants some other way); it is still undefined behavior
1025 /// to have multiple `&mut UnsafeCell<T>` aliases.
1026 ///
1027 ///
1028 /// Types like `Cell<T>` and `RefCell<T>` use this type to wrap their internal data.
1029 ///
1030 /// # Examples
1031 ///
1032 /// ```
1033 /// use std::cell::UnsafeCell;
1034 /// use std::marker::Sync;
1035 ///
1036 /// # #[allow(dead_code)]
1037 /// struct NotThreadSafe<T> {
1038 ///     value: UnsafeCell<T>,
1039 /// }
1040 ///
1041 /// unsafe impl<T> Sync for NotThreadSafe<T> {}
1042 /// ```
1043 #[lang = "unsafe_cell"]
1044 #[stable(feature = "rust1", since = "1.0.0")]
1045 pub struct UnsafeCell<T: ?Sized> {
1046     value: T,
1047 }
1048
1049 #[stable(feature = "rust1", since = "1.0.0")]
1050 impl<T: ?Sized> !Sync for UnsafeCell<T> {}
1051
1052 impl<T> UnsafeCell<T> {
1053     /// Constructs a new instance of `UnsafeCell` which will wrap the specified
1054     /// value.
1055     ///
1056     /// All access to the inner value through methods is `unsafe`.
1057     ///
1058     /// # Examples
1059     ///
1060     /// ```
1061     /// use std::cell::UnsafeCell;
1062     ///
1063     /// let uc = UnsafeCell::new(5);
1064     /// ```
1065     #[stable(feature = "rust1", since = "1.0.0")]
1066     #[inline]
1067     pub const fn new(value: T) -> UnsafeCell<T> {
1068         UnsafeCell { value: value }
1069     }
1070
1071     /// Unwraps the value.
1072     ///
1073     /// # Safety
1074     ///
1075     /// This function is unsafe because this thread or another thread may currently be
1076     /// inspecting the inner value.
1077     ///
1078     /// # Examples
1079     ///
1080     /// ```
1081     /// use std::cell::UnsafeCell;
1082     ///
1083     /// let uc = UnsafeCell::new(5);
1084     ///
1085     /// let five = unsafe { uc.into_inner() };
1086     /// ```
1087     #[inline]
1088     #[stable(feature = "rust1", since = "1.0.0")]
1089     pub unsafe fn into_inner(self) -> T {
1090         self.value
1091     }
1092 }
1093
1094 impl<T: ?Sized> UnsafeCell<T> {
1095     /// Gets a mutable pointer to the wrapped value.
1096     ///
1097     /// This can be cast to a pointer of any kind.
1098     /// Ensure that the access is unique when casting to
1099     /// `&mut T`, and ensure that there are no mutations or mutable
1100     /// aliases going on when casting to `&T`
1101     ///
1102     /// # Examples
1103     ///
1104     /// ```
1105     /// use std::cell::UnsafeCell;
1106     ///
1107     /// let uc = UnsafeCell::new(5);
1108     ///
1109     /// let five = uc.get();
1110     /// ```
1111     #[inline]
1112     #[stable(feature = "rust1", since = "1.0.0")]
1113     pub fn get(&self) -> *mut T {
1114         &self.value as *const T as *mut T
1115     }
1116 }
1117
1118 #[stable(feature = "unsafe_cell_default", since = "1.9.0")]
1119 impl<T: Default> Default for UnsafeCell<T> {
1120     fn default() -> UnsafeCell<T> {
1121         UnsafeCell::new(Default::default())
1122     }
1123 }
1124
1125 #[stable(feature = "cell_from", since = "1.12.0")]
1126 impl<T> From<T> for UnsafeCell<T> {
1127     fn from(t: T) -> UnsafeCell<T> {
1128         UnsafeCell::new(t)
1129     }
1130 }
1131
1132 #[unstable(feature = "coerce_unsized", issue = "27732")]
1133 impl<T: CoerceUnsized<U>, U> CoerceUnsized<UnsafeCell<U>> for UnsafeCell<T> {}
1134
1135 #[allow(unused)]
1136 fn assert_coerce_unsized(a: UnsafeCell<&i32>, b: Cell<&i32>, c: RefCell<&i32>) {
1137     let _: UnsafeCell<&Send> = a;
1138     let _: Cell<&Send> = b;
1139     let _: RefCell<&Send> = c;
1140 }