Browse Source

RTTI newObject now returns a shared ptr

Marko Pintera 13 years ago
parent
commit
6b543d1fae

+ 0 - 2
CamelotClient/CamelotClient.cpp

@@ -23,8 +23,6 @@ int _tmain(int argc, _TCHAR* argv[])
 
 	test();
 
-	IReflectable* refl = IReflectable::createInstanceFromTypeId(102);
-
 	gApplication().runMainLoop();
 
 	int a = 5;

+ 1 - 1
CamelotRenderer/Include/CmResourceST.h

@@ -32,7 +32,7 @@ namespace CamelotEngine
 			return 100;
 		}
 
-		virtual Resource* newRTTIObject()
+		virtual std::shared_ptr<IReflectable> newRTTIObject()
 		{
 			CM_EXCEPT(InternalErrorException, "Cannot instantiate an abstract class.");
 		}

+ 4 - 5
CamelotRenderer/Include/CmTextureST.h

@@ -90,12 +90,11 @@ namespace CamelotEngine
 			return 101;
 		}
 
-		TexturePtr texPtr; // HACK - this is just for testing before I port all newRTTI methods to use shared_ptr
-		virtual Resource* newRTTIObject()
+		virtual std::shared_ptr<IReflectable> newRTTIObject()
 		{
-			// DEBUG ONLY
-			texPtr = TextureManager::instance().create(TEX_TYPE_2D, 128, 128, 1, PF_A8B8G8R8);
-			return texPtr.get();
+			// DEBUG ONLY - Remove this after I implement RTTI types for specific texture types
+			return TextureManager::instance().create(TEX_TYPE_2D, 128, 128, 1, PF_A8B8G8R8);
+
 			//CM_EXCEPT(InternalErrorException, "Cannot instantiate abstract class!");
 		}
 	};

+ 1 - 1
CamelotUtility/Include/CmIReflectable.h

@@ -38,6 +38,6 @@ namespace CamelotEngine
 			getDerivedClasses().push_back(derivedClass);
 		}
 
-		static IReflectable* createInstanceFromTypeId(UINT32 rttiTypeId);
+		static std::shared_ptr<IReflectable> createInstanceFromTypeId(UINT32 rttiTypeId);
 	};
 }

+ 2 - 2
CamelotUtility/Include/CmRTTIReflectableField.h

@@ -14,7 +14,7 @@ namespace CamelotEngine
 		virtual void setValue(void* object, IReflectable& value) = 0;
 		virtual void setArrayValue(void* object, UINT32 index, IReflectable& value) = 0;
 
-		virtual IReflectable* newObject() = 0;
+		virtual std::shared_ptr<IReflectable> newObject() = 0;
 
 		virtual bool hasDynamicSize() { return true; }
 	};
@@ -140,7 +140,7 @@ namespace CamelotEngine
 			f(castObject, size);
 		}
 
-		virtual IReflectable* newObject()
+		virtual std::shared_ptr<IReflectable> newObject()
 		{
 			return DataType::getRTTIStatic()->newRTTIObject();
 		}

+ 1 - 1
CamelotUtility/Include/CmRTTIType.h

@@ -46,7 +46,7 @@ namespace CamelotEngine
 
 		virtual vector<RTTITypeBase*>::type& getDerivedClasses() = 0;
 		virtual void registerDerivedClass(RTTITypeBase* derivedClass) = 0;
-		virtual IReflectable* newRTTIObject() = 0;
+		virtual std::shared_ptr<IReflectable> newRTTIObject() = 0;
 		virtual const String& getRTTIName() = 0;
 		virtual UINT32 getRTTIId() = 0;
 

+ 2 - 2
CamelotUtility/Include/CmTextureDataST.h

@@ -55,9 +55,9 @@ namespace CamelotEngine
 			return 102;
 		}
 
-		virtual TextureData* newRTTIObject()
+		virtual std::shared_ptr<IReflectable> newRTTIObject()
 		{
-			return new TextureData();
+			return std::shared_ptr<TextureData>(new TextureData());
 		}
 	};
 }

+ 3 - 3
CamelotUtility/Source/CmBinarySerializer.cpp

@@ -122,7 +122,7 @@ namespace CamelotEngine
 		UINT32 objectTypeId = 0;
 		decodeObjectMetaData(objectMetaData, objectId, objectTypeId);
 
-		std::shared_ptr<IReflectable> object = std::shared_ptr<IReflectable>(IReflectable::createInstanceFromTypeId(objectTypeId));
+		std::shared_ptr<IReflectable> object = IReflectable::createInstanceFromTypeId(objectTypeId);
 		std::shared_ptr<IReflectable> rootObject = object;
 
 		// Create initial object + all other objects that are being referenced.
@@ -153,7 +153,7 @@ namespace CamelotEngine
 
 				if(iterFind != mPtrsToResolve.end())
 				{
-					object = std::shared_ptr<IReflectable>(IReflectable::createInstanceFromTypeId(objectTypeId));
+					object = IReflectable::createInstanceFromTypeId(objectTypeId);
 				}
 			}
 		}
@@ -881,7 +881,7 @@ namespace CamelotEngine
 		std::shared_ptr<IReflectable> emptyObject = nullptr;
 		if(*complexTypeSize > 0)
 		{
-			emptyObject = std::shared_ptr<IReflectable>(field->newObject());
+			emptyObject = field->newObject();
 			UINT32 dummy = 0;
 			decodeInternal(emptyObject, data, *complexTypeSize, dummy);
 		}

+ 1 - 1
CamelotUtility/Source/CmIReflectable.cpp

@@ -4,7 +4,7 @@
 
 namespace CamelotEngine
 {
-	IReflectable* IReflectable::createInstanceFromTypeId(UINT32 rttiTypeId)
+	std::shared_ptr<IReflectable> IReflectable::createInstanceFromTypeId(UINT32 rttiTypeId)
 	{
 		stack<RTTITypeBase*>::type todo;
 		vector<RTTITypeBase*>::type& rootClasses = getDerivedClasses();