Cast.h 1.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566
  1. /*
  2. * Cast.h, part of VCMI engine
  3. *
  4. * Authors: listed in file AUTHORS in main folder
  5. *
  6. * License: GNU General Public License v2.0 or later
  7. * Full text of license available in license.txt file, in main folder
  8. *
  9. */
  10. #pragma once
  11. #include <typeinfo>
  12. #include <string>
  13. #include "CTypeList.h"
  14. VCMI_LIB_NAMESPACE_BEGIN
  15. template<class T, class F>
  16. inline const T * dynamic_ptr_cast(const F * ptr)
  17. {
  18. #ifndef VCMI_APPLE
  19. return dynamic_cast<const T *>(ptr);
  20. #else
  21. if(!strcmp(typeid(*ptr).name(), typeid(T).name()))
  22. {
  23. return static_cast<const T *>(ptr);
  24. }
  25. try
  26. {
  27. auto * sourceTypeInfo = typeList.getTypeInfo(ptr);
  28. auto * targetTypeInfo = &typeid(typename std::remove_const<typename std::remove_pointer<T>::type>::type);
  29. typeList.castRaw((void *)ptr, sourceTypeInfo, targetTypeInfo);
  30. }
  31. catch(...)
  32. {
  33. return nullptr;
  34. }
  35. return static_cast<const T *>(ptr);
  36. #endif
  37. }
  38. template<class T, class F>
  39. inline T * dynamic_ptr_cast(F * ptr)
  40. {
  41. #ifndef VCMI_APPLE
  42. return dynamic_cast<T *>(ptr);
  43. #else
  44. if(!strcmp(typeid(*ptr).name(), typeid(T).name()))
  45. {
  46. return static_cast<T *>(ptr);
  47. }
  48. try
  49. {
  50. auto * sourceTypeInfo = typeList.getTypeInfo(ptr);
  51. auto * targetTypeInfo = &typeid(typename std::remove_const<typename std::remove_pointer<T>::type>::type);
  52. typeList.castRaw((void *)ptr, sourceTypeInfo, targetTypeInfo);
  53. }
  54. catch(...)
  55. {
  56. return nullptr;
  57. }
  58. return static_cast<T *>(ptr);
  59. #endif
  60. }
  61. VCMI_LIB_NAMESPACE_END