fsort/file_collection/
file_iter.rs

1use std::collections::btree_set::Iter as BSetIterator;
2use std::iter::Rev;
3
4use ::File;
5use ::criterion::Criterion;
6
7/// An iterator over the files in a `FileCollection` according to the requested order.
8pub struct FileIter<'a, C : Criterion + 'a> {
9    data : FileIteratorData<'a, C>
10}
11
12impl<'a, C: Criterion> Iterator for FileIter<'a, C> {
13    type Item = &'a File<C>;
14
15    fn next(&mut self) -> Option<&'a File<C>> {
16        match self.data {
17            FileIteratorData::Ascending(ref mut value) => value.next(),
18            FileIteratorData::Descending(ref mut value) => value.next()
19        }
20    }
21}
22
23impl<'a, C : Criterion> DoubleEndedIterator for FileIter<'a, C> {
24    fn next_back(&mut self) -> Option<&'a File<C>> {
25        match self.data {
26            FileIteratorData::Ascending(ref mut value) => value.next_back(),
27            FileIteratorData::Descending(ref mut value) => value.next_back()
28        }
29    }
30}
31
32impl<'a, C : Criterion> ExactSizeIterator for FileIter<'a, C> {
33    fn len(&self) -> usize {
34        match self.data {
35            FileIteratorData::Ascending(ref value) => value.len(),
36            FileIteratorData::Descending(ref value) => value.len()
37        }
38    }
39}
40
41/// The (private) data of a FileIter.
42pub enum FileIteratorData<'a, C : Criterion + 'a> {
43    Ascending(BSetIterator<'a, File<C>>),
44    Descending(Rev<BSetIterator<'a, File<C>>>)
45}
46
47impl<'a, C : Criterion> FileIteratorData<'a, C> {
48    pub fn iter(self) -> FileIter<'a, C> {
49        FileIter::<C> {
50            data : self
51        }
52    }
53
54    /*pub fn new_iterator(data : FileIteratorData<'a, C>) -> FileIter<C> {
55        FileIter::<C> {
56            data : data
57        }
58    }*/
59}