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