cast.h 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123
  1. //////////////////////////////////////////////////////////////////////////////
  2. //
  3. // cast macros
  4. //
  5. //////////////////////////////////////////////////////////////////////////////
  6. #ifndef _cast_H_
  7. #define _cast_H_
  8. #if !defined(_DEBUG) || defined(DREAMCAST)
  9. template <class DestType, class SourceType>
  10. void CastTo(DestType*& pdest, SourceType* psource)
  11. {
  12. pdest = (DestType*)(psource);
  13. }
  14. template <class DestType, class SourceType>
  15. void CastTo(TRef<DestType>& pdest, SourceType* psource)
  16. {
  17. pdest = (DestType*)(psource);
  18. }
  19. template <class DestType, class SourceType>
  20. void CastTo(DestType*& pdest, const TRef<SourceType>& psource)
  21. {
  22. pdest = (DestType*)((SourceType*)psource);
  23. }
  24. template <class DestType, class SourceType>
  25. void CastTo(TRef<DestType>& pdest, const TRef<SourceType>& psource)
  26. {
  27. pdest = (DestType*)((SourceType*)psource);
  28. }
  29. #else
  30. template <class DestType, class SourceType>
  31. void CastTo(DestType*& pdest, SourceType* psource)
  32. {
  33. if (psource != NULL) {
  34. pdest = dynamic_cast<DestType*>(psource);
  35. ZAssert(pdest != NULL);
  36. }
  37. pdest = (DestType*)(psource);
  38. }
  39. template <class DestType, class SourceType>
  40. void CastTo(TRef<DestType>& pdest, SourceType* psource)
  41. {
  42. if (psource != NULL) {
  43. pdest = dynamic_cast<DestType*>(psource);
  44. ZAssert(pdest != NULL);
  45. }
  46. pdest = (DestType*)(psource);
  47. }
  48. template <class DestType, class SourceType>
  49. void CastTo(DestType*& pdest, const TRef<SourceType>& psource)
  50. {
  51. if (psource != NULL) {
  52. pdest = dynamic_cast<DestType*>((SourceType*)psource);
  53. ZAssert(pdest != NULL);
  54. }
  55. pdest = (DestType*)((SourceType*)psource);
  56. }
  57. template <class DestType, class SourceType>
  58. void CastTo(TRef<DestType>& pdest, const TRef<SourceType>& psource)
  59. {
  60. if (psource != NULL) {
  61. pdest = dynamic_cast<DestType*>((SourceType*)psource);
  62. ZAssert(pdest != NULL);
  63. }
  64. pdest = (DestType*)((SourceType*)psource);
  65. }
  66. #endif
  67. //////////////////////////////////////////////////////////////////////////////
  68. //
  69. // Runtime Casting macros
  70. //
  71. //////////////////////////////////////////////////////////////////////////////
  72. #if 0
  73. template <class DestType, class SourceType>
  74. void RuntimeCastTo(DestType*& pdest, SourceType* psource)
  75. {
  76. pdest = dynamic_cast<DestType*>(psource);
  77. }
  78. template <class DestType, class SourceType>
  79. void RuntimeCastTo(TRef<DestType>& pdest, SourceType* psource)
  80. {
  81. pdest = dynamic_cast<DestType*>(psource);
  82. }
  83. template <class DestType, class SourceType>
  84. void RuntimeCastTo(DestType*& pdest, TRef<SourceType>& psource)
  85. {
  86. pdest = dynamic_cast<DestType*>((SourceType*)psource);
  87. }
  88. template <class DestType, class SourceType>
  89. void RuntimeCastTo(TRef<DestType>& pdest, TRef<SourceType>& psource)
  90. {
  91. pdest = dynamic_cast<DestType*>((SourceType*)psource);
  92. }
  93. #endif
  94. //////////////////////////////////////////////////////////////////////////////
  95. //
  96. // Cast to a class pointer macro
  97. //
  98. //////////////////////////////////////////////////////////////////////////////
  99. #define DefineCastMember(Type) \
  100. template<class TypeSource> \
  101. static Type* Cast(TypeSource* pvalue) \
  102. { \
  103. Type* p; CastTo(p, pvalue); \
  104. return p; \
  105. }
  106. #endif