simple_lines 0.0.1

Simple and secure line iterators to be used with all implementations of std::io::Read
Documentation
use {
    criterion::{black_box, criterion_group, criterion_main, Criterion},
    simple_lines::ReadExt,
    std::io::{BufRead, Cursor},
};

fn compare_bufread_lines(c: &mut Criterion) {
    const FILE: &str = "Dickens_Charles_Pickwick_Papers.xml";
    let input = std::fs::read_to_string(FILE).expect("Download input from http://hur.st/Dickens_Charles_Pickwick_Papers.xml.xz and extract it into the project root");
    c.bench_function("simple_lines::LineIterable::lines_rc()", |b| {
        b.iter(|| {
            assert_eq!(
                33532728,
                Cursor::new(black_box(input.clone()))
                    .lines_rc()
                    .filter_map(Result::ok)
                    .fold(0, |acc, n| acc + n.len())
            )
        })
    });
    c.bench_function("std::BufReader::lines()", |b| {
        b.iter(|| {
            assert_eq!(
                33532728,
                std::io::BufReader::new(Cursor::new(black_box(input.clone())))
                    .lines()
                    .filter_map(Result::ok)
                    .fold(0, |acc, n| acc + n.len())
            )
        })
    });
    c.bench_function("linereader::LineReader().next_line()", |b| {
        b.iter(|| {
            let mut cnt = 0;
            let mut iter = linereader::LineReader::new(Cursor::new(black_box(input.clone())));
            while let Some(x) = iter.next_line() {
                if let Ok(mut buf) = x {
                    if buf.last() == Some(&b'\n') {
                        buf = &buf[0..buf.len() - 1];
                        if buf.last() == Some(&b'\r') {
                            buf = &buf[0..buf.len() - 1];
                        }
                    }
                    if let Ok(input) = std::str::from_utf8(buf) {
                        cnt += input.len();
                    }
                }
            }

            assert_eq!(33532728, cnt);
        })
    });
}

criterion_group!(benches, compare_bufread_lines);
criterion_main!(benches);