1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
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()));
}
}