xref: /onnv-gate/usr/src/cmd/man/src/util/nsgmls.src/include/rtti.h (revision 0:68f95e015346)
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