@@ -40,6 +40,13 @@ struct Cap(usize);
4040
4141impl Cap {
4242 const ZERO : Cap = unsafe { Cap ( 0 ) } ;
43+
44+ /// `Cap(cap)`, except if `T` is a ZST then `Cap::ZERO`.
45+ ///
46+ /// # Safety: cap must be <= `isize::MAX`.
47+ unsafe fn new < T > ( cap : usize ) -> Self {
48+ if T :: IS_ZST { Cap :: ZERO } else { unsafe { Self ( cap) } }
49+ }
4350}
4451
4552/// A low-level utility for more ergonomically allocating, reallocating, and deallocating
@@ -258,6 +265,8 @@ impl<T, A: Allocator> RawVec<T, A> {
258265 pub unsafe fn from_raw_parts_in ( ptr : * mut T , capacity : usize , alloc : A ) -> Self {
259266 // SAFETY: Precondition passed to the caller
260267 unsafe {
268+ let ptr = ptr. cast ( ) ;
269+ let capacity = Cap :: new :: < T > ( capacity) ;
261270 Self {
262271 inner : RawVecInner :: from_raw_parts_in ( ptr, capacity, alloc) ,
263272 _marker : PhantomData ,
@@ -274,6 +283,8 @@ impl<T, A: Allocator> RawVec<T, A> {
274283 pub unsafe fn from_nonnull_in ( ptr : NonNull < T > , capacity : usize , alloc : A ) -> Self {
275284 // SAFETY: Precondition passed to the caller
276285 unsafe {
286+ let ptr = ptr. cast ( ) ;
287+ let capacity = Cap :: new :: < T > ( capacity) ;
277288 Self { inner : RawVecInner :: from_nonnull_in ( ptr, capacity, alloc) , _marker : PhantomData }
278289 }
279290 }
@@ -474,15 +485,13 @@ impl<A: Allocator> RawVecInner<A> {
474485 }
475486
476487 #[ inline]
477- unsafe fn from_raw_parts_in < T > ( ptr : * mut T , capacity : usize , alloc : A ) -> Self {
478- let cap = if T :: IS_ZST { Cap :: ZERO } else { unsafe { Cap ( capacity) } } ;
479- Self { ptr : unsafe { Unique :: new_unchecked ( ptr. cast ( ) ) } , cap, alloc }
488+ unsafe fn from_raw_parts_in ( ptr : * mut u8 , cap : Cap , alloc : A ) -> Self {
489+ Self { ptr : unsafe { Unique :: new_unchecked ( ptr) } , cap, alloc }
480490 }
481491
482492 #[ inline]
483- unsafe fn from_nonnull_in < T > ( ptr : NonNull < T > , capacity : usize , alloc : A ) -> Self {
484- let cap = if T :: IS_ZST { Cap :: ZERO } else { unsafe { Cap ( capacity) } } ;
485- Self { ptr : Unique :: from ( ptr. cast ( ) ) , cap, alloc }
493+ unsafe fn from_nonnull_in ( ptr : NonNull < u8 > , cap : Cap , alloc : A ) -> Self {
494+ Self { ptr : Unique :: from ( ptr) , cap, alloc }
486495 }
487496
488497 #[ inline]
0 commit comments