Skip to content

Commit ace3ac2

Browse files
committed
Auto merge of #171 - cuviper:erase-remove, r=Amanieu
Add RawTable::erase and remove The two main uses of `erase_no_drop` are to then drop it in place or read it out, which are now provided by `erase` and `remove`.
2 parents efbd036 + 76db134 commit ace3ac2

File tree

3 files changed

+23
-19
lines changed

3 files changed

+23
-19
lines changed

src/map.rs

Lines changed: 5 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -578,9 +578,7 @@ impl<K, V, S> HashMap<K, V, S> {
578578
for item in self.table.iter() {
579579
let &mut (ref key, ref mut value) = item.as_mut();
580580
if !f(key, value) {
581-
// Erase the element from the table first since drop might panic.
582-
self.table.erase_no_drop(&item);
583-
item.drop();
581+
self.table.erase(item);
584582
}
585583
}
586584
}
@@ -1035,8 +1033,7 @@ where
10351033
unsafe {
10361034
let hash = make_hash(&self.hash_builder, &k);
10371035
if let Some(item) = self.table.find(hash, |x| k.eq(x.0.borrow())) {
1038-
self.table.erase_no_drop(&item);
1039-
Some(item.read())
1036+
Some(self.table.remove(item))
10401037
} else {
10411038
None
10421039
}
@@ -1373,8 +1370,7 @@ where
13731370
while let Some(item) = self.iter.next() {
13741371
let &mut (ref key, ref mut value) = item.as_mut();
13751372
if !(self.f)(key, value) {
1376-
self.table.erase_no_drop(&item);
1377-
return Some(item.read());
1373+
return Some(self.table.remove(item));
13781374
}
13791375
}
13801376
}
@@ -1783,10 +1779,7 @@ impl<'a, K, V> RawOccupiedEntryMut<'a, K, V> {
17831779
/// Take the ownership of the key and value from the map.
17841780
#[cfg_attr(feature = "inline-more", inline)]
17851781
pub fn remove_entry(self) -> (K, V) {
1786-
unsafe {
1787-
self.table.erase_no_drop(&self.elem);
1788-
self.elem.read()
1789-
}
1782+
unsafe { self.table.remove(self.elem) }
17901783
}
17911784
}
17921785

@@ -2427,10 +2420,7 @@ impl<'a, K, V, S> OccupiedEntry<'a, K, V, S> {
24272420
/// ```
24282421
#[cfg_attr(feature = "inline-more", inline)]
24292422
pub fn remove_entry(self) -> (K, V) {
2430-
unsafe {
2431-
self.table.table.erase_no_drop(&self.elem);
2432-
self.elem.read()
2433-
}
2423+
unsafe { self.table.table.remove(self.elem) }
24342424
}
24352425

24362426
/// Gets a reference to the value in the entry.

src/raw/mod.rs

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -511,6 +511,23 @@ impl<T> RawTable<T> {
511511
self.items -= 1;
512512
}
513513

514+
/// Erases an element from the table, dropping it in place.
515+
#[cfg_attr(feature = "inline-more", inline)]
516+
#[allow(clippy::needless_pass_by_value)]
517+
pub unsafe fn erase(&mut self, item: Bucket<T>) {
518+
// Erase the element from the table first since drop might panic.
519+
self.erase_no_drop(&item);
520+
item.drop();
521+
}
522+
523+
/// Removes an element from the table, returning it.
524+
#[cfg_attr(feature = "inline-more", inline)]
525+
#[allow(clippy::needless_pass_by_value)]
526+
pub unsafe fn remove(&mut self, item: Bucket<T>) -> T {
527+
self.erase_no_drop(&item);
528+
item.read()
529+
}
530+
514531
/// Returns an iterator for a probe sequence on the table.
515532
///
516533
/// This iterator never terminates, but is guaranteed to visit each bucket

src/rustc_entry.rs

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -318,10 +318,7 @@ impl<'a, K, V> RustcOccupiedEntry<'a, K, V> {
318318
/// ```
319319
#[cfg_attr(feature = "inline-more", inline)]
320320
pub fn remove_entry(self) -> (K, V) {
321-
unsafe {
322-
self.table.erase_no_drop(&self.elem);
323-
self.elem.read()
324-
}
321+
unsafe { self.table.remove(self.elem) }
325322
}
326323

327324
/// Gets a reference to the value in the entry.

0 commit comments

Comments
 (0)