From 192d18c2ac829da956c8f088887b696a812c9758 Mon Sep 17 00:00:00 2001 From: Connor Skees Date: Fri, 3 Jul 2020 20:34:03 -0400 Subject: [PATCH] explain why we don't use a `HashSet` for `SelectorHashSet` --- src/selector/extend/extended_selector.rs | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/selector/extend/extended_selector.rs b/src/selector/extend/extended_selector.rs index a80ecb4..1e3514a 100644 --- a/src/selector/extend/extended_selector.rs +++ b/src/selector/extend/extended_selector.rs @@ -2,6 +2,7 @@ use std::{ cell::RefCell, hash::{Hash, Hasher}, rc::Rc, + vec::IntoIter }; use crate::selector::{Selector, SelectorList}; @@ -37,6 +38,11 @@ impl ExtendedSelector { } } +/// We could use a `HashSet` here, but since selectors are +/// in a `RefCell`, we may unintentionally cause (library) UB. +/// +/// Initial benchmarking found that a `Vec` was actually *faster* +/// than a `HashSet`, the reason for which I am unsure. #[derive(Clone, Debug)] pub(crate) struct SelectorHashSet(Vec); @@ -51,7 +57,7 @@ impl SelectorHashSet { } } - pub fn into_iter(self) -> std::vec::IntoIter { + pub fn into_iter(self) -> IntoIter { self.0.into_iter() } }