|
| 1 | +use crate::export::user_data::Map; |
| 2 | +use crate::export::NativeClass; |
1 | 3 | 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}; |
3 | 5 |
|
4 | 6 | /// Trait for safe conversion from Godot object references into API method arguments. This is
|
5 | 7 | /// a sealed trait with no public interface.
|
@@ -41,10 +43,18 @@ mod private {
|
41 | 43 | pub trait Sealed {}
|
42 | 44 | }
|
43 | 45 |
|
| 46 | +// Null |
44 | 47 | impl<'a, T> private::Sealed for Null<T> {}
|
| 48 | + |
| 49 | +// Temporary references (shared ownership) |
45 | 50 | impl<'a, T: GodotObject> private::Sealed for TRef<'a, T, Shared> {}
|
46 |
| -impl<T: GodotObject, Own: Ownership> private::Sealed for Ref<T, Own> {} |
47 | 51 | 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> {} |
48 | 58 |
|
49 | 59 | // ----------------------------------------------------------------------------------------------------------------------------------------------
|
50 | 60 | // Null
|
@@ -125,3 +135,48 @@ impl<T: GodotObject> AsVariant for Ref<T, Shared> {
|
125 | 135 | impl<'a, T: GodotObject> AsVariant for &'a Ref<T, Shared> {
|
126 | 136 | type Target = T;
|
127 | 137 | }
|
| 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 | +} |
0 commit comments