fsort/file_collection/
file_iter.rs1use std::collections::btree_set::Iter as BSetIterator;
2use std::iter::Rev;
3
4use ::File;
5use ::criterion::Criterion;
6
7pub 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
41pub 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 }