@@ -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