2
0

CmIReflectable.cpp 2.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  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. return IReflectable::getRTTIfromTypeId(typeId) != nullptr;
  43. }
  44. bool IReflectable::isDerivedFrom(RTTITypeBase* base)
  45. {
  46. assert(base != nullptr);
  47. stack<RTTITypeBase*>::type todo;
  48. todo.push(base);
  49. while (!todo.empty())
  50. {
  51. RTTITypeBase* currentType = todo.top();
  52. todo.pop();
  53. if(currentType->getRTTIId() == getRTTI()->getRTTIId())
  54. return true;
  55. vector<RTTITypeBase*>::type& derivedClasses = currentType->getDerivedClasses();
  56. for(auto iter = derivedClasses.begin(); iter != derivedClasses.end(); ++iter)
  57. todo.push(*iter);
  58. }
  59. return false;
  60. }
  61. }