Skip to content

Commit 3e12496

Browse files
Merge pull request #54 from triblespace/codex/identify-next-steps-for-project-advancement
Implement iterator traits for BytesIterOffsets
2 parents 95797e9 + fd32b9a commit 3e12496

File tree

4 files changed

+39
-1
lines changed

4 files changed

+39
-1
lines changed

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -96,6 +96,7 @@
9696
removed the corresponding task from the inventory
9797
- implemented `bytes::Buf` for `Bytes` and `From<Bytes>` for `bytes::Bytes` for
9898
seamless integration with Tokio and other libraries
99+
- implemented `ExactSizeIterator` and `FusedIterator` for `BytesIterOffsets`
99100

100101
## 0.19.3 - 2025-05-30
101102
- implemented `Error` for `ViewError`

INVENTORY.md

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@
55

66
## Desired Functionality
77
- Add Kani proofs for winnow view helpers.
8-
- Implement `ExactSizeIterator` or `FusedIterator` for `BytesIterOffsets` to simplify iteration.
98

109
## Discovered Issues
1110
- None at the moment.

src/tests.rs

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -281,6 +281,31 @@ fn test_winnow_stream_take() {
281281
assert_eq!(input.as_bytes(), [3u8, 4].as_ref());
282282
}
283283

284+
#[cfg(feature = "winnow")]
285+
#[test]
286+
fn test_iter_offsets_traits() {
287+
use std::iter::{ExactSizeIterator, FusedIterator};
288+
use winnow::stream::Stream;
289+
290+
fn assert_traits<I: ExactSizeIterator + FusedIterator>(iter: I) -> I {
291+
iter
292+
}
293+
294+
let bytes = Bytes::from(vec![1u8, 2, 3, 4]);
295+
let mut iter = assert_traits(Stream::iter_offsets(&bytes));
296+
assert_eq!(iter.len(), 4);
297+
assert_eq!(iter.size_hint(), (4, Some(4)));
298+
299+
for (i, (offset, byte)) in (&mut iter).enumerate() {
300+
assert_eq!(offset, i);
301+
assert_eq!(byte, bytes.as_ref()[i]);
302+
}
303+
304+
assert_eq!(iter.len(), 0);
305+
assert_eq!(iter.next(), None);
306+
assert_eq!(iter.next(), None);
307+
}
308+
284309
#[cfg(all(feature = "winnow", feature = "zerocopy"))]
285310
#[test]
286311
fn test_winnow_view_parser() {

src/winnow.rs

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,8 +33,21 @@ impl Iterator for BytesIterOffsets {
3333
self.offset += 1;
3434
Some((offset, token))
3535
}
36+
37+
fn size_hint(&self) -> (usize, Option<usize>) {
38+
let len = self.bytes.as_slice().len();
39+
(len, Some(len))
40+
}
41+
}
42+
43+
impl ExactSizeIterator for BytesIterOffsets {
44+
fn len(&self) -> usize {
45+
self.bytes.as_slice().len()
46+
}
3647
}
3748

49+
impl std::iter::FusedIterator for BytesIterOffsets {}
50+
3851
impl SliceLen for Bytes {
3952
#[inline(always)]
4053
fn slice_len(&self) -> usize {

0 commit comments

Comments
 (0)