o3/buffer/hold/ranges/
iter.rs1use std::{iter::FusedIterator, num::NonZero};
2
3use hold::ranges;
4
5use crate::{
6 buffer,
7 buffer::{hold, segments},
8};
9
10pub struct Iter<'plan, 'source, 'ranges, S: ?Sized, N = u32> {
12 pub(super) plan: &'plan ranges::Set<'source, 'ranges, S, N>,
13 pub(super) remaining: segments::Count,
14}
15
16impl<'plan, 'source, 'ranges, S: buffer::raw::Source + ?Sized, N: buffer::raw::Length>
17 Iter<'plan, 'source, 'ranges, S, N>
18{
19 pub(super) const fn new(plan: &'plan ranges::Set<'source, 'ranges, S, N>) -> Self {
20 Self {
21 plan,
22 remaining: plan.count(),
23 }
24 }
25}
26
27impl<'source, S: buffer::raw::Source + ?Sized, N: buffer::raw::Length> Iterator
28 for Iter<'_, 'source, '_, S, N>
29{
30 type Item = buffer::View<'source, S>;
31
32 fn next(&mut self) -> Option<Self::Item> {
33 let left = NonZero::new(self.remaining.into_raw())?;
34 Some(ranges::Set::advance(self, left))
35 }
36
37 fn size_hint(&self) -> (usize, Option<usize>) {
38 let left = self.remaining.into_raw() as usize;
39 (left, Some(left))
40 }
41}
42
43impl<S: buffer::raw::Source + ?Sized, N: buffer::raw::Length> ExactSizeIterator
44 for Iter<'_, '_, '_, S, N>
45{
46}
47impl<S: buffer::raw::Source + ?Sized, N: buffer::raw::Length> FusedIterator
48 for Iter<'_, '_, '_, S, N>
49{
50}
51
52const _: () = assert!(size_of::<Iter<'static, 'static, 'static, [u8]>>() == 2 * size_of::<usize>());