Coin: SoSubElement.h Source File

| Coin3D is Free Software, published under the BSD 3-clause license. | https://coin3d.github.io https://www.kongsberg.com/en/kogt/

SoSubElement.h
1#ifndef COIN_SOSUBELEMENT_H
2#define COIN_SOSUBELEMENT_H
3
4/**************************************************************************\
5 * Copyright (c) Kongsberg Oil & Gas Technologies AS
6 * All rights reserved.
7 *
8 * Redistribution and use in source and binary forms, with or without
9 * modification, are permitted provided that the following conditions are
10 * met:
11 *
12 * Redistributions of source code must retain the above copyright notice,
13 * this list of conditions and the following disclaimer.
14 *
15 * Redistributions in binary form must reproduce the above copyright
16 * notice, this list of conditions and the following disclaimer in the
17 * documentation and/or other materials provided with the distribution.
18 *
19 * Neither the name of the copyright holder nor the names of its
20 * contributors may be used to endorse or promote products derived from
21 * this software without specific prior written permission.
22 *
23 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
24 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
25 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
26 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
27 * HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
28 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
29 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
30 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
31 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
32 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
33 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
34\**************************************************************************/
35
36/*
37 * This file contains macro definitions with common declarations and
38 * definitions used in Coin elements.
39 *
40 * FIXME: document macros and how they are used to set up a new
41 * user-extension skeleton element class (or just point to the example
42 * code in examples/advanced/elements/). 19991209 mortene.
43 *
44 */
45
46// *************************************************************************
47
48#include <Inventor/SbBasic.h> // for SO__QUOTE() definition
49#include <Inventor/SbName.h>
50#include <Inventor/C/tidbits.h>
51#include <cassert>
52// Include SoElement.h to be Open Inventor compatible at compile-time.
53#include <Inventor/elements/SoElement.h>
54
55// *************************************************************************
56
57#define SO_ELEMENT_ABSTRACT_HEADER(_class_) \
58public: \
59 static SoType getClassTypeId(void); \
60 static int getClassStackIndex(void); \
61protected: \
62 _class_(void); \
63private: \
64 /* classStackIndex is protected in the OIV UNIX distribution in */ \
65 /* SoSubElement.h and private in the Win32 distribution. Since */ \
66 /* there is a getClassStackIndex() access method, it seems more */ \
67 /* sensible to keep it private. 20000808 mortene. */ \
68 static int classStackIndex; \
69 static SoType classTypeId; \
70 static void cleanupClass(void) { SoType::removeType(_class_::classTypeId.getName()); _class_::classTypeId STATIC_SOTYPE_INIT; }
71
72// *************************************************************************
73
74#define SO_ELEMENT_HEADER(_class_) \
75 SO_ELEMENT_ABSTRACT_HEADER(_class_); \
76public: \
77 static void * createInstance(void)
78
79// *************************************************************************
80
81#define PRIVATE_SOELEMENT_VARIABLES(_class_) \
82int _class_::classStackIndex; \
83SoType _class_::classTypeId STATIC_SOTYPE_INIT; \
84 \
85
88 \
89SoType _class_::getClassTypeId(void) { return _class_::classTypeId; } \
90 \
91
93 \
94int _class_::getClassStackIndex(void) { return _class_::classStackIndex; }
95
96
97#define SO_ELEMENT_ABSTRACT_SOURCE(_class_) \
98PRIVATE_SOELEMENT_VARIABLES(_class_) \
99_class_::_class_(void) { }
100
101#define SO_ELEMENT_SOURCE(_class_) \
102PRIVATE_SOELEMENT_VARIABLES(_class_) \
103_class_::_class_(void) { this->setTypeId(_class_::classTypeId); \
104 this->setStackIndex(_class_::classStackIndex); } \
105
108 \
109void * _class_::createInstance(void) { return new _class_; }
110
111/*
112 Specific to Coin. Added 2003-10-27.
113*/
114#define SO_ELEMENT_CUSTOM_CONSTRUCTOR_SOURCE(_class_) \
115PRIVATE_SOELEMENT_VARIABLES(_class_) \
116
119 \
120void * _class_::createInstance(void) { return new _class_; }
121
122// *************************************************************************
123
124#define PRIVATE_SOELEMENT_INIT(_class_, _parent_, _instantiate_) \
125 do { \
126 assert(_class_::classTypeId == SoType::badType()); \
127 assert(_parent_::getClassTypeId() != SoType::badType()); \
128 _class_::classTypeId = SoType::createType(_parent_::getClassTypeId(), \
129 SO__QUOTE(_class_), \
130 _instantiate_); \
131 if (_parent_::getClassStackIndex() < 0) _class_::classStackIndex = _class_::createStackIndex(_class_::classTypeId); \
132 else _class_::classStackIndex = _parent_::getClassStackIndex(); \
133 cc_coin_atexit_static_internal(reinterpret_cast<coin_atexit_f*>(_class_::cleanupClass)); \
134 } WHILE_0
135
136
137#define SO_ELEMENT_INIT_ABSTRACT_CLASS(_class_, _parent_) \
138 PRIVATE_SOELEMENT_INIT(_class_, _parent_, NULL)
139
140#define SO_ELEMENT_INIT_CLASS(_class_, _parent_) \
141 PRIVATE_SOELEMENT_INIT(_class_, _parent_, &_class_::createInstance)
142
143// *************************************************************************
144
145#endif // !COIN_SOSUBELEMENT_H