CmIReflectable.cpp 1.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556
  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. }