Avoid clone() to allocate unnecessary memory; use byte slices instead of Strings for case-insensitive search

This commit is contained in:
sxyazi 2023-12-25 01:20:10 +08:00
parent a034168174
commit efc7077a13
No known key found for this signature in database

View file

@ -1,4 +1,4 @@
use std::{collections::{BTreeMap, BTreeSet}, mem, ops::Deref, sync::atomic::Ordering}; use std::{collections::{BTreeMap, BTreeSet}, ffi::OsStr, mem, ops::Deref, sync::atomic::Ordering};
use anyhow::Result; use anyhow::Result;
use tokio::{fs, select, sync::mpsc::{self, UnboundedReceiver}}; use tokio::{fs, select, sync::mpsc::{self, UnboundedReceiver}};
@ -386,39 +386,35 @@ impl Files {
return false; return false;
} }
let old_hidden: Vec<File>; let (hidden, items) = if self.show_hidden {
if self.show_hidden { (vec![], mem::take(&mut self.hidden))
(self.hidden, old_hidden) = (Vec::new(), self.hidden.clone()); } else {
} else { mem::take(&mut self.hidden).into_iter().partition(|f| f.is_hidden())
(self.hidden, old_hidden) = };
self.hidden.iter().cloned().partition(|f| f.is_hidden());
}; self.hidden = hidden;
if !items.is_empty() {
self.items.extend(items);
self.sorter.sort(&mut self.items, &self.sizes);
}
if keyword.is_empty() { if keyword.is_empty() {
self.filter = None; self.filter = None;
self.items.extend(old_hidden);
self.sorter.sort(&mut self.items, &self.sizes);
return true; return true;
} else {
self.filter = Some(keyword.to_owned());
} }
self.filter = Some(keyword.to_owned()); let keyword = OsStr::new(keyword).to_ascii_lowercase();
let keyword = keyword.as_encoded_bytes();
if !old_hidden.is_empty() { let (items, hidden): (Vec<_>, Vec<_>) = mem::take(&mut self.items).into_iter().partition(|f| {
self.items.extend(old_hidden); f.url.file_name().is_some_and(|s| {
self.sorter.sort(&mut self.items, &self.sizes); s.to_ascii_lowercase().as_encoded_bytes().windows(keyword.len()).any(|w| w == keyword)
} })
let hidden: Vec<File>;
(hidden, self.items) = self.items.iter().cloned().partition(|f| {
let Some(filename) = f.url.file_name().and_then(|o| o.to_str()) else {
return true;
};
!filename.to_lowercase().contains(&keyword.to_lowercase())
}); });
self.hidden.extend(hidden); self.hidden.extend(hidden);
self.items = items;
true true
} }