File tree 1 file changed +18
-4
lines changed
1 file changed +18
-4
lines changed Original file line number Diff line number Diff line change 92
92
mem:: transmute :: < & [ MaybeUninit < T > ] , & [ T ] > ( slice)
93
93
}
94
94
}
95
+
96
+ /// Returns a mutable slice of all elements that have not been yielded yet.
97
+ fn as_mut_slice ( & mut self ) -> & mut [ T ] {
98
+ // This transmute is safe, same as in `as_slice` above.
99
+ let slice = & mut self . data [ self . alive . clone ( ) ] ;
100
+ // SAFETY: This transmute is safe. As mentioned in `new`, `MaybeUninit` retains
101
+ // the size and alignment of `T`. Furthermore, we know that all
102
+ // elements within `alive` are properly initialized.
103
+ unsafe {
104
+ mem:: transmute :: < & mut [ MaybeUninit < T > ] , & mut [ T ] > ( slice)
105
+ }
106
+ }
95
107
}
96
108
97
109
@@ -184,10 +196,12 @@ where
184
196
[ T ; N ] : LengthAtMost32 ,
185
197
{
186
198
fn drop ( & mut self ) {
187
- // We simply drop each element via `for_each`. This should not incur
188
- // any significant runtime overhead and avoids adding another `unsafe`
189
- // block.
190
- self . by_ref ( ) . for_each ( drop) ;
199
+ // SAFETY: This is safe: `as_mut_slice` returns exactly the sub-slice
200
+ // of elements that have not been moved out yet and that remain
201
+ // to be dropped.
202
+ unsafe {
203
+ ptr:: drop_in_place ( self . as_mut_slice ( ) )
204
+ }
191
205
}
192
206
}
193
207
You can’t perform that action at this time.
0 commit comments