Rtti.h 1.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980
  1. // Copyright (C) 2009-2016, Panagiotis Christopoulos Charitos.
  2. // All rights reserved.
  3. // Code licensed under the BSD License.
  4. // http://www.anki3d.org/LICENSE
  5. #pragma once
  6. #include <anki/util/Assert.h>
  7. namespace anki
  8. {
  9. /// @addtogroup util_private
  10. /// @{
  11. template<typename T>
  12. struct ExtractType
  13. {
  14. using Type = T;
  15. };
  16. template<typename T>
  17. struct ExtractType<const T&>
  18. {
  19. using Type = T;
  20. };
  21. template<typename T>
  22. struct ExtractType<T&>
  23. {
  24. using Type = T;
  25. };
  26. template<typename T>
  27. struct ExtractType<const T*>
  28. {
  29. using Type = T;
  30. };
  31. template<typename T>
  32. struct ExtractType<T*>
  33. {
  34. using Type = T;
  35. };
  36. /// @}
  37. /// @addtogroup util_misc
  38. /// @{
  39. /// Check if a class is of certain type.
  40. template<typename TTo, typename TFrom>
  41. inline Bool isa(TFrom& c)
  42. {
  43. return TTo::classof(c);
  44. }
  45. /// Check if a class is of certain type.
  46. template<typename TTo, typename TFrom>
  47. inline Bool isa(TFrom* c)
  48. {
  49. return TTo::classof(*c);
  50. }
  51. /// Custom dynamic cast.
  52. template<typename TTo, typename TFrom>
  53. inline TTo dcast(TFrom& c)
  54. {
  55. ANKI_ASSERT(isa<typename ExtractType<TTo>::Type>(c));
  56. return static_cast<TTo>(c);
  57. }
  58. /// Custom dynamic cast.
  59. template<typename TTo, typename TFrom>
  60. inline TTo dcast(TFrom* c)
  61. {
  62. ANKI_ASSERT(isa<typename ExtractType<TTo>::Type>(c));
  63. return static_cast<TTo>(c);
  64. }
  65. /// @}
  66. } // end namespace anki