Skip to content

Commit 9f1afa3

Browse files
devnexensylvestre
authored andcommitted
csplit: use VecDeque instead of Vec for FIFO buffer
Replace Vec with VecDeque in InputSplitter to avoid O(n) shifts on remove(0). Use push_front/pop_front/push_back for O(1) queue operations.
1 parent 03127aa commit 9f1afa3

File tree

1 file changed

+8
-7
lines changed

1 file changed

+8
-7
lines changed

src/uu/csplit/src/csplit.rs

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
#![allow(rustdoc::private_intra_doc_links)]
77

88
use std::cmp::Ordering;
9+
use std::collections::VecDeque;
910
use std::ffi::OsString;
1011
use std::io::{self, BufReader, ErrorKind};
1112
use std::{
@@ -530,7 +531,7 @@ where
530531
I: Iterator<Item = (usize, UResult<String>)>,
531532
{
532533
iter: I,
533-
buffer: Vec<<I as Iterator>::Item>,
534+
buffer: VecDeque<<I as Iterator>::Item>,
534535
/// the number of elements the buffer may hold
535536
size: usize,
536537
/// flag to indicate content off the buffer should be returned instead of off the wrapped
@@ -545,7 +546,7 @@ where
545546
fn new(iter: I) -> Self {
546547
Self {
547548
iter,
548-
buffer: Vec::new(),
549+
buffer: VecDeque::new(),
549550
rewind: false,
550551
size: 1,
551552
}
@@ -584,14 +585,14 @@ where
584585
/// option.
585586
fn add_line_to_buffer(&mut self, ln: usize, line: String) -> Option<String> {
586587
if self.rewind {
587-
self.buffer.insert(0, (ln, Ok(line)));
588+
self.buffer.push_front((ln, Ok(line)));
588589
None
589590
} else if self.buffer.len() >= self.size {
590-
let (_, head_line) = self.buffer.remove(0);
591-
self.buffer.push((ln, Ok(line)));
591+
let (_, head_line) = self.buffer.pop_front().unwrap();
592+
self.buffer.push_back((ln, Ok(line)));
592593
Some(head_line.unwrap())
593594
} else {
594-
self.buffer.push((ln, Ok(line)));
595+
self.buffer.push_back((ln, Ok(line)));
595596
None
596597
}
597598
}
@@ -611,7 +612,7 @@ where
611612
fn next(&mut self) -> Option<Self::Item> {
612613
if self.rewind {
613614
if !self.buffer.is_empty() {
614-
return Some(self.buffer.remove(0));
615+
return Some(self.buffer.pop_front().unwrap());
615616
}
616617
self.rewind = false;
617618
}

0 commit comments

Comments
 (0)