about summary refs log tree commit diff
path: root/src/libcore/marker.rs
diff options
context:
space:
mode:
authorManish Goregaokar <manishsmail@gmail.com>2015-03-09 00:02:37 +0530
committerManish Goregaokar <manishsmail@gmail.com>2015-03-09 00:02:37 +0530
commit0e0bb8a128baee4ec074b6d82bdd73b48a4b8283 (patch)
tree14f614e6b52dc7ad80824fa1ec691b007b0bd439 /src/libcore/marker.rs
parent509c6fc9c172fefaeeabb815a4b8feac6e0d075d (diff)
parent45c397d738ac9cbf3d0ea2233142023ca148c893 (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.rs40
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