diff --git a/benches/bench.rs b/benches/bench.rs index 22c1d40..d4883d8 100644 --- a/benches/bench.rs +++ b/benches/bench.rs @@ -8,10 +8,12 @@ use criterion::Criterion; use byte_ngram::*; fn criterion_benchmark(c: &mut Criterion) { - let data = b"Blackmail is such an ugly word. I prefer extortion. The 'x' makes it sound cool."; + let data = "Blackmail is such an ugly word. I prefer extortion. The 'x' makes it sound cool."; - c.bench_function("from_slice", |b| b.iter(|| for _ in from_slice(&data[..]) {})); - c.bench_function("ByteNgramReader", |b| b.iter(|| for _ in ByteNgramReader::new(&data[..]) {})); + let len = from_slice(&data[..]).len(); + + c.bench_function("from_slice", |b| b.iter(|| assert_eq!(len, from_slice(&data[..]).len()))); + c.bench_function("ByteNgramReader", |b| b.iter(|| assert_eq!(len, ByteNgramReader::new(&data).count()))); } criterion_group!(benches, criterion_benchmark); diff --git a/src/lib.rs b/src/lib.rs index 00d0fcc..2ef8b82 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -1,11 +1,11 @@ #[macro_use] extern crate serde_derive; -use std::io::{Bytes, Read}; use std::fmt; use std::cmp; use std::ops; use std::convert; +use std::slice::Iter; #[derive(Hash, PartialEq, Eq, Clone, Copy, PartialOrd, Ord, Serialize, Deserialize)] pub struct ByteNgram(u64); @@ -90,18 +90,18 @@ impl convert::From for ByteNgram { } } -pub struct ByteNgramReader { - inner: Bytes, +pub struct ByteNgramReader<'a> { + inner: Iter<'a, u8>, count: u64, token: u64, mask: u64, } -impl ByteNgramReader { +impl<'a> ByteNgramReader<'a> { #[inline] - pub fn new(inner: R) -> Self { + pub fn new(inner: &'a T) -> Self where T: AsRef<[u8]> { ByteNgramReader { - inner: inner.bytes(), + inner: inner.as_ref().iter(), count: 0, token: 0, mask: 0, @@ -109,14 +109,14 @@ impl ByteNgramReader { } } -impl Iterator for ByteNgramReader { +impl<'a> Iterator for ByteNgramReader<'a> { type Item = ByteNgram; #[inline] fn next(&mut self) -> Option { if self.mask == 0 { - if let Some(Ok(byte)) = self.inner.next() { - self.token += u64::from(byte); + if let Some(byte) = self.inner.next() { + self.token += u64::from(*byte); self.token <<= 8; if self.count < 6 { @@ -253,7 +253,7 @@ mod tests { let data = b"abc"; let mut a = from_slice(&data); - let mut b = ByteNgramReader::new(&data[..]).collect::>(); + let mut b = ByteNgramReader::new(&data).collect::>(); assert_eq!(a.len(), b.len());