Make Archive::remove parallel; Add Archive::pop method;
This commit is contained in:
parent
43d8c82c08
commit
00683722d6
@ -4,7 +4,7 @@ use std::{
|
||||
path::PathBuf,
|
||||
};
|
||||
|
||||
use rayon::prelude::{IntoParallelRefIterator, ParallelIterator};
|
||||
use rayon::prelude::{IntoParallelRefIterator, ParallelIterator, IndexedParallelIterator};
|
||||
|
||||
mod error;
|
||||
mod header;
|
||||
@ -143,7 +143,7 @@ impl Archive {
|
||||
pub fn remove(&mut self, filename: &str) -> Result<bool, Error> {
|
||||
let mut name = [0u8; 100];
|
||||
name[..filename.len()].copy_from_slice(filename.as_bytes());
|
||||
if let Some(i) = &self.nodes.iter().position(|x| x.header.fname == name) {
|
||||
if let Some(i) = &self.nodes.par_iter().position_any(|x| x.header.fname == name) {
|
||||
self.nodes.remove(*i);
|
||||
return Ok(true);
|
||||
}
|
||||
@ -166,6 +166,17 @@ impl Archive {
|
||||
x.header.file_path() == Ok(PathBuf::from(filename))
|
||||
}).cloned()
|
||||
}
|
||||
|
||||
pub fn pop(&mut self, filename: &str) -> Option<Node> {
|
||||
if let Some(i) = self.nodes.par_iter().position_any(|x| {
|
||||
x.header.file_path() == Ok(PathBuf::from(filename))
|
||||
}) {
|
||||
let node = self.nodes.get(i).cloned();
|
||||
self.nodes.remove(i);
|
||||
return node;
|
||||
}
|
||||
None
|
||||
}
|
||||
}
|
||||
|
||||
#[cfg(test)]
|
||||
|
BIN
test/2.tar
BIN
test/2.tar
Binary file not shown.
Loading…
Reference in New Issue
Block a user