]> git.lizzy.rs Git - rust.git/blob - src/libcore/cell.rs
Add verbose option to rustdoc in order to fix problem with --version
[rust.git] / src / libcore / cell.rs
1 // Copyright 2012-2013 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` and `RefCell` types may be mutated through
14 //! shared references (i.e. the common `&T` type), whereas most Rust
15 //! types can only be mutated through unique (`&mut T`) references. We
16 //! say that `Cell` and `RefCell` provide *interior mutability*, in
17 //! contrast with typical Rust types that exhibit *inherited
18 //! mutability*.
19 //!
20 //! Cell types come in two flavors: `Cell` and `RefCell`. `Cell`
21 //! provides `get` and `set` methods that change the
22 //! interior value with a single method call. `Cell` though is only
23 //! compatible with types that implement `Copy`. For other types,
24 //! one must use the `RefCell` type, acquiring a write lock before
25 //! mutating.
26 //!
27 //! `RefCell` uses Rust's lifetimes to implement *dynamic borrowing*,
28 //! a process whereby one can claim temporary, exclusive, mutable
29 //! access to the inner value. Borrows for `RefCell`s are tracked *at
30 //! runtime*, unlike Rust's native reference types which are entirely
31 //! tracked statically, at compile time. Because `RefCell` borrows are
32 //! dynamic it is possible to attempt to borrow a value that is
33 //! already mutably borrowed; when this happens it results in task
34 //! panic.
35 //!
36 //! # When to choose interior mutability
37 //!
38 //! The more common inherited mutability, where one must have unique
39 //! access to mutate a value, is one of the key language elements that
40 //! enables Rust to reason strongly about pointer aliasing, statically
41 //! preventing crash bugs. Because of that, inherited mutability is
42 //! preferred, and interior mutability is something of a last
43 //! resort. Since cell types enable mutation where it would otherwise
44 //! be disallowed though, there are occasions when interior
45 //! mutability might be appropriate, or even *must* be used, e.g.
46 //!
47 //! * Introducing inherited mutability roots to shared types.
48 //! * Implementation details of logically-immutable methods.
49 //! * Mutating implementations of `clone`.
50 //!
51 //! ## Introducing inherited mutability roots to shared types
52 //!
53 //! Shared smart pointer types, including `Rc` and `Arc`, provide
54 //! containers that can be cloned and shared between multiple parties.
55 //! Because the contained values may be multiply-aliased, they can
56 //! only be borrowed as shared references, not mutable references.
57 //! Without cells it would be impossible to mutate data inside of
58 //! shared boxes at all!
59 //!
60 //! It's very common then to put a `RefCell` inside shared pointer
61 //! types to reintroduce mutability:
62 //!
63 //! ```
64 //! use std::collections::HashMap;
65 //! use std::cell::RefCell;
66 //! use std::rc::Rc;
67 //!
68 //! fn main() {
69 //!     let shared_map: Rc<RefCell<_>> = Rc::new(RefCell::new(HashMap::new()));
70 //!     shared_map.borrow_mut().insert("africa", 92388i);
71 //!     shared_map.borrow_mut().insert("kyoto", 11837i);
72 //!     shared_map.borrow_mut().insert("piccadilly", 11826i);
73 //!     shared_map.borrow_mut().insert("marbles", 38i);
74 //! }
75 //! ```
76 //!
77 //! ## Implementation details of logically-immutable methods
78 //!
79 //! Occasionally it may be desirable not to expose in an API that
80 //! there is mutation happening "under the hood". This may be because
81 //! logically the operation is immutable, but e.g. caching forces the
82 //! implementation to perform mutation; or because you must employ
83 //! mutation to implement a trait method that was originally defined
84 //! to take `&self`.
85 //!
86 //! ```
87 //! use std::cell::RefCell;
88 //!
89 //! struct Graph {
90 //!     edges: Vec<(uint, uint)>,
91 //!     span_tree_cache: RefCell<Option<Vec<(uint, uint)>>>
92 //! }
93 //!
94 //! impl Graph {
95 //!     fn minimum_spanning_tree(&self) -> Vec<(uint, uint)> {
96 //!         // Create a new scope to contain the lifetime of the
97 //!         // dynamic borrow
98 //!         {
99 //!             // Take a reference to the inside of cache cell
100 //!             let mut cache = self.span_tree_cache.borrow_mut();
101 //!             if cache.is_some() {
102 //!                 return cache.as_ref().unwrap().clone();
103 //!             }
104 //!
105 //!             let span_tree = self.calc_span_tree();
106 //!             *cache = Some(span_tree);
107 //!         }
108 //!
109 //!         // Recursive call to return the just-cached value.
110 //!         // Note that if we had not let the previous borrow
111 //!         // of the cache fall out of scope then the subsequent
112 //!         // recursive borrow would cause a dynamic task panic.
113 //!         // This is the major hazard of using `RefCell`.
114 //!         self.minimum_spanning_tree()
115 //!     }
116 //! #   fn calc_span_tree(&self) -> Vec<(uint, uint)> { vec![] }
117 //! }
118 //! # fn main() { }
119 //! ```
120 //!
121 //! ## Mutating implementations of `clone`
122 //!
123 //! This is simply a special - but common - case of the previous:
124 //! hiding mutability for operations that appear to be immutable.
125 //! The `clone` method is expected to not change the source value, and
126 //! is declared to take `&self`, not `&mut self`. Therefore any
127 //! mutation that happens in the `clone` method must use cell
128 //! types. For example, `Rc` maintains its reference counts within a
129 //! `Cell`.
130 //!
131 //! ```
132 //! use std::cell::Cell;
133 //!
134 //! struct Rc<T> {
135 //!     ptr: *mut RcBox<T>
136 //! }
137 //!
138 //! struct RcBox<T> {
139 //!     value: T,
140 //!     refcount: Cell<uint>
141 //! }
142 //!
143 //! impl<T> Clone for Rc<T> {
144 //!     fn clone(&self) -> Rc<T> {
145 //!         unsafe {
146 //!             (*self.ptr).refcount.set((*self.ptr).refcount.get() + 1);
147 //!             Rc { ptr: self.ptr }
148 //!         }
149 //!     }
150 //! }
151 //! ```
152 //!
153 // FIXME: Explain difference between Cell and RefCell
154 // FIXME: Downsides to interior mutability
155 // FIXME: Can't be shared between threads. Dynamic borrows
156 // FIXME: Relationship to Atomic types and RWLock
157
158 use clone::Clone;
159 use cmp::PartialEq;
160 use default::Default;
161 use kinds::{Copy, Send};
162 use ops::{Deref, DerefMut, Drop};
163 use option::Option;
164 use option::Option::{None, Some};
165
166 /// A mutable memory location that admits only `Copy` data.
167 #[stable]
168 pub struct Cell<T> {
169     value: UnsafeCell<T>,
170 }
171
172 impl<T:Copy> Cell<T> {
173     /// Creates a new `Cell` containing the given value.
174     #[stable]
175     pub fn new(value: T) -> Cell<T> {
176         Cell {
177             value: UnsafeCell::new(value),
178         }
179     }
180
181     /// Returns a copy of the contained value.
182     #[inline]
183     #[stable]
184     pub fn get(&self) -> T {
185         unsafe{ *self.value.get() }
186     }
187
188     /// Sets the contained value.
189     #[inline]
190     #[stable]
191     pub fn set(&self, value: T) {
192         unsafe {
193             *self.value.get() = value;
194         }
195     }
196
197     /// Get a reference to the underlying `UnsafeCell`.
198     ///
199     /// This can be used to circumvent `Cell`'s safety checks.
200     ///
201     /// This function is `unsafe` because `UnsafeCell`'s field is public.
202     #[inline]
203     #[experimental]
204     pub unsafe fn as_unsafe_cell<'a>(&'a self) -> &'a UnsafeCell<T> {
205         &self.value
206     }
207 }
208
209 #[stable]
210 unsafe impl<T> Send for Cell<T> where T: Send {}
211
212 #[stable]
213 impl<T:Copy> Clone for Cell<T> {
214     fn clone(&self) -> Cell<T> {
215         Cell::new(self.get())
216     }
217 }
218
219 #[stable]
220 impl<T:Default + Copy> Default for Cell<T> {
221     #[stable]
222     fn default() -> Cell<T> {
223         Cell::new(Default::default())
224     }
225 }
226
227 #[unstable = "waiting for `PartialEq` trait to become stable"]
228 impl<T:PartialEq + Copy> PartialEq for Cell<T> {
229     fn eq(&self, other: &Cell<T>) -> bool {
230         self.get() == other.get()
231     }
232 }
233
234 /// A mutable memory location with dynamically checked borrow rules
235 #[stable]
236 pub struct RefCell<T> {
237     value: UnsafeCell<T>,
238     borrow: Cell<BorrowFlag>,
239 }
240
241 // Values [1, MAX-1] represent the number of `Ref` active
242 // (will not outgrow its range since `uint` is the size of the address space)
243 type BorrowFlag = uint;
244 const UNUSED: BorrowFlag = 0;
245 const WRITING: BorrowFlag = -1;
246
247 impl<T> RefCell<T> {
248     /// Create a new `RefCell` containing `value`
249     #[stable]
250     pub fn new(value: T) -> RefCell<T> {
251         RefCell {
252             value: UnsafeCell::new(value),
253             borrow: Cell::new(UNUSED),
254         }
255     }
256
257     /// Consumes the `RefCell`, returning the wrapped value.
258     #[stable]
259     pub fn into_inner(self) -> T {
260         // Since this function takes `self` (the `RefCell`) by value, the
261         // compiler statically verifies that it is not currently borrowed.
262         // Therefore the following assertion is just a `debug_assert!`.
263         debug_assert!(self.borrow.get() == UNUSED);
264         unsafe { self.value.into_inner() }
265     }
266
267     /// Deprecated, use into_inner() instead
268     #[deprecated = "renamed to into_inner()"]
269     pub fn unwrap(self) -> T { self.into_inner() }
270
271     /// Attempts to immutably borrow the wrapped value.
272     ///
273     /// The borrow lasts until the returned `Ref` exits scope. Multiple
274     /// immutable borrows can be taken out at the same time.
275     ///
276     /// Returns `None` if the value is currently mutably borrowed.
277     #[unstable = "may be renamed or removed"]
278     pub fn try_borrow<'a>(&'a self) -> Option<Ref<'a, T>> {
279         match BorrowRef::new(&self.borrow) {
280             Some(b) => Some(Ref { _value: unsafe { &*self.value.get() }, _borrow: b }),
281             None => None,
282         }
283     }
284
285     /// Immutably borrows the wrapped value.
286     ///
287     /// The borrow lasts until the returned `Ref` exits scope. Multiple
288     /// immutable borrows can be taken out at the same time.
289     ///
290     /// # Panics
291     ///
292     /// Panics if the value is currently mutably borrowed.
293     #[stable]
294     pub fn borrow<'a>(&'a self) -> Ref<'a, T> {
295         match self.try_borrow() {
296             Some(ptr) => ptr,
297             None => panic!("RefCell<T> already mutably borrowed")
298         }
299     }
300
301     /// Mutably borrows the wrapped value.
302     ///
303     /// The borrow lasts until the returned `RefMut` exits scope. The value
304     /// cannot be borrowed while this borrow is active.
305     ///
306     /// Returns `None` if the value is currently borrowed.
307     #[unstable = "may be renamed or removed"]
308     pub fn try_borrow_mut<'a>(&'a self) -> Option<RefMut<'a, T>> {
309         match BorrowRefMut::new(&self.borrow) {
310             Some(b) => Some(RefMut { _value: unsafe { &mut *self.value.get() }, _borrow: b }),
311             None => None,
312         }
313     }
314
315     /// Mutably borrows the wrapped value.
316     ///
317     /// The borrow lasts until the returned `RefMut` exits scope. The value
318     /// cannot be borrowed while this borrow is active.
319     ///
320     /// # Panics
321     ///
322     /// Panics if the value is currently borrowed.
323     #[stable]
324     pub fn borrow_mut<'a>(&'a self) -> RefMut<'a, T> {
325         match self.try_borrow_mut() {
326             Some(ptr) => ptr,
327             None => panic!("RefCell<T> already borrowed")
328         }
329     }
330
331     /// Get a reference to the underlying `UnsafeCell`.
332     ///
333     /// This can be used to circumvent `RefCell`'s safety checks.
334     ///
335     /// This function is `unsafe` because `UnsafeCell`'s field is public.
336     #[inline]
337     #[experimental]
338     pub unsafe fn as_unsafe_cell<'a>(&'a self) -> &'a UnsafeCell<T> {
339         &self.value
340     }
341 }
342
343 #[stable]
344 unsafe impl<T> Send for RefCell<T> where T: Send {}
345
346 #[stable]
347 impl<T: Clone> Clone for RefCell<T> {
348     fn clone(&self) -> RefCell<T> {
349         RefCell::new(self.borrow().clone())
350     }
351 }
352
353 #[stable]
354 impl<T:Default> Default for RefCell<T> {
355     #[stable]
356     fn default() -> RefCell<T> {
357         RefCell::new(Default::default())
358     }
359 }
360
361 #[unstable = "waiting for `PartialEq` to become stable"]
362 impl<T: PartialEq> PartialEq for RefCell<T> {
363     fn eq(&self, other: &RefCell<T>) -> bool {
364         *self.borrow() == *other.borrow()
365     }
366 }
367
368 struct BorrowRef<'b> {
369     _borrow: &'b Cell<BorrowFlag>,
370 }
371
372 impl<'b> BorrowRef<'b> {
373     fn new(borrow: &'b Cell<BorrowFlag>) -> Option<BorrowRef<'b>> {
374         match borrow.get() {
375             WRITING => None,
376             b => {
377                 borrow.set(b + 1);
378                 Some(BorrowRef { _borrow: borrow })
379             },
380         }
381     }
382 }
383
384 #[unsafe_destructor]
385 impl<'b> Drop for BorrowRef<'b> {
386     fn drop(&mut self) {
387         let borrow = self._borrow.get();
388         debug_assert!(borrow != WRITING && borrow != UNUSED);
389         self._borrow.set(borrow - 1);
390     }
391 }
392
393 impl<'b> Clone for BorrowRef<'b> {
394     fn clone(&self) -> BorrowRef<'b> {
395         // Since this Ref exists, we know the borrow flag
396         // is not set to WRITING.
397         let borrow = self._borrow.get();
398         debug_assert!(borrow != WRITING && borrow != UNUSED);
399         self._borrow.set(borrow + 1);
400         BorrowRef { _borrow: self._borrow }
401     }
402 }
403
404 /// Wraps a borrowed reference to a value in a `RefCell` box.
405 #[stable]
406 pub struct Ref<'b, T:'b> {
407     // FIXME #12808: strange name to try to avoid interfering with
408     // field accesses of the contained type via Deref
409     _value: &'b T,
410     _borrow: BorrowRef<'b>,
411 }
412
413 #[unstable = "waiting for `Deref` to become stable"]
414 impl<'b, T> Deref<T> for Ref<'b, T> {
415     #[inline]
416     fn deref<'a>(&'a self) -> &'a T {
417         self._value
418     }
419 }
420
421 /// Copy a `Ref`.
422 ///
423 /// The `RefCell` is already immutably borrowed, so this cannot fail.
424 ///
425 /// A `Clone` implementation would interfere with the widespread
426 /// use of `r.borrow().clone()` to clone the contents of a `RefCell`.
427 #[experimental = "likely to be moved to a method, pending language changes"]
428 pub fn clone_ref<'b, T:Clone>(orig: &Ref<'b, T>) -> Ref<'b, T> {
429     Ref {
430         _value: orig._value,
431         _borrow: orig._borrow.clone(),
432     }
433 }
434
435 struct BorrowRefMut<'b> {
436     _borrow: &'b Cell<BorrowFlag>,
437 }
438
439 #[unsafe_destructor]
440 impl<'b> Drop for BorrowRefMut<'b> {
441     fn drop(&mut self) {
442         let borrow = self._borrow.get();
443         debug_assert!(borrow == WRITING);
444         self._borrow.set(UNUSED);
445     }
446 }
447
448 impl<'b> BorrowRefMut<'b> {
449     fn new(borrow: &'b Cell<BorrowFlag>) -> Option<BorrowRefMut<'b>> {
450         match borrow.get() {
451             UNUSED => {
452                 borrow.set(WRITING);
453                 Some(BorrowRefMut { _borrow: borrow })
454             },
455             _ => None,
456         }
457     }
458 }
459
460 /// Wraps a mutable borrowed reference to a value in a `RefCell` box.
461 #[stable]
462 pub struct RefMut<'b, T:'b> {
463     // FIXME #12808: strange name to try to avoid interfering with
464     // field accesses of the contained type via Deref
465     _value: &'b mut T,
466     _borrow: BorrowRefMut<'b>,
467 }
468
469 #[unstable = "waiting for `Deref` to become stable"]
470 impl<'b, T> Deref<T> for RefMut<'b, T> {
471     #[inline]
472     fn deref<'a>(&'a self) -> &'a T {
473         self._value
474     }
475 }
476
477 #[unstable = "waiting for `DerefMut` to become stable"]
478 impl<'b, T> DerefMut<T> for RefMut<'b, T> {
479     #[inline]
480     fn deref_mut<'a>(&'a mut self) -> &'a mut T {
481         self._value
482     }
483 }
484
485 /// The core primitive for interior mutability in Rust.
486 ///
487 /// `UnsafeCell` type that wraps a type T and indicates unsafe interior
488 /// operations on the wrapped type. Types with an `UnsafeCell<T>` field are
489 /// considered to have an *unsafe interior*. The `UnsafeCell` type is the only
490 /// legal way to obtain aliasable data that is considered mutable. In general,
491 /// transmuting an &T type into an &mut T is considered undefined behavior.
492 ///
493 /// Although it is possible to put an `UnsafeCell<T>` into static item, it is
494 /// not permitted to take the address of the static item if the item is not
495 /// declared as mutable. This rule exists because immutable static items are
496 /// stored in read-only memory, and thus any attempt to mutate their interior
497 /// can cause segfaults. Immutable static items containing `UnsafeCell<T>`
498 /// instances are still useful as read-only initializers, however, so we do not
499 /// forbid them altogether.
500 ///
501 /// Types like `Cell` and `RefCell` use this type to wrap their internal data.
502 ///
503 /// `UnsafeCell` doesn't opt-out from any kind, instead, types with an
504 /// `UnsafeCell` interior are expected to opt-out from kinds themselves.
505 ///
506 /// # Example:
507 ///
508 /// ```rust
509 /// use std::cell::UnsafeCell;
510 /// use std::kinds::marker;
511 ///
512 /// struct NotThreadSafe<T> {
513 ///     value: UnsafeCell<T>,
514 ///     marker: marker::NoSync
515 /// }
516 /// ```
517 ///
518 /// **NOTE:** `UnsafeCell<T>` fields are public to allow static initializers. It
519 /// is not recommended to access its fields directly, `get` should be used
520 /// instead.
521 #[lang="unsafe"]
522 #[stable]
523 pub struct UnsafeCell<T> {
524     /// Wrapped value
525     ///
526     /// This field should not be accessed directly, it is made public for static
527     /// initializers.
528     #[unstable]
529     pub value: T,
530 }
531
532 impl<T> UnsafeCell<T> {
533     /// Construct a new instance of `UnsafeCell` which will wrap the specified
534     /// value.
535     ///
536     /// All access to the inner value through methods is `unsafe`, and it is
537     /// highly discouraged to access the fields directly.
538     #[stable]
539     pub fn new(value: T) -> UnsafeCell<T> {
540         UnsafeCell { value: value }
541     }
542
543     /// Gets a mutable pointer to the wrapped value.
544     #[inline]
545     #[stable]
546     pub fn get(&self) -> *mut T { &self.value as *const T as *mut T }
547
548     /// Unwraps the value
549     ///
550     /// This function is unsafe because there is no guarantee that this or other
551     /// tasks are currently inspecting the inner value.
552     #[inline]
553     #[stable]
554     pub unsafe fn into_inner(self) -> T { self.value }
555
556     /// Deprecated, use into_inner() instead
557     #[deprecated = "renamed to into_inner()"]
558     pub unsafe fn unwrap(self) -> T { self.into_inner() }
559 }