BsIReflectable.cpp 1.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374
  1. #include "BsIReflectable.h"
  2. #include "BsRTTIType.h"
  3. #include "BsException.h"
  4. namespace BansheeEngine
  5. {
  6. void IReflectable::_registerDerivedClass(RTTITypeBase* derivedClass)
  7. {
  8. if(_isTypeIdDuplicate(derivedClass->getRTTIId()))
  9. {
  10. BS_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*> todo;
  25. Vector<RTTITypeBase*>& 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*>& 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. return getRTTI()->isDerivedFrom(base);
  49. }
  50. UINT32 IReflectable::getTypeId() const
  51. {
  52. return getRTTI()->getRTTIId();
  53. }
  54. const String& IReflectable::getTypeName() const
  55. {
  56. return getRTTI()->getRTTIName();
  57. }
  58. }