mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer-rs.git
synced 2024-11-26 03:21:03 +00:00
structure: Add bindings for foreach()
, map_in_place() and
filter_map_in_place()`
This commit is contained in:
parent
6d63180bfc
commit
1b46bca2db
1 changed files with 91 additions and 0 deletions
|
@ -685,6 +685,97 @@ impl StructureRef {
|
||||||
pub fn serialize(&self, flags: crate::SerializeFlags) -> glib::GString {
|
pub fn serialize(&self, flags: crate::SerializeFlags) -> glib::GString {
|
||||||
unsafe { from_glib_full(ffi::gst_structure_serialize(&self.0, flags.into_glib())) }
|
unsafe { from_glib_full(ffi::gst_structure_serialize(&self.0, flags.into_glib())) }
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[doc(alias = "gst_structure_foreach")]
|
||||||
|
pub fn foreach<F: FnMut(glib::Quark, &glib::Value) -> std::ops::ControlFlow<()>>(
|
||||||
|
&self,
|
||||||
|
mut func: F,
|
||||||
|
) -> bool {
|
||||||
|
unsafe {
|
||||||
|
unsafe extern "C" fn trampoline<
|
||||||
|
F: FnMut(glib::Quark, &glib::Value) -> std::ops::ControlFlow<()>,
|
||||||
|
>(
|
||||||
|
quark: glib::ffi::GQuark,
|
||||||
|
value: *const glib::gobject_ffi::GValue,
|
||||||
|
user_data: glib::ffi::gpointer,
|
||||||
|
) -> glib::ffi::gboolean {
|
||||||
|
let func = &mut *(user_data as *mut F);
|
||||||
|
let res = func(from_glib(quark), &*(value as *const glib::Value));
|
||||||
|
|
||||||
|
matches!(res, std::ops::ControlFlow::Continue(_)).into_glib()
|
||||||
|
}
|
||||||
|
let func = &mut func as *mut F;
|
||||||
|
from_glib(ffi::gst_structure_foreach(
|
||||||
|
self.as_ptr(),
|
||||||
|
Some(trampoline::<F>),
|
||||||
|
func as glib::ffi::gpointer,
|
||||||
|
))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#[doc(alias = "gst_structure_map_in_place")]
|
||||||
|
pub fn map_in_place<F: FnMut(glib::Quark, &mut glib::Value) -> std::ops::ControlFlow<()>>(
|
||||||
|
&mut self,
|
||||||
|
mut func: F,
|
||||||
|
) -> bool {
|
||||||
|
unsafe {
|
||||||
|
unsafe extern "C" fn trampoline<
|
||||||
|
F: FnMut(glib::Quark, &mut glib::Value) -> std::ops::ControlFlow<()>,
|
||||||
|
>(
|
||||||
|
quark: glib::ffi::GQuark,
|
||||||
|
value: *mut glib::gobject_ffi::GValue,
|
||||||
|
user_data: glib::ffi::gpointer,
|
||||||
|
) -> glib::ffi::gboolean {
|
||||||
|
let func = &mut *(user_data as *mut F);
|
||||||
|
let res = func(from_glib(quark), &mut *(value as *mut glib::Value));
|
||||||
|
|
||||||
|
matches!(res, std::ops::ControlFlow::Continue(_)).into_glib()
|
||||||
|
}
|
||||||
|
let func = &mut func as *mut F;
|
||||||
|
from_glib(ffi::gst_structure_map_in_place(
|
||||||
|
self.as_mut_ptr(),
|
||||||
|
Some(trampoline::<F>),
|
||||||
|
func as glib::ffi::gpointer,
|
||||||
|
))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#[doc(alias = "gst_structure_filter_and_map_in_place")]
|
||||||
|
pub fn filter_map_in_place<F: FnMut(glib::Quark, glib::Value) -> Option<glib::Value>>(
|
||||||
|
&mut self,
|
||||||
|
mut func: F,
|
||||||
|
) {
|
||||||
|
unsafe {
|
||||||
|
unsafe extern "C" fn trampoline<
|
||||||
|
F: FnMut(glib::Quark, glib::Value) -> Option<glib::Value>,
|
||||||
|
>(
|
||||||
|
quark: glib::ffi::GQuark,
|
||||||
|
value: *mut glib::gobject_ffi::GValue,
|
||||||
|
user_data: glib::ffi::gpointer,
|
||||||
|
) -> glib::ffi::gboolean {
|
||||||
|
let func = &mut *(user_data as *mut F);
|
||||||
|
|
||||||
|
let v = mem::replace(
|
||||||
|
&mut *(value as *mut glib::Value),
|
||||||
|
glib::Value::uninitialized(),
|
||||||
|
);
|
||||||
|
match func(from_glib(quark), v) {
|
||||||
|
None => glib::ffi::GFALSE,
|
||||||
|
Some(v) => {
|
||||||
|
*value = v.into_raw();
|
||||||
|
glib::ffi::GTRUE
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
let func = &mut func as *mut F;
|
||||||
|
ffi::gst_structure_filter_and_map_in_place(
|
||||||
|
self.as_mut_ptr(),
|
||||||
|
Some(trampoline::<F>),
|
||||||
|
func as glib::ffi::gpointer,
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl fmt::Display for StructureRef {
|
impl fmt::Display for StructureRef {
|
||||||
|
|
Loading…
Reference in a new issue