use crate::export::user_data::Map;
use crate::export::NativeClass;
use crate::object::ownership::{Ownership, Shared, Unique};
use crate::object::{GodotObject, Instance, Null, Ref, SubClass, TInstance, TRef};
pub trait AsArg<T>: private::Sealed {
#[doc(hidden)]
fn as_arg_ptr(&self) -> *mut sys::godot_object;
#[doc(hidden)]
#[inline]
unsafe fn to_arg_variant(&self) -> crate::core_types::Variant {
crate::core_types::Variant::from_object_ptr(self.as_arg_ptr())
}
}
pub trait AsVariant: AsArg<<Self as AsVariant>::Target> {
type Target;
}
mod private {
pub trait Sealed {}
}
impl<T> private::Sealed for Null<T> {}
impl<'a, T: GodotObject> private::Sealed for TRef<'a, T, Shared> {}
impl<'a, T: GodotObject> private::Sealed for &'a Ref<T, Shared> {}
impl<'a, T: NativeClass> private::Sealed for TInstance<'a, T, Shared> {}
impl<'a, T: NativeClass> private::Sealed for &'a Instance<T, Shared> {}
impl<T: GodotObject, Own: Ownership> private::Sealed for Ref<T, Own> {}
impl<T: NativeClass, Own: Ownership> private::Sealed for Instance<T, Own> {}
impl<T: GodotObject> AsArg<T> for Null<T> {
#[inline]
fn as_arg_ptr(&self) -> *mut sys::godot_object {
std::ptr::null_mut()
}
}
impl<T: GodotObject> AsVariant for Null<T> {
type Target = T;
}
impl<'a, T, U> AsArg<U> for TRef<'a, T, Shared>
where
T: GodotObject + SubClass<U>,
U: GodotObject,
{
#[inline]
fn as_arg_ptr(&self) -> *mut sys::godot_object {
self.as_ptr()
}
}
impl<'a, T: GodotObject> AsVariant for TRef<'a, T, Shared> {
type Target = T;
}
impl<T, U> AsArg<U> for Ref<T, Shared>
where
T: GodotObject + SubClass<U>,
U: GodotObject,
{
#[inline]
fn as_arg_ptr(&self) -> *mut sys::godot_object {
self.as_ptr()
}
}
impl<T, U> AsArg<U> for Ref<T, Unique>
where
T: GodotObject + SubClass<U>,
U: GodotObject,
{
#[inline]
fn as_arg_ptr(&self) -> *mut sys::godot_object {
self.as_ptr()
}
}
impl<T: GodotObject> AsVariant for Ref<T, Unique> {
type Target = T;
}
impl<'a, T, U> AsArg<U> for &'a Ref<T, Shared>
where
T: GodotObject + SubClass<U>,
U: GodotObject,
{
#[inline]
fn as_arg_ptr(&self) -> *mut sys::godot_object {
self.as_ptr()
}
}
impl<T: GodotObject> AsVariant for Ref<T, Shared> {
type Target = T;
}
impl<'a, T: GodotObject> AsVariant for &'a Ref<T, Shared> {
type Target = T;
}
impl<'a, T, U> AsArg<U> for TInstance<'a, T, Shared>
where
T: NativeClass,
T::Base: GodotObject + SubClass<U>,
T::UserData: Map,
U: GodotObject,
{
#[inline]
fn as_arg_ptr(&self) -> *mut sys::godot_object {
self.as_base_ptr()
}
}
impl<T, U, Own: Ownership> AsArg<U> for Instance<T, Own>
where
T: NativeClass,
T::Base: GodotObject + SubClass<U>,
T::UserData: Map,
U: GodotObject,
{
#[inline]
fn as_arg_ptr(&self) -> *mut sys::godot_object {
self.as_base_ptr()
}
}
impl<'a, T, U> AsArg<U> for &'a Instance<T, Shared>
where
T: NativeClass,
T::Base: GodotObject + SubClass<U>,
T::UserData: Map,
U: GodotObject,
{
#[inline]
fn as_arg_ptr(&self) -> *mut sys::godot_object {
self.as_base_ptr()
}
}