Line data Source code
1 : /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2 : /*
3 : * This file is part of the LibreOffice project.
4 : *
5 : * This Source Code Form is subject to the terms of the Mozilla Public
6 : * License, v. 2.0. If a copy of the MPL was not distributed with this
7 : * file, You can obtain one at http://mozilla.org/MPL/2.0/.
8 : *
9 : * This file incorporates work covered by the following license notice:
10 : *
11 : * Licensed to the Apache Software Foundation (ASF) under one or more
12 : * contributor license agreements. See the NOTICE file distributed
13 : * with this work for additional information regarding copyright
14 : * ownership. The ASF licenses this file to you under the Apache
15 : * License, Version 2.0 (the "License"); you may not use this file
16 : * except in compliance with the License. You may obtain a copy of
17 : * the License at http://www.apache.org/licenses/LICENSE-2.0 .
18 : */
19 :
20 : #ifndef INCLUDED_TOOLS_RTTI_HXX
21 : #define INCLUDED_TOOLS_RTTI_HXX
22 :
23 : #include <string.h>
24 : #include <tools/solar.h>
25 :
26 : typedef void* (*TypeId)();
27 :
28 : #define TYPEINFO() \
29 : static void* CreateType(); \
30 : static TypeId StaticType(); \
31 : static bool IsOf( TypeId aSameOrSuperType ); \
32 : virtual TypeId Type() const; \
33 : virtual bool IsA( TypeId aSameOrSuperType ) const
34 :
35 : #define TYPEINFO_OVERRIDE() \
36 : static void* CreateType(); \
37 : static TypeId StaticType(); \
38 : static bool IsOf( TypeId aSameOrSuperType ); \
39 : virtual TypeId Type() const SAL_OVERRIDE; \
40 : virtual bool IsA( TypeId aSameOrSuperType ) const SAL_OVERRIDE
41 :
42 : #define TYPEINFO_VISIBILITY(visibility) \
43 : visibility static void* CreateType(); \
44 : visibility static TypeId StaticType(); \
45 : visibility static bool IsOf( TypeId aSameOrSuperType ); \
46 : visibility virtual TypeId Type() const SAL_OVERRIDE; \
47 : visibility virtual bool IsA( TypeId aSameOrSuperType ) const SAL_OVERRIDE
48 :
49 : #define TYPEINFO_VISIBILITY_OVERRIDE(visibility) \
50 : visibility static void* CreateType(); \
51 : visibility static TypeId StaticType(); \
52 : visibility static bool IsOf( TypeId aSameOrSuperType ); \
53 : visibility virtual TypeId Type() const SAL_OVERRIDE; \
54 : visibility virtual bool IsA( TypeId aSameOrSuperType ) const SAL_OVERRIDE
55 :
56 : #define TYPEINIT_FACTORY(sType, Factory ) \
57 : void* sType::CreateType() { return Factory; } \
58 : TypeId sType::StaticType() { return &CreateType; } \
59 : TypeId sType::Type() const { return &CreateType; } \
60 : bool sType::IsOf( TypeId aSameOrSuperType ) \
61 : { \
62 : if ( aSameOrSuperType == StaticType() ) \
63 : return true
64 :
65 : #define STATICTYPE(sType) (sType::StaticType())
66 :
67 : #define SUPERTYPE(sSuper) \
68 : if ( sSuper::IsOf(aSameOrSuperType ) ) \
69 : return true
70 :
71 : #define TYPEINIT_END(sType) \
72 : return false; \
73 : } \
74 : bool sType::IsA( TypeId aSameOrSuperType ) const \
75 : { return IsOf( aSameOrSuperType ); }
76 :
77 : #define TYPEINIT0_FACTORY(sType, Factory) \
78 : TYPEINIT_FACTORY(sType, Factory); \
79 : TYPEINIT_END(sType)
80 : #define TYPEINIT0_AUTOFACTORY(sType) TYPEINIT0_FACTORY(sType, new sType)
81 : #define TYPEINIT0(sType) TYPEINIT0_FACTORY(sType, 0)
82 :
83 : #define TYPEINIT1_FACTORY(sType, sSuper, Factory) \
84 : TYPEINIT_FACTORY(sType, Factory); \
85 : SUPERTYPE(sSuper); \
86 : TYPEINIT_END(sType)
87 : #define TYPEINIT1_AUTOFACTORY(sType, sSuper) \
88 : TYPEINIT1_FACTORY(sType, sSuper, new sType)
89 : #define TYPEINIT1(sType, sSuper) \
90 : TYPEINIT1_FACTORY(sType, sSuper, 0)
91 :
92 : #define TYPEINIT2_FACTORY(sType, sSuper1, sSuper2, Factory) \
93 : TYPEINIT_FACTORY(sType, Factory); \
94 : SUPERTYPE(sSuper1); \
95 : SUPERTYPE(sSuper2); \
96 : TYPEINIT_END(sType)
97 : #define TYPEINIT2_AUTOFACTORY(sType, sSuper1, sSuper2) \
98 : TYPEINIT2_FACTORY(sType, sSuper1, sSuper2, new sType)
99 : #define TYPEINIT2(sType, sSuper1, sSuper2) \
100 : TYPEINIT2_FACTORY(sType, sSuper1, sSuper2, 0)
101 :
102 : #define TYPEINIT3_FACTORY(sType, sSuper1, sSuper2, sSuper3, Factory) \
103 : TYPEINIT_FACTORY(sType, Factory); \
104 : SUPERTYPE(sSuper1); \
105 : SUPERTYPE(sSuper2); \
106 : SUPERTYPE(sSuper3); \
107 : TYPEINIT_END(sType)
108 : #define TYPEINIT3(sType, sSuper1, sSuper2, sSuper3) \
109 : TYPEINIT3_FACTORY(sType, sSuper1, sSuper2, sSuper3, 0)
110 :
111 : #define TYPE(sType) (sType::StaticType())
112 : #define ISA(sType) IsA(sType::StaticType())
113 : #define ISOF(sType) IsOf(sType::StaticType())
114 : #define CREATE(TypeId) (TypeId())
115 :
116 : /** Exemplary application macros for pointers
117 : (can be extended for use with references)
118 :
119 : PTR_CAST: Safe pointer casting to a derived class.
120 : Returns NULL pointer on cast error
121 :
122 : T: Target type to cast into
123 : p: Pointer to be cast into T
124 : */
125 : #define PTR_CAST( T, pObj ) rttiCast<T>(pObj, TYPE(T))
126 :
127 : template<class T1, class T2>
128 5272937 : inline T1* rttiCast(T2* pObj, const TypeId& rTypeId) {
129 5272937 : return (pObj && pObj->IsA( rTypeId )) ? static_cast<T1*>(pObj) : 0;
130 : };
131 :
132 : template<class T1, class T2>
133 90890 : inline const T1* rttiCast(const T2* pObj, const TypeId& rTypeId) {
134 90890 : return (pObj && pObj->IsA( rTypeId )) ? static_cast<const T1*>(pObj) : 0;
135 : };
136 :
137 : /** Check whether object pObj has a Base Class T
138 : (or if pObj is an instance of T) */
139 : #define HAS_BASE( T, pObj ) \
140 : ( pObj && (pObj)->IsA( TYPE(T) ) )
141 :
142 : /** Check whether a pointer is targetting and object of type T. */
143 : #define IS_TYPE(T,pObj) \
144 : ( pObj && (pObj)->Type() == TYPE(T) )
145 :
146 : #endif
147 :
148 : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|