index_pool/
iter.rs

1use std::collections::btree_set;
2use std::collections::btree_set::Iter as BIter;
3use std::iter::Cloned;
4
5use Range;
6
7#[derive(Clone)]
8pub struct IndexIter<'a> {
9    free_ranges: Cloned<BIter<'a, Range>>,
10    next_range: Option<Range>,
11    index: usize,
12    end: usize,
13}
14
15impl<'a> IndexIter<'a> {
16    pub(crate) fn new(free_ranges: BIter<'a, Range>, end: usize) -> IndexIter<'a> {
17        let mut free_ranges = free_ranges.cloned();
18        let mut first_range = free_ranges.next();
19
20        let mut index = 0;
21        if let Some(fr) = first_range {
22            if fr.min == 0 {
23                index = fr.max + 1;
24                first_range = free_ranges.next();
25            }
26        }
27
28        IndexIter {
29            free_ranges,
30            next_range: first_range,
31            index,
32            end,
33        }
34    }
35}
36
37impl<'a> Iterator for IndexIter<'a> {
38    type Item = usize;
39    #[inline]
40    fn next(&mut self) -> Option<usize> {
41        if self.index == self.end {
42            return None;
43        }
44
45        let value = self.index;
46        self.index += 1;
47
48        if let Some(range) = self.next_range {
49            if self.index == range.min {
50                self.index = range.max + 1;
51                self.next_range = self.free_ranges.next();
52            }
53        }
54
55        Some(value)
56    }
57}
58
59#[derive(Clone)]
60pub struct IndexAfterIter<'a> {
61    free_ranges: Cloned<btree_set::Range<'a, Range>>,
62    next_range: Option<Range>,
63    index: usize,
64    end: usize,
65}
66
67impl<'a> IndexAfterIter<'a> {
68    pub(crate) fn new(free_ranges: btree_set::Range<'a, Range>, start: usize, end: usize) -> IndexAfterIter<'a> {
69        let mut free_ranges = free_ranges.cloned();
70        let mut first_range = free_ranges.next();
71
72        let mut index = start;
73        if let Some(fr) = first_range {
74            if fr.min <= start {
75                index = fr.max + 1;
76                first_range = free_ranges.next();
77            }
78        }
79
80        IndexAfterIter {
81            free_ranges,
82            next_range: first_range,
83            index,
84            end,
85        }
86    }
87}
88
89impl<'a> Iterator for IndexAfterIter<'a> {
90    type Item = usize;
91
92    #[inline]
93    fn next(&mut self) -> Option<usize> {
94        if self.index == self.end {
95            return None;
96        }
97
98        let value = self.index;
99        self.index += 1;
100
101        if let Some(range) = self.next_range {
102            if self.index == range.min {
103                self.index = range.max + 1;
104                self.next_range = self.free_ranges.next();
105            }
106        }
107
108        Some(value)
109    }
110}