summaryrefslogtreecommitdiff
path: root/Runtime/Scripting/ReadOnlyScriptingObjectOfType.h
diff options
context:
space:
mode:
authorchai <chaifix@163.com>2019-08-14 22:50:43 +0800
committerchai <chaifix@163.com>2019-08-14 22:50:43 +0800
commit15740faf9fe9fe4be08965098bbf2947e096aeeb (patch)
treea730ec236656cc8cab5b13f088adfaed6bb218fb /Runtime/Scripting/ReadOnlyScriptingObjectOfType.h
+Unity Runtime codeHEADmaster
Diffstat (limited to 'Runtime/Scripting/ReadOnlyScriptingObjectOfType.h')
-rw-r--r--Runtime/Scripting/ReadOnlyScriptingObjectOfType.h151
1 files changed, 151 insertions, 0 deletions
diff --git a/Runtime/Scripting/ReadOnlyScriptingObjectOfType.h b/Runtime/Scripting/ReadOnlyScriptingObjectOfType.h
new file mode 100644
index 0000000..2a837e6
--- /dev/null
+++ b/Runtime/Scripting/ReadOnlyScriptingObjectOfType.h
@@ -0,0 +1,151 @@
+#pragma once
+
+#include "Runtime/Scripting/Backend/ScriptingTypes.h"
+#include "Scripting.h"
+
+#define SUPPORT_DIRECT_CACHEDPTR_PASSING_FOR_READONLY_OBJECTS UNITY_WINRT
+
+#if !SUPPORT_DIRECT_CACHEDPTR_PASSING_FOR_READONLY_OBJECTS
+template<class T>
+struct ReadOnlyScriptingObjectOfType
+{
+private:
+ ScriptingObjectPtr object;
+public:
+ ReadOnlyScriptingObjectOfType(ScriptingObjectPtr object)
+ {
+ this->object = object;
+ }
+
+ T& GetReference () const
+ {
+ T* ptr = GetPtr();
+
+ if (ptr != NULL)
+ return *ptr;
+
+ Scripting::RaiseNullExceptionObject (object);
+ return *(T*)NULL;
+ }
+
+ T& operator * () const
+ {
+ return GetReference ();
+ }
+
+ operator T* () const
+ {
+ return GetPtr ();
+ }
+
+ T* operator -> () const
+ {
+ return &GetReference ();
+ }
+
+ bool IsNull() const
+ {
+ return object == SCRIPTING_NULL;
+ }
+
+ operator PPtr<T> () const
+ {
+ if (IsNull())
+ return PPtr<T> ();
+
+ return PPtr<T> (GetInstanceID());
+ }
+
+private:
+#if UNITY_EDITOR
+public:
+ // ToDo: Fix this later, ask TomasD or Lucas
+ inline ScriptingObjectPtr GetScriptingObject() const
+ {
+ return object;
+ }
+#endif
+
+ inline int GetInstanceID() const
+ {
+ return Scripting::GetInstanceIDFromScriptingWrapper(object);
+ }
+ T* GetPtr () const
+ {
+ if (IsNull())
+ return NULL;
+
+ void* cachedPtr = GetCachedPtr();
+ if (cachedPtr != NULL)
+ {
+ AssertIf(reinterpret_cast<Object*> (cachedPtr)->GetInstanceID() != GetInstanceID());
+ return (T*)cachedPtr;
+ }
+
+ T* temp = dynamic_instanceID_cast<T*> (GetInstanceID());
+ return temp;
+ }
+
+ inline void* GetCachedPtr() const
+ {
+ return Scripting::GetCachedPtrFromScriptingWrapper(object);
+ }
+};
+
+#else
+
+template<class T>
+struct ReadOnlyScriptingObjectOfType
+{
+private:
+ T* cachedPtr;
+public:
+ ReadOnlyScriptingObjectOfType(void* p)
+ {
+ this->cachedPtr = (T*)p;
+ }
+
+ T& GetReference () const
+ {
+ if (cachedPtr != NULL)
+ return *(T*)cachedPtr;
+
+ Scripting::RaiseNullExceptionObject (SCRIPTING_NULL);
+ return *(T*)NULL;
+ }
+
+ T& operator * () const
+ {
+ return GetReference ();
+ }
+
+ operator T* () const
+ {
+ return cachedPtr;
+ }
+
+ T* operator -> () const
+ {
+ return &GetReference ();
+ }
+
+ bool IsNull() const
+ {
+ return cachedPtr == NULL;
+ }
+
+ operator PPtr<T> () const
+ {
+ if (IsNull())
+ return PPtr<T> ();
+
+ return PPtr<T> (cachedPtr->GetInstanceID());
+ }
+
+};
+
+#endif
+
+
+
+