Skip to main content

rusteal_core/
weak_ptr.rs

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}