1 #ifndef COIN_SOSUBNODE_H
2 #define COIN_SOSUBNODE_H
58 #include <Inventor/SbName.h>
60 #include <Inventor/fields/SoFieldData.h>
61 #include <Inventor/nodes/SoNode.h>
66 #define PRIVATE_NODE_TYPESYSTEM_HEADER( ) \
68 static SoType getClassTypeId(void); \
69 virtual SoType getTypeId(void) const; \
71 static SoType classTypeId
74 #define SO_NODE_ABSTRACT_HEADER(_class_) \
75 PRIVATE_NODE_TYPESYSTEM_HEADER(); \
77 static const SoFieldData ** getFieldDataPtr(void); \
78 virtual const SoFieldData * getFieldData(void) const; \
80 static void atexit_cleanup(void); \
81 static const SoFieldData ** parentFieldData; \
82 static SoFieldData * fieldData; \
85 static unsigned int classinstances
89 #define SO_NODE_HEADER(_class_) \
90 SO_NODE_ABSTRACT_HEADER(_class_); \
92 static void * createInstance(void)
96 #define PRIVATE_NODE_TYPESYSTEM_SOURCE(_class_) \
97 SoType _class_::getClassTypeId(void) { return _class_::classTypeId; } \
98 SoType _class_::getTypeId(void) const { return _class_::classTypeId; } \
99 SoType _class_::classTypeId STATIC_SOTYPE_INIT
103 #define SO_NODE_ABSTRACT_SOURCE(_class_) \
104 PRIVATE_NODE_TYPESYSTEM_SOURCE(_class_); \
106 unsigned int _class_::classinstances = 0; \
107 const SoFieldData ** _class_::parentFieldData = NULL; \
108 SoFieldData * _class_::fieldData = NULL; \
110 const SoFieldData ** \
111 _class_::getFieldDataPtr(void) \
113 return const_cast<const SoFieldData **>(&_class_::fieldData); \
116 const SoFieldData * \
117 _class_::getFieldData(void) const \
119 return _class_::fieldData; \
123 _class_::atexit_cleanup(void) \
125 delete _class_::fieldData; \
126 _class_::fieldData = NULL; \
127 _class_::parentFieldData = NULL; \
128 SoType::removeType(_class_::classTypeId.getName()); \
129 _class_::classTypeId STATIC_SOTYPE_INIT; \
130 _class_::classinstances = 0; \
134 #define SO_NODE_SOURCE(_class_) \
135 SO_NODE_ABSTRACT_SOURCE(_class_) \
141 _class_::createInstance(void) \
143 return new _class_; \
149 #define SO_NODE_IS_FIRST_INSTANCE() \
150 (classinstances == 1)
153 #define SO_NODE_CONSTRUCTOR_NOLOCK(_class_) \
155 _class_::classinstances++; \
157 assert(_class_::classTypeId != SoType::badType() && "you forgot init()!"); \
159 if (!_class_::fieldData) { \
162 _class_::fieldData = \
163 new SoFieldData(_class_::parentFieldData ? \
164 *_class_::parentFieldData : NULL); \
169 this->isBuiltIn = FALSE; \
173 #define SO_NODE_CONSTRUCTOR(_class_) \
175 SoBase::staticDataLock(); \
176 SO_NODE_CONSTRUCTOR_NOLOCK(_class_); \
177 SoBase::staticDataUnlock(); \
190 #define PRIVATE_COMMON_INIT_CODE(_class_, _classname_, _createfunc_, _parentclass_) \
193 assert(_class_::classTypeId == SoType::badType() && "don't init() twice!"); \
195 assert(strcmp(SO__QUOTE(_parentclass_), "inherited")); \
196 SoType parentType(SoType::fromName(SO__QUOTE(_parentclass_))); \
197 assert(parentType != SoType::badType() && "you forgot init() on parentclass!"); \
200 _class_::classTypeId = \
201 SoType::createType(parentType, \
204 SoNode::getNextActionMethodIndex()); \
205 SoNode::incNextActionMethodIndex(); \
208 _class_::parentFieldData = _parentclass_::getFieldDataPtr(); \
211 cc_coin_atexit_static_internal(_class_::atexit_cleanup); \
216 #define SO_NODE_INIT_CLASS(_class_, _parentclass_, _parentname_) \
218 const char * classname = SO__QUOTE(_class_); \
219 PRIVATE_COMMON_INIT_CODE(_class_, classname, &_class_::createInstance, _parentclass_); \
223 #define SO_NODE_INIT_ABSTRACT_CLASS(_class_, _parentclass_, _parentname_) \
225 const char * classname = SO__QUOTE(_class_); \
226 PRIVATE_COMMON_INIT_CODE(_class_, classname, NULL, _parentclass_); \
233 #define SO_NODE_ADD_FIELD(_field_, _defaultval_) \
235 this->_field_.setValue _defaultval_;\
236 this->_field_.setContainer(this); \
237 fieldData->addField(this, SO__QUOTE(_field_), &this->_field_); \
241 #define SO_NODE_ADD_EMPTY_MFIELD(_field_) \
243 this->_field_.setContainer(this); \
244 fieldData->addField(this, SO__QUOTE(_field_), &this->_field_);\
249 #define SO_NODE_DEFINE_ENUM_VALUE(_enumname_, _enumval_) \
251 fieldData->addEnumValue(SO__QUOTE(_enumname_), \
252 SO__QUOTE(_enumval_), _enumval_); \
257 #endif // !COIN_SOSUBNODE_H
Copyright © by Kongsberg Oil & Gas Technologies. All rights reserved.
Generated on Wed Feb 26 2014 20:04:23 for Coin by Doxygen 1.8.6.