summaryrefslogtreecommitdiff
path: root/tools/inc/tools/rtti.hxx
diff options
context:
space:
mode:
Diffstat (limited to 'tools/inc/tools/rtti.hxx')
-rw-r--r--tools/inc/tools/rtti.hxx177
1 files changed, 177 insertions, 0 deletions
diff --git a/tools/inc/tools/rtti.hxx b/tools/inc/tools/rtti.hxx
new file mode 100644
index 000000000000..e1d69e020157
--- /dev/null
+++ b/tools/inc/tools/rtti.hxx
@@ -0,0 +1,177 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2008 by Sun Microsystems, Inc.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * $RCSfile: rtti.hxx,v $
+ * $Revision: 1.3 $
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+#ifndef _RTTI_HXX
+#define _RTTI_HXX
+
+#include <string.h>
+#include <tools/solar.h>
+
+typedef void* (*TypeId)();
+
+//-------------------------------------------------------------------------
+
+#define TYPEINFO() \
+ static void* CreateType(); \
+ static TypeId StaticType(); \
+ static BOOL IsOf( TypeId aSameOrSuperType ); \
+ virtual TypeId Type() const; \
+ virtual BOOL IsA( TypeId aSameOrSuperType ) const
+
+#define TYPEINFO_VISIBILITY(visibility) \
+ visibility static void* CreateType(); \
+ visibility static TypeId StaticType(); \
+ visibility static BOOL IsOf( TypeId aSameOrSuperType ); \
+ visibility virtual TypeId Type() const; \
+ visibility virtual BOOL IsA( TypeId aSameOrSuperType ) const
+
+#define TYPEINIT_FACTORY(sType, Factory ) \
+ void* sType::CreateType() { return Factory; } \
+ TypeId sType::StaticType() { return &CreateType; } \
+ TypeId sType::Type() const { return &CreateType; } \
+ BOOL sType::IsOf( TypeId aSameOrSuperType ) \
+ { \
+ if ( aSameOrSuperType == StaticType() ) \
+ return TRUE
+
+#define STATICTYPE(sType) (sType::StaticType())
+
+//-------------------------------------------------------------------------
+
+#define TYPEINIT_AUTOFACTORY(sType) TYPEINIT_FACTORY(sType, new sType)
+#define TYPEINIT(sType) TYPEINIT_FACTORY(sType, 0)
+
+#define SUPERTYPE(sSuper) \
+ if ( sSuper::IsOf(aSameOrSuperType ) ) \
+ return TRUE
+
+#define TYPEINIT_END(sType) \
+ return FALSE; \
+ } \
+ BOOL sType::IsA( TypeId aSameOrSuperType ) const \
+ { return IsOf( aSameOrSuperType ); }
+
+#define TYPEINIT0_FACTORY(sType, Factory) \
+ TYPEINIT_FACTORY(sType, Factory); \
+ TYPEINIT_END(sType)
+#define TYPEINIT0_AUTOFACTORY(sType) TYPEINIT0_FACTORY(sType, new sType)
+#define TYPEINIT0(sType) TYPEINIT0_FACTORY(sType, 0)
+
+#define TYPEINIT1_FACTORY(sType, sSuper, Factory) \
+ TYPEINIT_FACTORY(sType, Factory); \
+ SUPERTYPE(sSuper); \
+ TYPEINIT_END(sType)
+#define TYPEINIT1_AUTOFACTORY(sType, sSuper) \
+ TYPEINIT1_FACTORY(sType, sSuper, new sType)
+#define TYPEINIT1(sType, sSuper) \
+ TYPEINIT1_FACTORY(sType, sSuper, 0)
+
+#define TYPEINIT2_FACTORY(sType, sSuper1, sSuper2, Factory) \
+ TYPEINIT_FACTORY(sType, Factory); \
+ SUPERTYPE(sSuper1); \
+ SUPERTYPE(sSuper2); \
+ TYPEINIT_END(sType)
+#define TYPEINIT2_AUTOFACTORY(sType, sSuper1, sSuper2) \
+ TYPEINIT2_FACTORY(sType, sSuper1, sSuper2, new sType)
+#define TYPEINIT2(sType, sSuper1, sSuper2) \
+ TYPEINIT2_FACTORY(sType, sSuper1, sSuper2, 0)
+
+#define TYPEINIT3_FACTORY(sType, sSuper1, sSuper2, sSuper3, Factory) \
+ TYPEINIT_FACTORY(sType, Factory); \
+ SUPERTYPE(sSuper1); \
+ SUPERTYPE(sSuper2); \
+ SUPERTYPE(sSuper3); \
+ TYPEINIT_END(sType)
+#define TYPEINIT3_AUTOFACTORY(sType, sSuper1, sSuper2, sSuper3) \
+ TYPEINIT3_FACTORY(sType, sSuper1, sSuper2, sSuper3, new sType)
+#define TYPEINIT3(sType, sSuper1, sSuper2, sSuper3) \
+ TYPEINIT3_FACTORY(sType, sSuper1, sSuper2, sSuper3, 0)
+
+#define TYPE(sType) (sType::StaticType())
+#define ISA(sType) IsA(sType::StaticType())
+#define ISOF(sType) IsOf(sType::StaticType())
+#define CREATE(TypeId) (TypeId())
+
+//-------------------------------------------------------------------------
+// On-Demand-faehige persistent-TypeId Version
+
+#define TYPEINFO_ID(id) \
+ static TypeId StaticType() { return (TypeId) ( id | 0xF000000L ); } \
+ static BOOL IsOf( TypeId aSameOrSuperType ); \
+ virtual TypeId Type() const; \
+ virtual BOOL IsA( TypeId aSameOrSuperType ) const
+
+#define TYPEINIT_ID(sType) \
+ TypeId sType::Type() const { return StaticType(); } \
+ BOOL sType::IsOf( TypeId aSameOrSuperType ) \
+ { \
+ if ( aSameOrSuperType == StaticType() ) \
+ return TRUE
+
+#define TYPEINIT0_ID(sType) \
+ TYPEINIT_ID(sType); \
+ TYPEINIT_END(sType)
+
+#define TYPEINIT1_ID(sType, sSuper) \
+ TYPEINIT_ID(sType); \
+ SUPERTYPE(sSuper); \
+ TYPEINIT_END(sType)
+
+#define TYPEINIT2_ID(sType, sSuper1, sSuper2) \
+ TYPEINIT_ID(sType); \
+ SUPERTYPE(sSuper1); \
+ SUPERTYPE(sSuper2); \
+ TYPEINIT_END(sType)
+
+//-------------------------------------------------------------------------
+
+// Die (exemplarischen) Makros fuer die Anwendung ( hier fuer
+// Pointer, kann aber nach dem gleichen Strickmuster fuer
+// Referenzen erweitert werden.
+// PTR_CAST: sicheres Casten eines Pointers auf einen Pointer
+// einer abgeleiteten Klasse. Liefert im Fehlerfall einen
+// Nullpointer (wahrscheinlich die haeufigste Anwendung)
+//
+// T: Typ, auf den gecastet werden soll
+// p: Pointer, der gecastet werden soll
+#define PTR_CAST( T, pObj ) \
+ ( pObj && (pObj)->IsA( TYPE(T) ) ? (T*)(pObj) : 0 )
+
+// Abfrage, ob ein Objekt eine bestimmte Klasse als
+// Basisklasse hat (oder genau von dieser Klasse ist)
+#define HAS_BASE( T, pObj ) \
+ ( pObj && (pObj)->IsA( TYPE(T) ) )
+
+// Abfrage, ob ein Pointer auf ein Objekt eines bestimmten
+// Typs zeigt
+#define IS_TYPE(T,pObj) \
+ ( pObj && (pObj)->Type() == TYPE(T) )
+
+#endif // _RTTI_HXX