11//! The AST pointer.
22//!
3- //! Provides `P<T>`, a frozen owned smart pointer.
3+ //! Provides [ `P<T>`][struct@P], an owned smart pointer.
44//!
55//! # Motivations and benefits
66//!
77//! * **Identity**: sharing AST nodes is problematic for the various analysis
88//! passes (e.g., one may be able to bypass the borrow checker with a shared
99//! `ExprKind::AddrOf` node taking a mutable borrow).
1010//!
11- //! * **Immutability**: `P<T>` disallows mutating its inner `T`, unlike `Box<T>`
12- //! (unless it contains an `Unsafe` interior, but that may be denied later).
13- //! This mainly prevents mistakes, but also enforces a kind of "purity".
14- //!
1511//! * **Efficiency**: folding can reuse allocation space for `P<T>` and `Vec<T>`,
1612//! the latter even when the input and output types differ (as it would be the
1713//! case with arenas or a GADT AST using type parameters to toggle features).
1814//!
19- //! * **Maintainability**: `P<T>` provides a fixed interface - `Deref`,
20- //! `and_then` and `map` - which can remain fully functional even if the
21- //! implementation changes (using a special thread-local heap, for example).
22- //! Moreover, a switch to, e.g., `P<'a, T>` would be easy and mostly automated.
15+ //! * **Maintainability**: `P<T>` provides an interface, which can remain fully
16+ //! functional even if the implementation changes (using a special thread-local
17+ //! heap, for example). Moreover, a switch to, e.g., `P<'a, T>` would be easy
18+ //! and mostly automated.
2319
2420use std:: fmt:: { self , Debug , Display } ;
2521use std:: ops:: { Deref , DerefMut } ;
@@ -29,6 +25,8 @@ use rustc_serialize::{Decodable, Decoder, Encodable, Encoder};
2925
3026use rustc_data_structures:: stable_hasher:: { HashStable , StableHasher } ;
3127/// An owned smart pointer.
28+ ///
29+ /// See the [module level documentation][crate::ptr] for details.
3230pub struct P < T : ?Sized > {
3331 ptr : Box < T > ,
3432}
0 commit comments