#include "BsIReflectable.h" #include "BsRTTIType.h" #include "BsException.h" namespace BansheeEngine { void IReflectable::_registerDerivedClass(RTTITypeBase* derivedClass) { if(_isTypeIdDuplicate(derivedClass->getRTTIId())) { BS_EXCEPT(InternalErrorException, "RTTI type \"" + derivedClass->getRTTIName() + "\" has a duplicate ID: " + toString(derivedClass->getRTTIId())); } getDerivedClasses().push_back(derivedClass); } std::shared_ptr IReflectable::createInstanceFromTypeId(UINT32 rttiTypeId) { RTTITypeBase* type = _getRTTIfromTypeId(rttiTypeId); if(type != nullptr) return type->newRTTIObject(); return nullptr; } RTTITypeBase* IReflectable::_getRTTIfromTypeId(UINT32 rttiTypeId) { Stack todo; Vector& rootClasses = getDerivedClasses(); for(auto iter = rootClasses.begin(); iter != rootClasses.end(); ++iter) todo.push(*iter); while(!todo.empty()) { RTTITypeBase* curType = todo.top(); todo.pop(); if(curType->getRTTIId() == rttiTypeId) return curType; Vector& derivedClasses = curType->getDerivedClasses(); for(auto iter = derivedClasses.begin(); iter != derivedClasses.end(); ++iter) todo.push(*iter); } return nullptr; } bool IReflectable::_isTypeIdDuplicate(UINT32 typeId) { if(typeId == TID_Abstract) return false; return IReflectable::_getRTTIfromTypeId(typeId) != nullptr; } bool IReflectable::isDerivedFrom(RTTITypeBase* base) { return getRTTI()->isDerivedFrom(base); } UINT32 IReflectable::getTypeId() const { return getRTTI()->getRTTIId(); } const String& IReflectable::getTypeName() const { return getRTTI()->getRTTIName(); } }