1 // Copyright (c) 1994 James Clark 2 // See the file COPYING for copying permission. 3 #pragma ident "%Z%%M% %I% %E% SMI" 4 5 #ifndef rtti_INCLUDED 6 #define rtti_INCLUDED 1 7 8 #ifdef SP_HAVE_RTTI 9 10 #define DYNAMIC_CAST_PTR(T, p) dynamic_cast<T *>(p) 11 #define DYNAMIC_CAST_CONST_PTR(T, p) dynamic_cast<const T *>(p) 12 13 #define RTTI_CLASS 14 15 #define RTTI_DEF0(T) 16 #define RTTI_DEF1(T, B1) 17 #define RTTI_DEF2(T, B1, B2) 18 #define RTTI_DEF3(T, B1, B2, B3) 19 20 #else /* not SP_HAVE_RTTI */ 21 22 #include "TypeId.h" 23 24 #define RTTI_CLASS \ 25 public: \ 26 virtual TypeId dynamicType() const; \ 27 static inline TypeId staticType() { return TypeId(RTTI_bases_); } \ 28 protected: \ 29 static const void *RTTI_bases_[]; \ 30 private: 31 32 #define RTTI_DEF0(T) \ 33 const void *T::RTTI_bases_[] = { 0 }; \ 34 TypeId T::dynamicType() const { return staticType(); } 35 36 #define RTTI_DEF1(T, B1) \ 37 const void *T::RTTI_bases_[] = { B1::RTTI_bases_, 0 }; \ 38 TypeId T::dynamicType() const { return staticType(); } 39 40 #define RTTI_DEF2(T, B1, B2) \ 41 const void *T::RTTI_bases_[] = { B1::RTTI_bases_, B2::RTTI_bases_, 0 }; \ 42 TypeId T::dynamicType() const { return staticType(); } 43 44 #define RTTI_DEF3(T, B1, B2, B3) \ 45 const void *T::RTTI_bases_[] = { \ 46 B1::RTTI_bases_, B2::RTTI_bases_, B3::RTTI_bases_, 0 }; \ 47 TypeId T::dynamicType() const { return staticType(); } 48 49 #define DYNAMIC_CAST_PTR(T, p) \ 50 ((p) && (p)->dynamicType().canCast(T::staticType(), (p)->staticType()) \ 51 ? (T *)(p) \ 52 : 0) 53 #define DYNAMIC_CAST_CONST_PTR(T, p) \ 54 ((p) && (p)->dynamicType().canCast(T::staticType(), (p)->staticType()) \ 55 ? (const T *)p \ 56 : 0) 57 58 #endif /* not SP_HAVE_RTTI */ 59 60 #endif /* not rtti_INCLUDED */ 61