diff options
| author | Manish Goregaokar <manishsmail@gmail.com> | 2015-03-09 00:02:37 +0530 |
|---|---|---|
| committer | Manish Goregaokar <manishsmail@gmail.com> | 2015-03-09 00:02:37 +0530 |
| commit | 0e0bb8a128baee4ec074b6d82bdd73b48a4b8283 (patch) | |
| tree | 14f614e6b52dc7ad80824fa1ec691b007b0bd439 /src/libcore/marker.rs | |
| parent | 509c6fc9c172fefaeeabb815a4b8feac6e0d075d (diff) | |
| parent | 45c397d738ac9cbf3d0ea2233142023ca148c893 (diff) | |
Rollup merge of #23179 - steveklabnik:mini_rollup, r=steveklabnik
I had to fix up some PRs: * https://github.com/rust-lang/rust/pull/22976 * https://github.com/rust-lang/rust/pull/22945 * https://github.com/rust-lang/rust/pull/22845
Diffstat (limited to 'src/libcore/marker.rs')
| -rw-r--r-- | src/libcore/marker.rs | 40 |
1 files changed, 39 insertions, 1 deletions
diff --git a/src/libcore/marker.rs b/src/libcore/marker.rs index 868a671b956..a05bc04a530 100644 --- a/src/libcore/marker.rs +++ b/src/libcore/marker.rs @@ -351,7 +351,45 @@ pub trait PhantomFn<A:?Sized,R:?Sized=()> { } /// instance, it will behave *as if* an instance of the type `T` were /// present for the purpose of various automatic analyses. /// -/// For example, embedding a `PhantomData<T>` will inform the compiler +/// # Examples +/// +/// When handling external resources over a foreign function interface, `PhantomData<T>` can +/// prevent mismatches by enforcing types in the method implementations, although the struct +/// doesn't actually contain values of the resource type. +/// +/// ``` +/// # trait ResType { fn foo(&self); }; +/// # struct ParamType; +/// # mod foreign_lib { +/// # pub fn new(_: usize) -> *mut () { 42 as *mut () } +/// # pub fn do_stuff(_: *mut (), _: usize) {} +/// # } +/// # fn convert_params(_: ParamType) -> usize { 42 } +/// use std::marker::PhantomData; +/// use std::mem; +/// +/// struct ExternalResource<R> { +/// resource_handle: *mut (), +/// resource_type: PhantomData<R>, +/// } +/// +/// impl<R: ResType> ExternalResource<R> { +/// fn new() -> ExternalResource<R> { +/// let size_of_res = mem::size_of::<R>(); +/// ExternalResource { +/// resource_handle: foreign_lib::new(size_of_res), +/// resource_type: PhantomData, +/// } +/// } +/// +/// fn do_stuff(&self, param: ParamType) { +/// let foreign_params = convert_params(param); +/// foreign_lib::do_stuff(self.resource_handle, foreign_params); +/// } +/// } +/// ``` +/// +/// Another example: embedding a `PhantomData<T>` will inform the compiler /// that one or more instances of the type `T` could be dropped when /// instances of the type itself is dropped, though that may not be /// apparent from the other structure of the type itself. This is |
