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
104
105
106
107
108
109
110
111
use crate::{
boxed::BitBox,
order::BitOrder,
pointer::BitPtr,
slice::{
BitMut,
BitSlice,
},
store::BitStore,
};
use core::iter::FusedIterator;
impl<O, T> IntoIterator for BitBox<O, T>
where O: BitOrder, T: BitStore {
type Item = bool;
type IntoIter = IntoIter<O, T>;
fn into_iter(self) -> Self::IntoIter {
IntoIter {
region: self.bitptr(),
bitbox: self,
}
}
}
impl<'a, O, T> IntoIterator for &'a BitBox<O, T>
where O: BitOrder, T: 'a + BitStore {
type Item = &'a bool;
type IntoIter = <&'a BitSlice<O, T> as IntoIterator>::IntoIter;
fn into_iter(self) -> Self::IntoIter {
self.as_bitslice().into_iter()
}
}
impl<'a, O, T> IntoIterator for &'a mut BitBox<O, T>
where O: BitOrder, T: 'a + BitStore {
type Item = BitMut<'a, O, T>;
type IntoIter = <&'a mut BitSlice<O, T> as IntoIterator>::IntoIter;
fn into_iter(self) -> Self::IntoIter {
self.as_mut_bitslice().into_iter()
}
}
#[repr(C)]
pub struct IntoIter<O, T>
where O: BitOrder, T: BitStore {
bitbox: BitBox<O, T>,
region: BitPtr<T>,
}
impl<O, T> IntoIter<O, T>
where O: BitOrder, T: BitStore {
fn iterator(&self) -> <&BitSlice<O, T> as IntoIterator>::IntoIter {
self.region.into_bitslice().into_iter()
}
}
impl<O, T> Iterator for IntoIter<O, T>
where O: BitOrder, T: BitStore {
type Item = bool;
fn next(&mut self) -> Option<Self::Item> {
let mut slice_iter = self.iterator();
let out = slice_iter.next().copied();
self.region = slice_iter.bitptr();
out
}
fn size_hint(&self) -> (usize, Option<usize>) {
self.iterator().size_hint()
}
fn count(self) -> usize {
self.len()
}
fn nth(&mut self, n: usize) -> Option<Self::Item> {
let mut slice_iter = self.iterator();
let out = slice_iter.nth(n).copied();
self.region = slice_iter.bitptr();
out
}
fn last(mut self) -> Option<Self::Item> {
self.next_back()
}
}
impl<O, T> DoubleEndedIterator for IntoIter<O, T>
where O: BitOrder, T: BitStore {
fn next_back(&mut self) -> Option<Self::Item> {
let mut slice_iter = self.iterator();
let out = slice_iter.next_back().copied();
self.region = slice_iter.bitptr();
out
}
}
impl<O, T> ExactSizeIterator for IntoIter<O, T>
where O: BitOrder, T: BitStore {}
impl<O, T> FusedIterator for IntoIter<O, T>
where O: BitOrder, T: BitStore {}