From 15740faf9fe9fe4be08965098bbf2947e096aeeb Mon Sep 17 00:00:00 2001 From: chai Date: Wed, 14 Aug 2019 22:50:43 +0800 Subject: +Unity Runtime code --- Runtime/Scripting/ReadOnlyScriptingObjectOfType.h | 151 ++++++++++++++++++++++ 1 file changed, 151 insertions(+) create mode 100644 Runtime/Scripting/ReadOnlyScriptingObjectOfType.h (limited to 'Runtime/Scripting/ReadOnlyScriptingObjectOfType.h') 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 +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 () const + { + if (IsNull()) + return PPtr (); + + return PPtr (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 (cachedPtr)->GetInstanceID() != GetInstanceID()); + return (T*)cachedPtr; + } + + T* temp = dynamic_instanceID_cast (GetInstanceID()); + return temp; + } + + inline void* GetCachedPtr() const + { + return Scripting::GetCachedPtrFromScriptingWrapper(object); + } +}; + +#else + +template +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 () const + { + if (IsNull()) + return PPtr (); + + return PPtr (cachedPtr->GetInstanceID()); + } + +}; + +#endif + + + + -- cgit v1.1-26-g67d0