CmIReflectable.cpp 2.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192
  1. #include "CmIReflectable.h"
  2. #include "CmRTTIType.h"
  3. #include "CmException.h"
  4. namespace BansheeEngine
  5. {
  6. void IReflectable::_registerDerivedClass(RTTITypeBase* derivedClass)
  7. {
  8. if(_isTypeIdDuplicate(derivedClass->getRTTIId()))
  9. {
  10. CM_EXCEPT(InternalErrorException, "RTTI type \"" + derivedClass->getRTTIName() +
  11. "\" has a duplicate ID: " + toString(derivedClass->getRTTIId()));
  12. }
  13. getDerivedClasses().push_back(derivedClass);
  14. }
  15. std::shared_ptr<IReflectable> IReflectable::createInstanceFromTypeId(UINT32 rttiTypeId)
  16. {
  17. RTTITypeBase* type = _getRTTIfromTypeId(rttiTypeId);
  18. if(type != nullptr)
  19. return type->newRTTIObject();
  20. return nullptr;
  21. }
  22. RTTITypeBase* IReflectable::_getRTTIfromTypeId(UINT32 rttiTypeId)
  23. {
  24. Stack<RTTITypeBase*>::type todo;
  25. Vector<RTTITypeBase*>::type& rootClasses = getDerivedClasses();
  26. for(auto iter = rootClasses.begin(); iter != rootClasses.end(); ++iter)
  27. todo.push(*iter);
  28. while(!todo.empty())
  29. {
  30. RTTITypeBase* curType = todo.top();
  31. todo.pop();
  32. if(curType->getRTTIId() == rttiTypeId)
  33. return curType;
  34. Vector<RTTITypeBase*>::type& derivedClasses = curType->getDerivedClasses();
  35. for(auto iter = derivedClasses.begin(); iter != derivedClasses.end(); ++iter)
  36. todo.push(*iter);
  37. }
  38. return nullptr;
  39. }
  40. bool IReflectable::_isTypeIdDuplicate(UINT32 typeId)
  41. {
  42. if(typeId == TID_Abstract)
  43. return false;
  44. return IReflectable::_getRTTIfromTypeId(typeId) != nullptr;
  45. }
  46. bool IReflectable::isDerivedFrom(RTTITypeBase* base)
  47. {
  48. assert(base != nullptr);
  49. Stack<RTTITypeBase*>::type todo;
  50. todo.push(base);
  51. while (!todo.empty())
  52. {
  53. RTTITypeBase* currentType = todo.top();
  54. todo.pop();
  55. if(currentType->getRTTIId() == getRTTI()->getRTTIId())
  56. return true;
  57. Vector<RTTITypeBase*>::type& derivedClasses = currentType->getDerivedClasses();
  58. for(auto iter = derivedClasses.begin(); iter != derivedClasses.end(); ++iter)
  59. todo.push(*iter);
  60. }
  61. return false;
  62. }
  63. UINT32 IReflectable::getTypeId() const
  64. {
  65. return getRTTI()->getRTTIId();
  66. }
  67. const String& IReflectable::getTypeName() const
  68. {
  69. return getRTTI()->getRTTIName();
  70. }
  71. }