diff --git a/lib.rs b/lib.rs index ff6bee4..4e21bf4 100644 --- a/lib.rs +++ b/lib.rs @@ -256,7 +256,7 @@ impl<'a, T: 'a + Array> Drop for Drain<'a, T> { #[cfg(feature = "union")] union SmallVecData { inline: MaybeUninit, - heap: (NonNull, usize), + heap: (*mut A::Item, usize), } #[cfg(feature = "union")] @@ -279,24 +279,22 @@ impl SmallVecData { } #[inline] unsafe fn heap(&self) -> (*mut A::Item, usize) { - (self.heap.0.as_ptr(), self.heap.1) + self.heap } #[inline] - unsafe fn heap_mut(&mut self) -> (*mut A::Item, &mut usize) { - (self.heap.0.as_ptr(), &mut self.heap.1) + unsafe fn heap_mut(&mut self) -> &mut (*mut A::Item, usize) { + &mut self.heap } #[inline] fn from_heap(ptr: *mut A::Item, len: usize) -> SmallVecData { - SmallVecData { - heap: (NonNull::new(ptr).unwrap(), len), - } + SmallVecData { heap: (ptr, len) } } } #[cfg(not(feature = "union"))] enum SmallVecData { Inline(MaybeUninit), - Heap((NonNull, usize)), + Heap((*mut A::Item, usize)), } #[cfg(not(feature = "union"))] @@ -329,20 +327,20 @@ impl SmallVecData { #[inline] unsafe fn heap(&self) -> (*mut A::Item, usize) { match self { - SmallVecData::Heap(data) => (data.0.as_ptr(), data.1), + SmallVecData::Heap(data) => *data, _ => debug_unreachable!(), } } #[inline] - unsafe fn heap_mut(&mut self) -> (*mut A::Item, &mut usize) { + unsafe fn heap_mut(&mut self) -> &mut (*mut A::Item, usize) { match self { - SmallVecData::Heap(data) => (data.0.as_ptr(), &mut data.1), + SmallVecData::Heap(data) => data, _ => debug_unreachable!(), } } #[inline] fn from_heap(ptr: *mut A::Item, len: usize) -> SmallVecData { - SmallVecData::Heap((NonNull::new(ptr).unwrap(), len)) + SmallVecData::Heap((ptr, len)) } } @@ -569,7 +567,7 @@ impl SmallVec { fn triple_mut(&mut self) -> (*mut A::Item, &mut usize, usize) { unsafe { if self.spilled() { - let (ptr, len_ptr) = self.data.heap_mut(); + let &mut (ptr, ref mut len_ptr) = self.data.heap_mut(); (ptr, len_ptr, self.capacity) } else { (self.data.inline_mut(), &mut self.capacity, A::size())