BsRTTIType.cpp 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  1. //********************************** Banshee Engine (www.banshee3d.com) **************************************************//
  2. //**************** Copyright (c) 2016 Marko Pintera ([email protected]). All rights reserved. **********************//
  3. #include "Reflection/BsRTTIType.h"
  4. #include "Error/BsException.h"
  5. namespace bs
  6. {
  7. RTTITypeBase::RTTITypeBase()
  8. { }
  9. RTTITypeBase::~RTTITypeBase()
  10. {
  11. for(auto iter = mFields.begin(); iter != mFields.end(); ++iter)
  12. bs_delete(*iter);
  13. mFields.clear();
  14. }
  15. RTTIField* RTTITypeBase::findField(const String& name)
  16. {
  17. auto foundElement = std::find_if(mFields.begin(), mFields.end(), [&name](RTTIField* x) { return x->mName == name; });
  18. if(foundElement == mFields.end())
  19. {
  20. BS_EXCEPT(InternalErrorException,
  21. "Cannot find a field with the specified name: " + name);
  22. }
  23. return *foundElement;
  24. }
  25. RTTIField* RTTITypeBase::findField(int uniqueFieldId)
  26. {
  27. auto foundElement = std::find_if(mFields.begin(), mFields.end(), [&uniqueFieldId](RTTIField* x) { return x->mUniqueId == uniqueFieldId; });
  28. if(foundElement == mFields.end())
  29. return nullptr;
  30. return *foundElement;
  31. }
  32. void RTTITypeBase::addNewField(RTTIField* field)
  33. {
  34. if(field == nullptr)
  35. {
  36. BS_EXCEPT(InvalidParametersException,
  37. "Field argument can't be null.");
  38. }
  39. int uniqueId = field->mUniqueId;
  40. auto foundElementById = std::find_if(mFields.begin(), mFields.end(), [uniqueId](RTTIField* x) { return x->mUniqueId == uniqueId; });
  41. if(foundElementById != mFields.end())
  42. {
  43. BS_EXCEPT(InternalErrorException,
  44. "Field with the same ID already exists.");
  45. }
  46. String& name = field->mName;
  47. auto foundElementByName = std::find_if(mFields.begin(), mFields.end(), [&name](RTTIField* x) { return x->mName == name; });
  48. if(foundElementByName != mFields.end())
  49. {
  50. BS_EXCEPT(InternalErrorException,
  51. "Field with the same name already exists.");
  52. }
  53. mFields.push_back(field);
  54. }
  55. SPtr<IReflectable> rtti_create(UINT32 rttiId)
  56. {
  57. return IReflectable::createInstanceFromTypeId(rttiId);
  58. }
  59. }