forked from mirrors/gstreamer-rs
gstreamer/miniobject: Make get_type function optional
Static typing is needed for `Value` interop, but not every type (GLMemory in this instance) requires that.
This commit is contained in:
parent
01f0988a48
commit
9cc488db4c
1 changed files with 52 additions and 49 deletions
|
@ -2,7 +2,7 @@
|
||||||
|
|
||||||
#[macro_export]
|
#[macro_export]
|
||||||
macro_rules! mini_object_wrapper (
|
macro_rules! mini_object_wrapper (
|
||||||
($name:ident, $ref_name:ident, $ffi_name:path, $get_type:expr) => {
|
($name:ident, $ref_name:ident, $ffi_name:path) => {
|
||||||
pub struct $name {
|
pub struct $name {
|
||||||
obj: std::ptr::NonNull<$ffi_name>,
|
obj: std::ptr::NonNull<$ffi_name>,
|
||||||
}
|
}
|
||||||
|
@ -117,12 +117,6 @@ macro_rules! mini_object_wrapper(
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl $crate::glib::types::StaticType for $name {
|
|
||||||
fn static_type() -> $crate::glib::types::Type {
|
|
||||||
$ref_name::static_type()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl<'a> $crate::glib::translate::ToGlibPtr<'a, *const $ffi_name> for $name {
|
impl<'a> $crate::glib::translate::ToGlibPtr<'a, *const $ffi_name> for $name {
|
||||||
type Storage = &'a Self;
|
type Storage = &'a Self;
|
||||||
|
|
||||||
|
@ -362,31 +356,6 @@ macro_rules! mini_object_wrapper(
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<'a> $crate::glib::value::FromValueOptional<'a>
|
|
||||||
for $name
|
|
||||||
{
|
|
||||||
unsafe fn from_value_optional(v: &'a glib::Value) -> Option<Self> {
|
|
||||||
let ptr = $crate::glib::gobject_ffi::g_value_get_boxed($crate::glib::translate::ToGlibPtr::to_glib_none(v).0);
|
|
||||||
$crate::glib::translate::from_glib_none(ptr as *const $ffi_name)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl $crate::glib::value::SetValue for $name {
|
|
||||||
unsafe fn set_value(v: &mut glib::Value, s: &Self) {
|
|
||||||
$crate::glib::gobject_ffi::g_value_set_boxed($crate::glib::translate::ToGlibPtrMut::to_glib_none_mut(v).0, s.as_ptr() as $crate::glib::ffi::gpointer);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl $crate::glib::value::SetValueOptional for $name {
|
|
||||||
unsafe fn set_value_optional(v: &mut glib::Value, s: Option<&Self>) {
|
|
||||||
if let Some(s) = s {
|
|
||||||
$crate::glib::gobject_ffi::g_value_set_boxed($crate::glib::translate::ToGlibPtrMut::to_glib_none_mut(v).0, s.as_ptr() as $crate::glib::ffi::gpointer);
|
|
||||||
} else {
|
|
||||||
$crate::glib::gobject_ffi::g_value_set_boxed($crate::glib::translate::ToGlibPtrMut::to_glib_none_mut(v).0, std::ptr::null_mut());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl $crate::glib::translate::GlibPtrDefault for $name {
|
impl $crate::glib::translate::GlibPtrDefault for $name {
|
||||||
type GlibType = *mut $ffi_name;
|
type GlibType = *mut $ffi_name;
|
||||||
}
|
}
|
||||||
|
@ -423,14 +392,61 @@ macro_rules! mini_object_wrapper(
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
impl $crate::glib::translate::GlibPtrDefault for $ref_name {
|
||||||
|
type GlibType = *mut $ffi_name;
|
||||||
|
}
|
||||||
|
|
||||||
|
impl ToOwned for $ref_name {
|
||||||
|
type Owned = $name;
|
||||||
|
|
||||||
|
fn to_owned(&self) -> $name {
|
||||||
|
self.copy()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
unsafe impl Sync for $ref_name {}
|
||||||
|
unsafe impl Send for $ref_name {}
|
||||||
|
unsafe impl Sync for $name {}
|
||||||
|
unsafe impl Send for $name {}
|
||||||
|
};
|
||||||
|
($name:ident, $ref_name:ident, $ffi_name:path, $get_type:expr) => {
|
||||||
|
$crate::mini_object_wrapper!($name, $ref_name, $ffi_name);
|
||||||
|
|
||||||
|
impl $crate::glib::types::StaticType for $name {
|
||||||
|
fn static_type() -> $crate::glib::types::Type {
|
||||||
|
$ref_name::static_type()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
impl $crate::glib::types::StaticType for $ref_name {
|
impl $crate::glib::types::StaticType for $ref_name {
|
||||||
fn static_type() -> $crate::glib::types::Type {
|
fn static_type() -> $crate::glib::types::Type {
|
||||||
unsafe { $crate::glib::translate::from_glib($get_type()) }
|
unsafe { $crate::glib::translate::from_glib($get_type()) }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl $crate::glib::translate::GlibPtrDefault for $ref_name {
|
impl<'a> $crate::glib::value::FromValueOptional<'a>
|
||||||
type GlibType = *mut $ffi_name;
|
for $name
|
||||||
|
{
|
||||||
|
unsafe fn from_value_optional(v: &'a glib::Value) -> Option<Self> {
|
||||||
|
let ptr = $crate::glib::gobject_ffi::g_value_get_boxed($crate::glib::translate::ToGlibPtr::to_glib_none(v).0);
|
||||||
|
$crate::glib::translate::from_glib_none(ptr as *const $ffi_name)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl $crate::glib::value::SetValue for $name {
|
||||||
|
unsafe fn set_value(v: &mut glib::Value, s: &Self) {
|
||||||
|
$crate::glib::gobject_ffi::g_value_set_boxed($crate::glib::translate::ToGlibPtrMut::to_glib_none_mut(v).0, s.as_ptr() as $crate::glib::ffi::gpointer);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl $crate::glib::value::SetValueOptional for $name {
|
||||||
|
unsafe fn set_value_optional(v: &mut glib::Value, s: Option<&Self>) {
|
||||||
|
if let Some(s) = s {
|
||||||
|
$crate::glib::gobject_ffi::g_value_set_boxed($crate::glib::translate::ToGlibPtrMut::to_glib_none_mut(v).0, s.as_ptr() as $crate::glib::ffi::gpointer);
|
||||||
|
} else {
|
||||||
|
$crate::glib::gobject_ffi::g_value_set_boxed($crate::glib::translate::ToGlibPtrMut::to_glib_none_mut(v).0, std::ptr::null_mut());
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<'a> $crate::glib::value::FromValueOptional<'a>
|
impl<'a> $crate::glib::value::FromValueOptional<'a>
|
||||||
|
@ -448,18 +464,5 @@ macro_rules! mini_object_wrapper(
|
||||||
|
|
||||||
// Can't have SetValue/SetValueOptional impls as otherwise one could use it to get
|
// Can't have SetValue/SetValueOptional impls as otherwise one could use it to get
|
||||||
// immutable references from a mutable reference without borrowing via the value
|
// immutable references from a mutable reference without borrowing via the value
|
||||||
|
};
|
||||||
impl ToOwned for $ref_name {
|
|
||||||
type Owned = $name;
|
|
||||||
|
|
||||||
fn to_owned(&self) -> $name {
|
|
||||||
self.copy()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
unsafe impl Sync for $ref_name {}
|
|
||||||
unsafe impl Send for $ref_name {}
|
|
||||||
unsafe impl Sync for $name {}
|
|
||||||
unsafe impl Send for $name {}
|
|
||||||
}
|
|
||||||
);
|
);
|
||||||
|
|
Loading…
Reference in a new issue