00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023 #ifndef SO_TYPED_CLASS_
00024 #define SO_TYPED_CLASS_
00025
00026 #include <Inventor/SoType.h>
00027
00028
00029 #define SO_TYPED_CLASS_INTERNAL_HEADER() \
00030 public: \
00031 SoType getTypeId() const; \
00032 static SoType getClassTypeId(); \
00033 static void *createFromSoType(SoType* dynamicType = NULL); \
00034 private: \
00035 static SoType m_classTypeId; \
00036 static SbBool m_isFirstTime
00037
00038 #define SO_TYPED_CLASS_HEADER() \
00039 SO_TYPED_CLASS_INTERNAL_HEADER(); \
00040 public: \
00041 static void initClass(); \
00042 static void exitClass()
00043
00044 #define SO_TYPED_CLASS_ABSTRACT_VARS(className) \
00045 SoType className::m_classTypeId; \
00046 SbBool className::m_isFirstTime = TRUE;
00047
00048
00049
00050 #define SO_TYPED_CLASS_VARS(className) \
00051 SO_TYPED_CLASS_ABSTRACT_VARS(className)
00052
00053 #define SO_TYPED_CLASS_INTERNAL_SOURCE(parent, className, classPrintName) \
00054 \
00055 SO_TYPED_CLASS_ABSTRACT_VARS(className) \
00056 \
00057 SoType \
00058 className::getTypeId() const \
00059 { \
00060 return m_classTypeId; \
00061 } \
00062 \
00063 SoType \
00064 className::getClassTypeId() \
00065 { \
00066 return m_classTypeId; \
00067 } \
00068 \
00069 void * \
00070 className::createFromSoType(SoType*) \
00071 { \
00072 return (void *)(new className); \
00073 }
00074
00075 #define SO_TYPED_CLASS_SOURCE(parentClass, className, classPrintName) \
00076 SO_TYPED_CLASS_INTERNAL_SOURCE(parentClass,className,classPrintName) \
00077 \
00078 void \
00079 className::initClass() \
00080 { \
00081 SO_TYPED_CLASS_INIT_CLASS(className,classPrintName,parentClass) \
00082 } \
00083 \
00084 void \
00085 className::exitClass() \
00086 { \
00087 SO_TYPED_CLASS_EXIT_CLASS(className) \
00088 }
00089
00090 #define SO_TYPED_CLASS_ABSTRACT_INTERNAL_SOURCE(className) \
00091 SO_TYPED_CLASS_ABSTRACT_VARS(className)
00092
00093 #define SO_TYPED_CLASS_ABSTRACT_SOURCE(className, classPrintName, parentClass) \
00094 SO_TYPED_CLASS_ABSTRACT_INTERNAL_SOURCE(className) \
00095 void \
00096 className::initClass() \
00097 { \
00098 SO_TYPED_CLASS_INIT_ABSTRACT_CLASS(className, classPrintName, parentClass) \
00099 } \
00100 \
00101 void \
00102 className::exitClass() \
00103 { \
00104 SO_TYPED_CLASS_EXIT_ABSTRACT_CLASS(className) \
00105 }
00106
00107 #define SO_TYPED_CLASS_ABSTRACT_INTERNAL_HEADER() \
00108 public: \
00109 virtual SoType getTypeId() const = 0; \
00110 static SoType getClassTypeId() { return m_classTypeId; } \
00111 \
00112 private: \
00113 static SoType m_classTypeId; \
00114 static SbBool m_isFirstTime
00115
00116 #define SO_TYPED_CLASS_ABSTRACT_HEADER() \
00117 SO_TYPED_CLASS_ABSTRACT_INTERNAL_HEADER(); \
00118 public: \
00119 static void initClass(); \
00120 static void exitClass();
00121
00122 #define SO_TYPED_CLASS_INIT_ABSTRACT_CLASS(className,classPrintName,parentClass) \
00123 if (m_isFirstTime) \
00124 { \
00125 if (parentClass::getClassTypeId() == SoType::badType() ) \
00126 parentClass::initClass(); \
00127 m_classTypeId = SoType::createType(parentClass::getClassTypeId(), \
00128 classPrintName, \
00129 NULL); \
00130 m_isFirstTime = FALSE; \
00131 }
00132
00133 #define SO_TYPED_CLASS_EXIT_ABSTRACT_CLASS(className) \
00134 SoType::removeType(m_classTypeId.getName()); \
00135 m_classTypeId = SoType::badType(); \
00136 m_isFirstTime = TRUE;
00137
00138 #define SO_TYPED_CLASS_INIT_CLASS(className,classPrintName,parentClass) \
00139 if (m_isFirstTime) \
00140 { \
00141 if (parentClass::getClassTypeId() == SoType::badType() ) \
00142 parentClass::initClass(); \
00143 m_classTypeId = SoType::createType(parentClass::getClassTypeId(), \
00144 classPrintName, \
00145 &className::createFromSoType); \
00146 m_isFirstTime = FALSE; \
00147 }
00148
00149 #define SO_TYPED_CLASS_EXIT_CLASS(className) \
00150 SO_TYPED_CLASS_EXIT_ABSTRACT_CLASS(className)
00151
00152 #endif
00153
00154
00155