feat: Introduce a Measured trait

containing:

* len
* remaining
This commit is contained in:
Jeremy Wall 2024-11-21 19:56:10 -05:00
parent 025535f03c
commit 699df1c4c9
2 changed files with 34 additions and 1 deletions

View File

@ -52,6 +52,11 @@ pub trait Peekable<O> {
fn peek_next(&self) -> Option<O>; fn peek_next(&self) -> Option<O>;
} }
pub trait Measured {
fn len(&self) -> usize;
fn remaining(&self) -> usize;
}
/// SpanRange encompasses the valid Ops::Range types for use with the Span trait. /// SpanRange encompasses the valid Ops::Range types for use with the Span trait.
pub enum SpanRange { pub enum SpanRange {
Range(std::ops::Range<usize>), Range(std::ops::Range<usize>),
@ -317,3 +322,25 @@ impl<'a> Peekable<&'a u8> for StrCursor<'a> {
self.source.as_bytes().get(self.offset) 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()
}
}

View File

@ -14,7 +14,7 @@
use super::{ use super::{
SliceCursor, StrCursor, SliceCursor, StrCursor,
Cursor, Offsetable, Span Cursor, Offsetable, Span, Measured
}; };
#[test] #[test]
@ -87,8 +87,11 @@ fn test_str_span() {
let mut iter = StrCursor::new(input_str); let mut iter = StrCursor::new(input_str);
assert_eq!(0, iter.get_offset()); assert_eq!(0, iter.get_offset());
assert_eq!(12, iter.len());
assert_eq!(12, iter.remaining());
assert_eq!("foo", iter.span(0..3)); assert_eq!("foo", iter.span(0..3));
iter.next(); iter.next();
assert_eq!(11, iter.remaining());
assert_eq!("oo", iter.span(0..2)); assert_eq!("oo", iter.span(0..2));
} }
@ -98,7 +101,10 @@ fn test_slice_span() {
let mut iter = SliceCursor::new(input_str.as_bytes()); let mut iter = SliceCursor::new(input_str.as_bytes());
assert_eq!(0, iter.get_offset()); 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)); assert_eq!("foo".as_bytes(), iter.span(0..3));
iter.next(); iter.next();
assert_eq!(11, iter.remaining());
assert_eq!("oo".as_bytes(), iter.span(0..2)); assert_eq!("oo".as_bytes(), iter.span(0..2));
} }