diff options
| author | Simon Sapin <simon.sapin@exyr.org> | 2017-07-14 13:05:21 +0200 |
|---|---|---|
| committer | Simon Sapin <simon.sapin@exyr.org> | 2017-07-22 20:38:40 +0200 |
| commit | a4edae95ad0e85b50845be1757670929ff60c88a (patch) | |
| tree | d36d8bff7d97d8193d7d37c0e4e76a1cd9b8b1e5 /src/libcore | |
| parent | cbd2b6b4842754495a2673df234e2496494245be (diff) | |
Add conversions from references to NonZero pointers, Unique, and Shared
Diffstat (limited to 'src/libcore')
| -rw-r--r-- | src/libcore/nonzero.rs | 19 | ||||
| -rw-r--r-- | src/libcore/ptr.rs | 28 |
2 files changed, 47 insertions, 0 deletions
diff --git a/src/libcore/nonzero.rs b/src/libcore/nonzero.rs index 65ebb8c5ae3..3ff1068b937 100644 --- a/src/libcore/nonzero.rs +++ b/src/libcore/nonzero.rs @@ -90,3 +90,22 @@ impl<T: Zeroable> NonZero<T> { } impl<T: Zeroable+CoerceUnsized<U>, U: Zeroable> CoerceUnsized<NonZero<U>> for NonZero<T> {} + +impl<'a, T: ?Sized> From<&'a mut T> for NonZero<*mut T> { + fn from(reference: &'a mut T) -> Self { + NonZero(reference) + } +} + +impl<'a, T: ?Sized> From<&'a mut T> for NonZero<*const T> { + fn from(reference: &'a mut T) -> Self { + let ptr: *mut T = reference; + NonZero(ptr) + } +} + +impl<'a, T: ?Sized> From<&'a T> for NonZero<*const T> { + fn from(reference: &'a T) -> Self { + NonZero(reference) + } +} diff --git a/src/libcore/ptr.rs b/src/libcore/ptr.rs index 29e2114f38a..9413a908cb1 100644 --- a/src/libcore/ptr.rs +++ b/src/libcore/ptr.rs @@ -1164,6 +1164,20 @@ impl<T: ?Sized> fmt::Pointer for Unique<T> { } } +#[unstable(feature = "unique", issue = "27730")] +impl<'a, T: ?Sized> From<&'a mut T> for Unique<T> { + fn from(reference: &'a mut T) -> Self { + Unique { pointer: NonZero::from(reference), _marker: PhantomData } + } +} + +#[unstable(feature = "unique", issue = "27730")] +impl<'a, T: ?Sized> From<&'a T> for Unique<T> { + fn from(reference: &'a T) -> Self { + Unique { pointer: NonZero::from(reference), _marker: PhantomData } + } +} + /// A wrapper around a raw `*mut T` that indicates that the possessor /// of this wrapper has shared ownership of the referent. Useful for /// building abstractions like `Rc<T>`, `Arc<T>`, or doubly-linked lists, which @@ -1296,3 +1310,17 @@ impl<T: ?Sized> From<Unique<T>> for Shared<T> { Shared { pointer: unique.pointer, _marker: PhantomData } } } + +#[unstable(feature = "shared", issue = "27730")] +impl<'a, T: ?Sized> From<&'a mut T> for Shared<T> { + fn from(reference: &'a mut T) -> Self { + Shared { pointer: NonZero::from(reference), _marker: PhantomData } + } +} + +#[unstable(feature = "shared", issue = "27730")] +impl<'a, T: ?Sized> From<&'a T> for Shared<T> { + fn from(reference: &'a T) -> Self { + Shared { pointer: NonZero::from(reference), _marker: PhantomData } + } +} |
