grit_bitvec/
static_proto_bitvec_iter.rs

1use crate::{
2    BitProto,
3    RawBitVecIter, 
4    RawBitVecDrain,
5};
6
7pub struct SProtoBitVecIter {
8    pub(crate) proto: &'static BitProto,
9    pub(crate) iter: RawBitVecIter
10}
11
12impl Iterator for SProtoBitVecIter {
13    type Item = usize;
14
15    #[inline(always)]
16    fn next(&mut self) -> Option<Self::Item> {
17        unsafe {self.iter.next(*self.proto)}
18    }
19
20    #[inline(always)]
21    fn size_hint(&self) -> (usize, Option<usize>) {
22        let len = self.iter.len();
23        (len, Some(len))
24    }
25}
26
27impl DoubleEndedIterator for SProtoBitVecIter {
28    #[inline(always)]
29    fn next_back(&mut self) -> Option<Self::Item> {
30        unsafe {self.iter.next_back(*self.proto)}
31    }
32}
33
34impl ExactSizeIterator for SProtoBitVecIter {
35    #[inline(always)]
36    fn len(&self) -> usize {
37        self.iter.len()
38    }
39}
40
41impl Drop for SProtoBitVecIter  {
42    #[inline(always)]
43    fn drop(&mut self) {/* RawBitVecIter will handle the deallocation */}
44}
45
46pub struct SProtoBitVecDrain<'vec>{
47    pub(crate) proto: &'static BitProto,
48    pub(crate) drain: RawBitVecDrain<'vec>
49}
50
51impl<'vec> Iterator for SProtoBitVecDrain<'vec> {
52    type Item = usize;
53
54    #[inline(always)]
55    fn next(&mut self) -> Option<Self::Item> {
56        unsafe {self.drain.next(*self.proto)}
57    }
58
59    #[inline(always)]
60    fn size_hint(&self) -> (usize, Option<usize>) {
61        let len = self.drain.len();
62        (len, Some(len))
63    }
64}
65
66impl<'vec> DoubleEndedIterator for SProtoBitVecDrain<'vec> {
67    #[inline(always)]
68    fn next_back(&mut self) -> Option<Self::Item> {
69        unsafe {self.drain.next_back(*self.proto)}
70    }
71}
72
73impl<'vec> ExactSizeIterator for SProtoBitVecDrain<'vec> {
74    #[inline(always)]
75    fn len(&self) -> usize {
76        self.drain.len()
77    }
78}
79
80impl<'vec> Drop for SProtoBitVecDrain<'vec>  {
81    #[inline(always)]
82    fn drop(&mut self) {/* RawBitVecIter will handle the deallocation */}
83}