From 1c2b78a3f2e2de49f5990afdad1e7b4a8716534b Mon Sep 17 00:00:00 2001 From: meh Date: Tue, 12 May 2015 03:12:55 +0200 Subject: [PATCH] util/dictionary: add Dictionary --- src/lib.rs | 1 + src/util/dictionary.rs | 36 ++++++++++++++++++++++++++++++++++++ src/util/mod.rs | 1 + 3 files changed, 38 insertions(+) create mode 100644 src/util/dictionary.rs diff --git a/src/lib.rs b/src/lib.rs index e8c01e6..e36755a 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -7,3 +7,4 @@ extern crate ffmpeg_sys as ffi; pub mod util; pub use util::error::Error; +pub use util::dictionary::Dictionary; diff --git a/src/util/dictionary.rs b/src/util/dictionary.rs new file mode 100644 index 0000000..69ef36c --- /dev/null +++ b/src/util/dictionary.rs @@ -0,0 +1,36 @@ +use std::marker::PhantomData; +use std::ptr; + +use ffi::*; + +pub struct Dictionary<'a> { + pub ptr: *mut AVDictionary, + + own: bool, + _marker: PhantomData<&'a i32>, +} + +impl<'a> Dictionary<'a> { + pub fn new() -> Self { + Dictionary { ptr: ptr::null_mut(), own: true, _marker: PhantomData } + } + + pub fn wrap(ptr: *mut AVDictionary) -> Self { + Dictionary { ptr: ptr, own: false, _marker: PhantomData } + } + + pub fn take(&mut self) -> *mut AVDictionary { + self.own = false; + self.ptr + } +} + +impl<'a> Drop for Dictionary<'a> { + fn drop(&mut self) { + unsafe { + if self.own && self.ptr != ptr::null_mut() { + av_dict_free(&mut self.ptr); + } + } + } +} diff --git a/src/util/mod.rs b/src/util/mod.rs index 4b7ef5a..a4a5f89 100644 --- a/src/util/mod.rs +++ b/src/util/mod.rs @@ -1,3 +1,4 @@ +pub mod dictionary; pub mod error; use std::ffi::CStr;