From 0a08ad0443631ca86e61526916fb4ee61fe1abce Mon Sep 17 00:00:00 2001 From: Simon Sapin Date: Thu, 29 Jun 2017 01:03:35 +0200 Subject: Rename {NonZero,Shared,Unique}::new to new_unchecked --- src/libstd/collections/hash/table.rs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) (limited to 'src/libstd') diff --git a/src/libstd/collections/hash/table.rs b/src/libstd/collections/hash/table.rs index 06f4f7643ec..f3aec589e7d 100644 --- a/src/libstd/collections/hash/table.rs +++ b/src/libstd/collections/hash/table.rs @@ -44,7 +44,7 @@ impl TaggedHashUintPtr { #[inline] unsafe fn new(ptr: *mut HashUint) -> Self { debug_assert!(ptr as usize & 1 == 0 || ptr as usize == EMPTY as usize); - TaggedHashUintPtr(Unique::new(ptr)) + TaggedHashUintPtr(Unique::new_unchecked(ptr)) } #[inline] @@ -56,7 +56,7 @@ impl TaggedHashUintPtr { } else { usize_ptr &= !1; } - self.0 = Unique::new(usize_ptr as *mut HashUint) + self.0 = Unique::new_unchecked(usize_ptr as *mut HashUint) } } @@ -877,7 +877,7 @@ impl RawTable { elems_left: elems_left, marker: marker::PhantomData, }, - table: unsafe { Shared::new(self) }, + table: unsafe { Shared::new_unchecked(self) }, marker: marker::PhantomData, } } -- cgit 1.4.1-3-g733a5 From a4edae95ad0e85b50845be1757670929ff60c88a Mon Sep 17 00:00:00 2001 From: Simon Sapin Date: Fri, 14 Jul 2017 13:05:21 +0200 Subject: Add conversions from references to NonZero pointers, Unique, and Shared --- src/liballoc/btree/node.rs | 2 +- src/liballoc/vec.rs | 2 +- src/liballoc/vec_deque.rs | 2 +- src/libcore/nonzero.rs | 19 +++++++++++++++++++ src/libcore/ptr.rs | 28 ++++++++++++++++++++++++++++ src/librustc_data_structures/array_vec.rs | 2 +- src/libstd/collections/hash/table.rs | 2 +- 7 files changed, 52 insertions(+), 5 deletions(-) (limited to 'src/libstd') diff --git a/src/liballoc/btree/node.rs b/src/liballoc/btree/node.rs index 05ac9cba5e0..a6cbab8497b 100644 --- a/src/liballoc/btree/node.rs +++ b/src/liballoc/btree/node.rs @@ -155,7 +155,7 @@ impl BoxedNode { fn as_ptr(&self) -> NonZero<*const LeafNode> { unsafe { - NonZero::new_unchecked(self.ptr.as_ptr()) + NonZero::from(self.ptr.as_ref()) } } } diff --git a/src/liballoc/vec.rs b/src/liballoc/vec.rs index bc1521c4069..8a1d14b48a1 100644 --- a/src/liballoc/vec.rs +++ b/src/liballoc/vec.rs @@ -1126,7 +1126,7 @@ impl Vec { tail_start: end, tail_len: len - end, iter: range_slice.iter(), - vec: Shared::new_unchecked(self as *mut _), + vec: Shared::from(self), } } } diff --git a/src/liballoc/vec_deque.rs b/src/liballoc/vec_deque.rs index a99b7bbe053..fdd6c79ef2e 100644 --- a/src/liballoc/vec_deque.rs +++ b/src/liballoc/vec_deque.rs @@ -893,7 +893,7 @@ impl VecDeque { self.head = drain_tail; Drain { - deque: unsafe { Shared::new_unchecked(self as *mut _) }, + deque: Shared::from(&mut *self), after_tail: drain_head, after_head: head, iter: Iter { 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 NonZero { } impl, U: Zeroable> CoerceUnsized> for NonZero {} + +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 fmt::Pointer for Unique { } } +#[unstable(feature = "unique", issue = "27730")] +impl<'a, T: ?Sized> From<&'a mut T> for Unique { + 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 { + 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`, `Arc`, or doubly-linked lists, which @@ -1296,3 +1310,17 @@ impl From> for Shared { Shared { pointer: unique.pointer, _marker: PhantomData } } } + +#[unstable(feature = "shared", issue = "27730")] +impl<'a, T: ?Sized> From<&'a mut T> for Shared { + 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 { + fn from(reference: &'a T) -> Self { + Shared { pointer: NonZero::from(reference), _marker: PhantomData } + } +} diff --git a/src/librustc_data_structures/array_vec.rs b/src/librustc_data_structures/array_vec.rs index de028f61090..ced73e9e426 100644 --- a/src/librustc_data_structures/array_vec.rs +++ b/src/librustc_data_structures/array_vec.rs @@ -146,7 +146,7 @@ impl ArrayVec { tail_start: end, tail_len: len - end, iter: range_slice.iter(), - array_vec: Shared::new_unchecked(self as *mut _), + array_vec: Shared::from(self), } } } diff --git a/src/libstd/collections/hash/table.rs b/src/libstd/collections/hash/table.rs index f3aec589e7d..3844690860b 100644 --- a/src/libstd/collections/hash/table.rs +++ b/src/libstd/collections/hash/table.rs @@ -877,7 +877,7 @@ impl RawTable { elems_left: elems_left, marker: marker::PhantomData, }, - table: unsafe { Shared::new_unchecked(self) }, + table: Shared::from(self), marker: marker::PhantomData, } } -- cgit 1.4.1-3-g733a5