1use std::marker::PhantomData;
2
3use rusteal_ffi::FWeakObjectHandle;
4
5use crate::ffi_dispatch;
6use crate::object_ref::UObjectRef;
7use crate::traits::UeClass;
8
9#[derive(Clone, Copy, PartialEq, Eq, Hash, Debug)]
10pub struct TWeakObjectPtr<T: UeClass> {
11 handle: FWeakObjectHandle,
12 _marker: PhantomData<*const T>,
13}
14
15unsafe impl<T: UeClass> Send for TWeakObjectPtr<T> {}
16
17impl<T: UeClass> TWeakObjectPtr<T> {
18 pub fn from_ref(obj: &UObjectRef<T>) -> Self {
19 let handle = unsafe { ffi_dispatch::core_make_weak(obj.raw()) };
20
21 TWeakObjectPtr {
22 handle,
23 _marker: PhantomData,
24 }
25 }
26
27 pub fn get(&self) -> Option<UObjectRef<T>> {
28 let obj = unsafe { ffi_dispatch::core_resolve_weak(self.handle) };
29
30 if obj.is_null() {
31 None
32 } else {
33 Some(unsafe { UObjectRef::from_raw(obj) })
34 }
35 }
36
37 pub fn is_valid(&self) -> bool {
38 unsafe { ffi_dispatch::core_is_weak_valid(self.handle) }
39 }
40
41 #[inline]
42 pub fn handle(&self) -> FWeakObjectHandle {
43 self.handle
44 }
45}
46
47impl<T: UeClass> Default for TWeakObjectPtr<T> {
48 fn default() -> Self {
49 TWeakObjectPtr {
50 handle: FWeakObjectHandle::default(),
51 _marker: PhantomData,
52 }
53 }
54}