@@ -40,6 +40,13 @@ struct Cap(usize);
40
40
41
41
impl Cap {
42
42
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
+ }
43
50
}
44
51
45
52
/// A low-level utility for more ergonomically allocating, reallocating, and deallocating
@@ -258,6 +265,8 @@ impl<T, A: Allocator> RawVec<T, A> {
258
265
pub unsafe fn from_raw_parts_in ( ptr : * mut T , capacity : usize , alloc : A ) -> Self {
259
266
// SAFETY: Precondition passed to the caller
260
267
unsafe {
268
+ let ptr = ptr. cast ( ) ;
269
+ let capacity = Cap :: new :: < T > ( capacity) ;
261
270
Self {
262
271
inner : RawVecInner :: from_raw_parts_in ( ptr, capacity, alloc) ,
263
272
_marker : PhantomData ,
@@ -274,6 +283,8 @@ impl<T, A: Allocator> RawVec<T, A> {
274
283
pub unsafe fn from_nonnull_in ( ptr : NonNull < T > , capacity : usize , alloc : A ) -> Self {
275
284
// SAFETY: Precondition passed to the caller
276
285
unsafe {
286
+ let ptr = ptr. cast ( ) ;
287
+ let capacity = Cap :: new :: < T > ( capacity) ;
277
288
Self { inner : RawVecInner :: from_nonnull_in ( ptr, capacity, alloc) , _marker : PhantomData }
278
289
}
279
290
}
@@ -474,15 +485,13 @@ impl<A: Allocator> RawVecInner<A> {
474
485
}
475
486
476
487
#[ 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 }
480
490
}
481
491
482
492
#[ 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 }
486
495
}
487
496
488
497
#[ inline]
0 commit comments