Avoid parent_url() allocating a new Url to optimize the performance of add_many method

This commit is contained in:
sxyazi 2024-02-18 15:17:34 +08:00
parent dd1af25846
commit 5f6a364433
No known key found for this signature in database

View file

@ -48,36 +48,31 @@ impl Selected {
/// # Examples
///
/// ```
/// #
/// # use yazi_core::select::Select;
/// # use yazi_shared::fs::Url;
/// let mut selected= Select::default();
/// let mut s = Selected::default();
///
/// let url1 = Url::from("/a/b/c");
/// let url2 = Url::from("/a/b/d");
/// let urls = vec![&url1, &url2];
///
/// assert!(selected.add_many(&urls));
/// assert!(selected.add_many(&[&url1, &url2]));
/// ```
pub fn add_many(&mut self, urls: &[&Url]) -> bool {
if urls.is_empty() {
return true;
} else if self.parents.contains_key(urls[0]) {
return false;
}
let mut parent = urls[0].parent_url();
let mut parents = vec![];
while let Some(u) = parent {
if self.inner.contains(&u) {
return false;
}
parent = u.parent_url();
parents.push(u);
}
if self.parents.contains_key(urls[0]) {
return false;
}
let mut parent = urls[0].parent_url();
while let Some(u) = parent {
parent = u.parent_url();
for u in parents {
*self.parents.entry(u).or_insert(0) += urls.len();
}