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}