Skip to content

Commit a4edae9

Browse files
committed
Add conversions from references to NonZero pointers, Unique, and Shared
1 parent cbd2b6b commit a4edae9

File tree

7 files changed

+52
-5
lines changed

7 files changed

+52
-5
lines changed

src/liballoc/btree/node.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -155,7 +155,7 @@ impl<K, V> BoxedNode<K, V> {
155155

156156
fn as_ptr(&self) -> NonZero<*const LeafNode<K, V>> {
157157
unsafe {
158-
NonZero::new_unchecked(self.ptr.as_ptr())
158+
NonZero::from(self.ptr.as_ref())
159159
}
160160
}
161161
}

src/liballoc/vec.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1126,7 +1126,7 @@ impl<T> Vec<T> {
11261126
tail_start: end,
11271127
tail_len: len - end,
11281128
iter: range_slice.iter(),
1129-
vec: Shared::new_unchecked(self as *mut _),
1129+
vec: Shared::from(self),
11301130
}
11311131
}
11321132
}

src/liballoc/vec_deque.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -893,7 +893,7 @@ impl<T> VecDeque<T> {
893893
self.head = drain_tail;
894894

895895
Drain {
896-
deque: unsafe { Shared::new_unchecked(self as *mut _) },
896+
deque: Shared::from(&mut *self),
897897
after_tail: drain_head,
898898
after_head: head,
899899
iter: Iter {

src/libcore/nonzero.rs

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -90,3 +90,22 @@ impl<T: Zeroable> NonZero<T> {
9090
}
9191

9292
impl<T: Zeroable+CoerceUnsized<U>, U: Zeroable> CoerceUnsized<NonZero<U>> for NonZero<T> {}
93+
94+
impl<'a, T: ?Sized> From<&'a mut T> for NonZero<*mut T> {
95+
fn from(reference: &'a mut T) -> Self {
96+
NonZero(reference)
97+
}
98+
}
99+
100+
impl<'a, T: ?Sized> From<&'a mut T> for NonZero<*const T> {
101+
fn from(reference: &'a mut T) -> Self {
102+
let ptr: *mut T = reference;
103+
NonZero(ptr)
104+
}
105+
}
106+
107+
impl<'a, T: ?Sized> From<&'a T> for NonZero<*const T> {
108+
fn from(reference: &'a T) -> Self {
109+
NonZero(reference)
110+
}
111+
}

src/libcore/ptr.rs

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1164,6 +1164,20 @@ impl<T: ?Sized> fmt::Pointer for Unique<T> {
11641164
}
11651165
}
11661166

1167+
#[unstable(feature = "unique", issue = "27730")]
1168+
impl<'a, T: ?Sized> From<&'a mut T> for Unique<T> {
1169+
fn from(reference: &'a mut T) -> Self {
1170+
Unique { pointer: NonZero::from(reference), _marker: PhantomData }
1171+
}
1172+
}
1173+
1174+
#[unstable(feature = "unique", issue = "27730")]
1175+
impl<'a, T: ?Sized> From<&'a T> for Unique<T> {
1176+
fn from(reference: &'a T) -> Self {
1177+
Unique { pointer: NonZero::from(reference), _marker: PhantomData }
1178+
}
1179+
}
1180+
11671181
/// A wrapper around a raw `*mut T` that indicates that the possessor
11681182
/// of this wrapper has shared ownership of the referent. Useful for
11691183
/// 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> {
12961310
Shared { pointer: unique.pointer, _marker: PhantomData }
12971311
}
12981312
}
1313+
1314+
#[unstable(feature = "shared", issue = "27730")]
1315+
impl<'a, T: ?Sized> From<&'a mut T> for Shared<T> {
1316+
fn from(reference: &'a mut T) -> Self {
1317+
Shared { pointer: NonZero::from(reference), _marker: PhantomData }
1318+
}
1319+
}
1320+
1321+
#[unstable(feature = "shared", issue = "27730")]
1322+
impl<'a, T: ?Sized> From<&'a T> for Shared<T> {
1323+
fn from(reference: &'a T) -> Self {
1324+
Shared { pointer: NonZero::from(reference), _marker: PhantomData }
1325+
}
1326+
}

src/librustc_data_structures/array_vec.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -146,7 +146,7 @@ impl<A: Array> ArrayVec<A> {
146146
tail_start: end,
147147
tail_len: len - end,
148148
iter: range_slice.iter(),
149-
array_vec: Shared::new_unchecked(self as *mut _),
149+
array_vec: Shared::from(self),
150150
}
151151
}
152152
}

src/libstd/collections/hash/table.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -877,7 +877,7 @@ impl<K, V> RawTable<K, V> {
877877
elems_left: elems_left,
878878
marker: marker::PhantomData,
879879
},
880-
table: unsafe { Shared::new_unchecked(self) },
880+
table: Shared::from(self),
881881
marker: marker::PhantomData,
882882
}
883883
}

0 commit comments

Comments
 (0)