From c81efcf42f7b947b909b41123c7ac464fa6270e1 Mon Sep 17 00:00:00 2001 From: Ryan Geary Date: Sun, 15 Mar 2020 14:46:50 -0400 Subject: Add custom BufReader to cut down on allocation time --- src/main.rs | 11 ++++++----- src/reader.rs | 23 +++++++++++++++++++++++ 2 files changed, 29 insertions(+), 5 deletions(-) create mode 100644 src/reader.rs 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, }; - 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 { + reader: io::BufReader, +} + +impl BufReader { + pub fn new(f: R) -> Self { + Self { reader: io::BufReader::new(f) } + } + + pub fn read_line<'buf>( + &mut self, + buffer: &'buf mut String, + ) -> Option> { + buffer.clear(); + + self.reader + .read_line(buffer) + .map(|u| if u == 0 { None } else { Some(buffer) }) + .transpose() + } +} -- cgit v1.2.3