Skip to content

Commit 8bb1591

Browse files
bors[bot]Amanieu
andcommitted
Merge #61
61: Improve worst-case performance of HashSet.is_subset r=Amanieu a=Amanieu Ported from rust-lang/rust#59665 Co-authored-by: Amanieu d'Antras <[email protected]>
2 parents 9068eb7 + b18db6c commit 8bb1591

File tree

3 files changed

+14
-6
lines changed

3 files changed

+14
-6
lines changed

src/external_trait_impls/rayon/set.rs

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -256,7 +256,11 @@ where
256256
///
257257
/// This method runs in a potentially parallel fashion.
258258
pub fn par_is_subset(&self, other: &Self) -> bool {
259-
self.into_par_iter().all(|x| other.contains(x))
259+
if self.len() <= other.len() {
260+
self.into_par_iter().all(|x| other.contains(x))
261+
} else {
262+
false
263+
}
260264
}
261265

262266
/// Returns `true` if the set is a superset of another,

src/raw/mod.rs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -145,7 +145,7 @@ fn h2(hash: u64) -> u8 {
145145
/// (skipping over 1 group), then 3 groups (skipping over 2 groups), and so on.
146146
///
147147
/// Proof that the probe will visit every group in the table:
148-
/// https://fgiesen.wordpress.com/2015/02/22/triangular-numbers-mod-2n/
148+
/// <https://fgiesen.wordpress.com/2015/02/22/triangular-numbers-mod-2n/>
149149
struct ProbeSeq {
150150
bucket_mask: usize,
151151
pos: usize,
@@ -935,12 +935,12 @@ impl<T> RawTable<T> {
935935
/// should be dropped using a `RawIter` before freeing the allocation.
936936
#[inline]
937937
pub fn into_alloc(self) -> Option<(NonNull<u8>, Layout)> {
938-
let alloc = if !self.is_empty_singleton() {
938+
let alloc = if self.is_empty_singleton() {
939+
None
940+
} else {
939941
let (layout, _) = calculate_layout::<T>(self.buckets())
940942
.unwrap_or_else(|| unsafe { hint::unreachable_unchecked() });
941943
Some((self.ctrl.cast(), layout))
942-
} else {
943-
None
944944
};
945945
mem::forget(self);
946946
alloc

src/set.rs

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -640,7 +640,11 @@ where
640640
/// assert_eq!(set.is_subset(&sup), false);
641641
/// ```
642642
pub fn is_subset(&self, other: &Self) -> bool {
643-
self.iter().all(|v| other.contains(v))
643+
if self.len() <= other.len() {
644+
self.iter().all(|v| other.contains(v))
645+
} else {
646+
false
647+
}
644648
}
645649

646650
/// Returns `true` if the set is a superset of another,

0 commit comments

Comments
 (0)