1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60
use ffi::*; use std::ptr; use std::marker; use std::mem; pub struct Iter<Item>{ it: *mut GstIterator, marker: marker::PhantomData<Item> } impl<Item> Drop for Iter<Item>{ fn drop(&mut self){ unsafe{ gst_iterator_free(self.it); } } } impl<Item> Iter<Item>{ pub unsafe fn new_from_gst_iterator(it: *mut GstIterator) -> Option<Iter<Item>>{ if it != ptr::null_mut(){ Some(Iter{ it: it, marker: marker::PhantomData, }) }else{ None } } } pub enum Error{ Resync, Error, WrongType, } impl<I: ::FromGValue> Iterator for Iter<I>{ type Item = Result<I,Error>; fn next(&mut self) -> Option<Result<I,Error>>{ unsafe{ let mut elem: GValue = mem::zeroed(); match gst_iterator_next(self.it, &mut elem){ GST_ITERATOR_DONE => None, GST_ITERATOR_OK => { let ret = match I::from_gvalue(&elem){ Some(value) => Some(Ok(value)), None => Some(Err(Error::WrongType)) }; g_value_unset(&mut elem); ret }, GST_ITERATOR_RESYNC => Some(Err(Error::Resync)), GST_ITERATOR_ERROR => Some(Err(Error::Error)), _ => None } } } }