CmIReflectable.cpp 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687
  1. #include "CmIReflectable.h"
  2. #include "CmRTTIType.h"
  3. #include "CmException.h"
  4. namespace CamelotEngine
  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()
  64. {
  65. return getRTTI()->getRTTIId();
  66. }
  67. }