From 95c9f92549701281c0978ac70bc42af54b8a8508 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebastian=20Dr=C3=B6ge?= Date: Wed, 20 Dec 2017 18:54:56 +0200 Subject: [PATCH] Add StreamCollection::iter() --- gstreamer/src/lib.rs | 2 + gstreamer/src/stream_collection.rs | 75 ++++++++++++++++++++++++++++++ 2 files changed, 77 insertions(+) create mode 100644 gstreamer/src/stream_collection.rs diff --git a/gstreamer/src/lib.rs b/gstreamer/src/lib.rs index a94a8cd0f..c1268a9dc 100644 --- a/gstreamer/src/lib.rs +++ b/gstreamer/src/lib.rs @@ -125,6 +125,8 @@ pub use enums::{ClockError, ClockSuccess, FlowError, FlowSuccess, PadLinkError, pub use clock_time::ClockTime; mod plugin; +#[cfg(any(feature = "v1_10", feature = "dox"))] +pub mod stream_collection; mod typefind; pub use typefind::*; diff --git a/gstreamer/src/stream_collection.rs b/gstreamer/src/stream_collection.rs new file mode 100644 index 000000000..ce8ab520b --- /dev/null +++ b/gstreamer/src/stream_collection.rs @@ -0,0 +1,75 @@ +// Copyright (C) 2017 Sebastian Dröge +// +// Licensed under the Apache License, Version 2.0 or the MIT license +// , at your +// option. This file may not be copied, modified, or distributed +// except according to those terms. + +use StreamCollection; +use Stream; + +pub struct Iter<'a> { + collection: &'a StreamCollection, + idx: u32, + size: u32, +} + +impl<'a> Iter<'a> { + fn new(collection: &'a StreamCollection) -> Iter<'a> { + skip_assert_initialized!(); + Iter { + collection: collection, + idx: 0, + size: collection.len() as u32, + } + } +} + +impl<'a> Iterator for Iter<'a> { + type Item = Stream; + + fn next(&mut self) -> Option { + if self.idx >= self.size { + return None; + } + + let item = self.collection.get_stream(self.idx); + self.idx += 1; + + item + } + + fn size_hint(&self) -> (usize, Option) { + if self.idx == self.size { + return (0, Some(0)); + } + + let remaining = (self.size - self.idx) as usize; + + (remaining, Some(remaining)) + } +} + +impl<'a> DoubleEndedIterator for Iter<'a> { + fn next_back(&mut self) -> Option { + if self.idx == self.size { + return None; + } + + self.size -= 1; + self.collection.get_stream(self.size) + } +} + +impl<'a> ExactSizeIterator for Iter<'a> {} + +impl StreamCollection { + pub fn iter(&self) -> Iter { + Iter::new(self) + } + + pub fn len(&self) -> usize { + self.get_size() as usize + } +}