12 static_assert(t_Force || !std::is_assignable_v<Il2CppObject*, t_Ptr*>,
"Don't use non Mono types with MonoPtr.");
15 MonoPtr() : m_Wrapper(
nullptr) { }
19 if (m_Wrapper) m_Wrapper->
Grab();
22 : m_Wrapper(p_Other.m_Wrapper)
24 if (m_Wrapper) m_Wrapper->
Grab();
27 : m_Wrapper(p_Other.m_Wrapper)
29 p_Other.m_Wrapper =
nullptr;
33 if (m_Wrapper) m_Wrapper->
Drop();
38 t_Ptr* Ptr(
bool p_Throw =
true)
const
40 auto l_IsDead = !m_Wrapper || !m_Wrapper->Ptr;
41 if constexpr (std::is_assignable_v<UnityEngine::Object, t_Ptr>)
43 auto l_UObject =
reinterpret_cast<UnityEngine::Object*
>(m_Wrapper->Ptr);
44 if (l_IsDead || !l_UObject->m_CachedPtr.m_value)
48 if (p_Throw && l_IsDead)
51 throw NullHandleException();
54 return !l_IsDead ?
reinterpret_cast<t_Ptr*
>(m_Wrapper->Ptr) :
nullptr;
59 if constexpr (std::is_assignable_v<UnityEngine::Object, t_Ptr>)
66 operator bool()
const {
return Ptr(
false); }
68 t_Ptr* operator ->() {
return Ptr(
true); }
69 const t_Ptr* operator ->()
const {
return const_cast<t_Ptr*
>(Ptr(
true)); }
72 MonoPtr& operator=(t_Ptr* p_Pointer)
74 if (m_Wrapper && m_Wrapper->Ptr == (Il2CppObject*)p_Pointer)
return *
this;
75 if (m_Wrapper) m_Wrapper->
Drop();
83 if (m_Wrapper) m_Wrapper->
Grab();
89 if (m_Wrapper) m_Wrapper->
Drop();
90 m_Wrapper = p_Other.m_Wrapper;
91 if (m_Wrapper) m_Wrapper->
Grab();
97 if (m_Wrapper) m_Wrapper->
Drop();
98 m_Wrapper = p_Other.m_Wrapper;
99 p_Other.m_Wrapper =
nullptr;
104 template<
class t_OtherPtr>
requires(t_Force || std::is_assignable_v<t_Ptr*&, t_OtherPtr*> || std::is_same_v<t_Ptr*&, t_OtherPtr*>)
105 bool operator==(
const MonoPtr<t_OtherPtr>& p_Other)
const {
return m_Wrapper == p_Other.m_Wrapper; }
106 template<
class t_OtherPtr>
107 bool operator==(t_OtherPtr* p_Pointer)
const {
return m_Wrapper && m_Wrapper->Ptr == p_Pointer; }