@@ -170,7 +170,7 @@ use std::slice;
170
170
// use std::vec::Drain;
171
171
use compare:: Compare ;
172
172
use core:: fmt;
173
- use core:: mem:: { size_of, swap} ;
173
+ use core:: mem:: { size_of, swap, ManuallyDrop } ;
174
174
use core:: ptr;
175
175
#[ cfg( feature = "serde" ) ]
176
176
use serde:: { Deserialize , Serialize } ;
@@ -1286,8 +1286,7 @@ impl<T, C: Compare<T>> BinaryHeap<T, C> {
1286
1286
/// position with the value that was originally removed.
1287
1287
struct Hole < ' a , T : ' a > {
1288
1288
data : & ' a mut [ T ] ,
1289
- /// `elt` is always `Some` from new until drop.
1290
- elt : Option < T > ,
1289
+ elt : ManuallyDrop < T > ,
1291
1290
pos : usize ,
1292
1291
}
1293
1292
@@ -1302,7 +1301,7 @@ impl<'a, T> Hole<'a, T> {
1302
1301
let elt = unsafe { ptr:: read ( data. get_unchecked ( pos) ) } ;
1303
1302
Hole {
1304
1303
data,
1305
- elt : Some ( elt) ,
1304
+ elt : ManuallyDrop :: new ( elt) ,
1306
1305
pos,
1307
1306
}
1308
1307
}
@@ -1315,7 +1314,7 @@ impl<'a, T> Hole<'a, T> {
1315
1314
/// Returns a reference to the element removed.
1316
1315
#[ inline]
1317
1316
fn element ( & self ) -> & T {
1318
- self . elt . as_ref ( ) . unwrap ( )
1317
+ & self . elt
1319
1318
}
1320
1319
1321
1320
/// Returns a reference to the element at `index`.
@@ -1351,7 +1350,7 @@ impl<'a, T> Drop for Hole<'a, T> {
1351
1350
// fill the hole again
1352
1351
unsafe {
1353
1352
let pos = self . pos ;
1354
- ptr:: write ( self . data . get_unchecked_mut ( pos) , self . elt . take ( ) . unwrap ( ) ) ;
1353
+ ptr:: copy_nonoverlapping ( & * self . elt , self . data . get_unchecked_mut ( pos) , 1 ) ;
1355
1354
}
1356
1355
}
1357
1356
}
0 commit comments