1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118
|
/*
** This program is free software; you can redistribute it and/or modify
** it under the terms of the GNU General Public License as published by
** the Free Software Foundation; either version 1, or (at your option)
** any later version.
** This program 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 General Public License for more details.
** You should have received a copy of the GNU General Public License
** along with this program; if not, write to the Free Software
** Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
/*
* Author : Alexandre Parenteau <aubonbeurre@hotmail.com> --- May 1999
*/
#ifndef UOBJECT_H
#define UOBJECT_H
#include "uconfig.h"
#ifdef __cplusplus
class UObject;
class UEXPORT URuntimeClass
{
public:
URuntimeClass(const char *lpszClassName, int nObjectSize,
UObject* (*pfnCreateObject)(), const URuntimeClass* (*pfnGetBaseClass)());
~URuntimeClass();
// Attributes
const char *m_lpszClassName;
int m_nObjectSize;
UObject* (* m_pfnCreateObject)(); // 0L => abstract class
const URuntimeClass* (* m_pfnGetBaseClass)();
// Operations
UObject* CreateObject();
bool IsDerivedFrom(const URuntimeClass* pBaseClass) const;
// CRuntimeClass objects linked together in simple list
URuntimeClass* m_pNextClass; // linked list of registered classes
// linked list of all the registred runtime classes
static URuntimeClass *sAllURuntimeClass;
};
#define URUNTIME_CLASS(class_name) (class_name::rt##class_name())
#define UDECLARE_DYNAMIC(class_name) \
protected: \
static const URuntimeClass* _GetBaseClass(); \
static const URuntimeClass class##class_name; \
public: \
static const URuntimeClass *rt##class_name(void); \
virtual const URuntimeClass* GetRuntimeClass() const; \
// dynamically constructable
#define UDECLARE_DYNCREATE(class_name) \
UDECLARE_DYNAMIC(class_name) \
static UObject* CreateObject(); \
#define UIMPLEMENT_RUNTIMECLASS(class_name, base_class_name, pfnNew) \
const URuntimeClass *class_name::rt##class_name(void) \
{ return &class_name::class##class_name; } \
const URuntimeClass* class_name::_GetBaseClass() \
{ return URUNTIME_CLASS(base_class_name); } \
const URuntimeClass class_name::class##class_name( \
#class_name, sizeof(class class_name), pfnNew, \
&class_name::_GetBaseClass); \
const URuntimeClass* class_name::GetRuntimeClass() const \
{ return URUNTIME_CLASS(class_name); } \
#define UIMPLEMENT_DYNAMIC(class_name, base_class_name) \
UIMPLEMENT_RUNTIMECLASS(class_name, base_class_name, 0L)
#define UIMPLEMENT_DYNCREATE(class_name, base_class_name) \
UObject* class_name::CreateObject() \
{ return new class_name; } \
UIMPLEMENT_RUNTIMECLASS(class_name, base_class_name, \
class_name::CreateObject)
class UEXPORT UObject
{
public:
virtual const URuntimeClass* GetRuntimeClass() const;
virtual ~UObject() {}
static const URuntimeClass *rtUObject();
static const URuntimeClass* _GetBaseClass();
static UObject* CreateObject(const char *className);
bool IsKindOf(const URuntimeClass* pClass) const;
protected:
static const URuntimeClass classUObject;
UObject() {}
};
#define UDYNAMIC_CAST(TYPE, EXPR) \
((TYPE *)((EXPR) == 0L ? 0L : ((EXPR)->IsKindOf(URUNTIME_CLASS(TYPE)) ? (TYPE *)EXPR : 0L)))
#endif /* __cplusplus */
#ifdef __cplusplus
extern "C" {
#endif
#ifdef __cplusplus
}
#endif
#endif /* UOBJECT_H */
|