use crate::lib::slice;
#[cfg(feature = "format")]
use super::skip_value::*;
pub(crate) trait ConsumedIterator: Iterator {
fn consumed(&self) -> bool;
}
impl<T: ExactSizeIterator> ConsumedIterator for T {
#[inline]
fn consumed(&self) -> bool {
self.len() == 0
}
}
pub(crate) trait AsPtrIterator<'a, T: 'a>: Iterator<Item=&'a T> {
fn as_ptr(&self) -> *const T;
}
impl<'a, T> AsPtrIterator<'a, T> for slice::Iter<'a, T> {
#[inline]
fn as_ptr(&self) -> *const T {
self.as_slice().as_ptr()
}
}
pub(crate) type IteratorNoSeparator<'a> = slice::Iter<'a, u8>;
#[inline(always)]
pub(crate) fn iterate_digits_no_separator<'a>(bytes: &'a [u8], _: u8)
-> IteratorNoSeparator<'a>
{
bytes.iter()
}
#[cfg(feature = "format")]
pub(crate) type IteratorSeparator<'a> = SkipValueIterator<'a, u8>;
#[cfg(feature = "format")]
#[inline(always)]
pub(crate) fn iterate_digits_ignore_separator<'a>(bytes: &'a [u8], digit_separator: u8)
-> IteratorSeparator<'a>
{
IteratorSeparator::new(bytes, digit_separator)
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn consumer_iterator_test() {
let mut iter = b"12345".iter();
assert_eq!(iter.consumed(), false);
assert_eq!(iter.nth(4).unwrap(), &b'5');
assert_eq!(iter.consumed(), true);
}
#[test]
fn as_ptr_iterator_test() {
let digits = b"12345";
let mut iter = digits.iter();
assert_eq!(iter.as_ptr(), digits.as_ptr());
assert_eq!(iter.nth(4).unwrap(), &b'5');
assert_eq!(iter.as_ptr(), digits[digits.len()..].as_ptr());
}
#[test]
fn iterate_digits_no_separator_test() {
assert!(iterate_digits_no_separator(b"01", b'\x00').eq(b"01".iter()));
assert!(iterate_digits_no_separator(b"01_01", b'_').eq(b"01_01".iter()));
}
#[test]
#[cfg(feature = "format")]
fn iterate_digits_ignore_separator_test() {
assert!(iterate_digits_ignore_separator(b"01", b'_').eq(b"01".iter()));
assert!(iterate_digits_ignore_separator(b"01_01", b'_').eq(b"0101".iter()));
}
}