Skip to content

Commit d0c5f54

Browse files
committed
Implement AsArg for Instance + TInstance
1 parent 7711d0d commit d0c5f54

File tree

2 files changed

+67
-2
lines changed

2 files changed

+67
-2
lines changed

gdnative-core/src/object/as_arg.rs

Lines changed: 57 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
1+
use crate::export::user_data::Map;
2+
use crate::export::NativeClass;
13
use crate::object::ownership::{Ownership, Shared, Unique};
2-
use crate::object::{GodotObject, Null, Ref, SubClass, TRef};
4+
use crate::object::{GodotObject, Instance, Null, Ref, SubClass, TInstance, TRef};
35

46
/// Trait for safe conversion from Godot object references into API method arguments. This is
57
/// a sealed trait with no public interface.
@@ -41,10 +43,18 @@ mod private {
4143
pub trait Sealed {}
4244
}
4345

46+
// Null
4447
impl<'a, T> private::Sealed for Null<T> {}
48+
49+
// Temporary references (shared ownership)
4550
impl<'a, T: GodotObject> private::Sealed for TRef<'a, T, Shared> {}
46-
impl<T: GodotObject, Own: Ownership> private::Sealed for Ref<T, Own> {}
4751
impl<'a, T: GodotObject> private::Sealed for &'a Ref<T, Shared> {}
52+
impl<'a, T: NativeClass> private::Sealed for TInstance<'a, T, Shared> {}
53+
impl<'a, T: NativeClass> private::Sealed for &'a Instance<T, Shared> {}
54+
55+
// Persistent references (any ownership)
56+
impl<T: GodotObject, Own: Ownership> private::Sealed for Ref<T, Own> {}
57+
impl<T: NativeClass, Own: Ownership> private::Sealed for Instance<T, Own> {}
4858

4959
// ----------------------------------------------------------------------------------------------------------------------------------------------
5060
// Null
@@ -125,3 +135,48 @@ impl<T: GodotObject> AsVariant for Ref<T, Shared> {
125135
impl<'a, T: GodotObject> AsVariant for &'a Ref<T, Shared> {
126136
type Target = T;
127137
}
138+
139+
// ----------------------------------------------------------------------------------------------------------------------------------------------
140+
// TInstance
141+
142+
impl<'a, T, U> AsArg<U> for TInstance<'a, T, Shared>
143+
where
144+
T: NativeClass,
145+
T::Base: GodotObject + SubClass<U>,
146+
T::UserData: Map,
147+
U: GodotObject,
148+
{
149+
#[inline]
150+
fn as_arg_ptr(&self) -> *mut sys::godot_object {
151+
self.as_base_ptr()
152+
}
153+
}
154+
155+
// ----------------------------------------------------------------------------------------------------------------------------------------------
156+
// Instance
157+
158+
impl<T, U, Own: Ownership> AsArg<U> for Instance<T, Own>
159+
where
160+
T: NativeClass,
161+
T::Base: GodotObject + SubClass<U>,
162+
T::UserData: Map,
163+
U: GodotObject,
164+
{
165+
#[inline]
166+
fn as_arg_ptr(&self) -> *mut sys::godot_object {
167+
self.as_base_ptr()
168+
}
169+
}
170+
171+
impl<'a, T, U> AsArg<U> for &'a Instance<T, Shared>
172+
where
173+
T: NativeClass,
174+
T::Base: GodotObject + SubClass<U>,
175+
T::UserData: Map,
176+
U: GodotObject,
177+
{
178+
#[inline]
179+
fn as_arg_ptr(&self) -> *mut sys::godot_object {
180+
self.as_base_ptr()
181+
}
182+
}

gdnative-core/src/object/instance.rs

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -229,6 +229,11 @@ impl<T: NativeClass, Own: Ownership> Instance<T, Own> {
229229
pub fn script(&self) -> &T::UserData {
230230
&self.script
231231
}
232+
233+
/// Convert to a nullable raw pointer. Used for AsArg.
234+
pub(super) fn as_base_ptr(&self) -> *mut sys::godot_object {
235+
self.owner.as_ptr()
236+
}
232237
}
233238

234239
impl<T: NativeClass, Own: Ownership> Instance<T, Own>
@@ -464,6 +469,11 @@ impl<'a, T: NativeClass, Own: Ownership> TInstance<'a, T, Own> {
464469
let script = T::UserData::clone_from_user_data_unchecked(user_data);
465470
TInstance { owner, script }
466471
}
472+
473+
/// Convert to a nullable raw pointer. Used for AsArg.
474+
pub(super) fn as_base_ptr(&self) -> *mut sys::godot_object {
475+
self.owner.as_ptr()
476+
}
467477
}
468478

469479
impl<'a, T: NativeClass, Own: NonUniqueOwnership> TInstance<'a, T, Own> {

0 commit comments

Comments
 (0)