diff --git a/src/lib.rs b/src/lib.rs index e1be107..39193b6 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -52,6 +52,11 @@ pub trait Peekable { fn peek_next(&self) -> Option; } +pub trait Measured { + fn len(&self) -> usize; + fn remaining(&self) -> usize; +} + /// SpanRange encompasses the valid Ops::Range types for use with the Span trait. pub enum SpanRange { Range(std::ops::Range), @@ -317,3 +322,25 @@ impl<'a> Peekable<&'a u8> for StrCursor<'a> { self.source.as_bytes().get(self.offset) } } + +impl<'a> Measured for StrCursor<'a> { + fn len(&self) -> usize { + self.source.len() + } + + fn remaining(&self) -> usize { + self.source[self.offset..].len() + } +} + +impl<'a, O> Measured for SliceCursor<'a, O> + where O: Debug +{ + fn len(&self) -> usize { + self.source.len() + } + + fn remaining(&self) -> usize { + self.source[self.offset..].len() + } +} diff --git a/src/test.rs b/src/test.rs index e925c42..6614b9a 100644 --- a/src/test.rs +++ b/src/test.rs @@ -14,7 +14,7 @@ use super::{ SliceCursor, StrCursor, - Cursor, Offsetable, Span + Cursor, Offsetable, Span, Measured }; #[test] @@ -87,8 +87,11 @@ fn test_str_span() { let mut iter = StrCursor::new(input_str); assert_eq!(0, iter.get_offset()); + assert_eq!(12, iter.len()); + assert_eq!(12, iter.remaining()); assert_eq!("foo", iter.span(0..3)); iter.next(); + assert_eq!(11, iter.remaining()); assert_eq!("oo", iter.span(0..2)); } @@ -98,7 +101,10 @@ fn test_slice_span() { let mut iter = SliceCursor::new(input_str.as_bytes()); assert_eq!(0, iter.get_offset()); + assert_eq!(12, iter.len()); + assert_eq!(12, iter.remaining()); assert_eq!("foo".as_bytes(), iter.span(0..3)); iter.next(); + assert_eq!(11, iter.remaining()); assert_eq!("oo".as_bytes(), iter.span(0..2)); }