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 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135
use std::fmt; use std::iter::FromIterator; use std::ops::{Deref, DerefMut}; use std::ptr; use super::mutable; use ffi::*; pub struct Owned<'a> { inner: mutable::Ref<'a>, } impl<'a> Default for Owned<'a> { fn default() -> Self { Self::new() } } impl<'a> Owned<'a> { pub unsafe fn own(ptr: *mut AVDictionary) -> Self { Owned { inner: mutable::Ref::wrap(ptr), } } pub unsafe fn disown(mut self) -> *mut AVDictionary { let result = self.inner.as_mut_ptr(); self.inner = mutable::Ref::wrap(ptr::null_mut()); result } } impl<'a> Owned<'a> { pub fn new() -> Self { unsafe { Owned { inner: mutable::Ref::wrap(ptr::null_mut()), } } } } impl<'a, 'b> FromIterator<(&'b str, &'b str)> for Owned<'a> { fn from_iter<T: IntoIterator<Item = (&'b str, &'b str)>>(iterator: T) -> Self { let mut result = Owned::new(); for (key, value) in iterator { result.set(key, value); } result } } impl<'a, 'b> FromIterator<&'b (&'b str, &'b str)> for Owned<'a> { fn from_iter<T: IntoIterator<Item = &'b (&'b str, &'b str)>>(iterator: T) -> Self { let mut result = Owned::new(); for &(key, value) in iterator { result.set(key, value); } result } } impl<'a> FromIterator<(String, String)> for Owned<'a> { fn from_iter<T: IntoIterator<Item = (String, String)>>(iterator: T) -> Self { let mut result = Owned::new(); for (key, value) in iterator { result.set(&key, &value); } result } } impl<'a, 'b> FromIterator<&'b (String, String)> for Owned<'a> { fn from_iter<T: IntoIterator<Item = &'b (String, String)>>(iterator: T) -> Self { let mut result = Owned::new(); for &(ref key, ref value) in iterator { result.set(key, value); } result } } impl<'a> Deref for Owned<'a> { type Target = mutable::Ref<'a>; fn deref(&self) -> &Self::Target { &self.inner } } impl<'a> DerefMut for Owned<'a> { fn deref_mut(&mut self) -> &mut Self::Target { &mut self.inner } } impl<'a> Clone for Owned<'a> { fn clone(&self) -> Self { let mut dictionary = Owned::new(); dictionary.clone_from(self); dictionary } fn clone_from(&mut self, source: &Self) { unsafe { let mut ptr = self.as_mut_ptr(); av_dict_copy(&mut ptr, source.as_ptr(), 0); self.inner = mutable::Ref::wrap(ptr); } } } impl<'a> Drop for Owned<'a> { fn drop(&mut self) { unsafe { av_dict_free(&mut self.inner.as_mut_ptr()); } } } impl<'a> fmt::Debug for Owned<'a> { fn fmt(&self, fmt: &mut fmt::Formatter) -> fmt::Result { self.inner.fmt(fmt) } }