summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRyan Geary <rtgnj42@gmail.com>2020-03-15 14:46:50 -0400
committerRyan Geary <rtgnj42@gmail.com>2020-03-15 14:46:50 -0400
commitc81efcf42f7b947b909b41123c7ac464fa6270e1 (patch)
treeedbd098a7eda0b8e4fe814181f3015ac11dbb84c
parentdfc95865d4801f106268585f00982963dac84c13 (diff)
Add custom BufReader to cut down on allocation time
-rw-r--r--src/main.rs11
-rw-r--r--src/reader.rs23
2 files changed, 29 insertions, 5 deletions
diff --git a/src/main.rs b/src/main.rs
index 551a572..e80f98f 100644
--- a/src/main.rs
+++ b/src/main.rs
@@ -1,9 +1,10 @@
use std::fs::File;
-use std::io::{self, BufRead, BufReader, Read, Write};
+use std::io::{self, Read, Write};
use structopt::StructOpt;
mod choice;
mod config;
+mod reader;
use config::Config;
fn main() {
@@ -15,14 +16,14 @@ fn main() {
None => Box::new(io::stdin()) as Box<dyn Read>,
};
- let buf = BufReader::new(read);
+ let mut reader = reader::BufReader::new(read);
+ let mut buffer = String::new();
let stdout = io::stdout();
let lock = stdout.lock();
let mut handle = io::BufWriter::new(lock);
- let lines = buf.lines();
- for line in lines {
+ while let Some(line) = reader.read_line(&mut buffer) {
match line {
Ok(l) => {
for choice in &config.opt.choice {
@@ -30,7 +31,7 @@ fn main() {
}
match handle.write(b"\n") {
Ok(_) => (),
- Err(e) => eprintln!("Failed to write to output: {}", e)
+ Err(e) => eprintln!("Failed to write to output: {}", e),
}
}
Err(e) => println!("Failed to read line: {}", e),
diff --git a/src/reader.rs b/src/reader.rs
new file mode 100644
index 0000000..b90097c
--- /dev/null
+++ b/src/reader.rs
@@ -0,0 +1,23 @@
+use std::io::{self, prelude::*};
+
+pub struct BufReader<R> {
+ reader: io::BufReader<R>,
+}
+
+impl<R: Read> BufReader<R> {
+ pub fn new(f: R) -> Self {
+ Self { reader: io::BufReader::new(f) }
+ }
+
+ pub fn read_line<'buf>(
+ &mut self,
+ buffer: &'buf mut String,
+ ) -> Option<io::Result<&'buf mut String>> {
+ buffer.clear();
+
+ self.reader
+ .read_line(buffer)
+ .map(|u| if u == 0 { None } else { Some(buffer) })
+ .transpose()
+ }
+}