Coin Logo Coin3D is Free Software,
published under the BSD 3-clause license.
https://bitbucket.org/Coin3D/
http://www.kongsberg.com/kogt/
ScXMLSubObject.h
1 #ifndef COIN_SCXMLSUBOBJECT_H
2 #define COIN_SCXMLSUBOBJECT_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 #include <Inventor/SbName.h>
37 
38 /*
39  * This file contains macros for setting up the classes in the ScXML
40  * subsystem (Statechart XML) in Coin. They loosely follow the macros
41  * design for nodes and nodekits and engines, etc.
42  */
43 
44 // *************************************************************************
45 
46 #define SCXML_OBJECT_HEADER(classname) \
47 public: \
48  static SoType getClassTypeId(void); \
49  virtual SoType getTypeId(void) const; \
50  static void * createInstance(void); \
51 private: \
52  static SoType classTypeId;
53 
54 // *************************************************************************
55 
56 #define SCXML_OBJECT_ABSTRACT_HEADER(classname) \
57 public: \
58  static SoType getClassTypeId(void); \
59  virtual SoType getTypeId(void) const = 0; \
60 private: \
61  static SoType classTypeId;
62 
63 // *************************************************************************
64 
65 #define SCXML_ELEMENT_ABSTRACT_HEADER(classname) \
66  SCXML_OBJECT_ABSTRACT_HEADER(classname)
67 
68 // *************************************************************************
69 
70 // FIXME: element-reader must be reenatrant/threadsafe
71 #define SCXML_ELEMENT_HEADER(classname) \
72 public: \
73  static ScXMLEltReader * getElementReader(void); \
74 private: \
75  static ScXMLEltReader * elementReader; \
76  SCXML_OBJECT_HEADER(classname)
77 
78 // *************************************************************************
79 
80 #define SCXML_OBJECT_SOURCE(classname) \
81  \
82 SoType classname::classTypeId = SoType::badType(); \
83  \
84 SoType \
85 classname::getClassTypeId(void) \
86 { \
87  return classname::classTypeId; \
88 } \
89  \
90 SoType \
91 classname::getTypeId(void) const \
92 { \
93  return classname::classTypeId; \
94 } \
95  \
96 void * \
97 classname::createInstance(void) \
98 { \
99  return static_cast<void *>(new classname); \
100 }
101 
102 // *************************************************************************
103 
104 #define SCXML_OBJECT_ABSTRACT_SOURCE(classname) \
105  \
106 SoType classname::classTypeId = SoType::badType(); \
107  \
108 SoType \
109 classname::getClassTypeId(void) \
110 { \
111  return classname::classTypeId; \
112 }
113 
114 #define SCXML_ELEMENT_ABSTRACT_SOURCE(classname) \
115  SCXML_OBJECT_ABSTRACT_SOURCE(classname)
116 
117 #define SCXML_ELEMENT_SOURCE(classname) \
118 ScXMLEltReader * classname::elementReader = NULL; \
119  \
120 ScXMLEltReader * \
121 classname::getElementReader(void) \
122 { \
123  return classname::elementReader; \
124 } \
125  \
126  SCXML_OBJECT_SOURCE(classname)
127 
128 // *************************************************************************
129 
130 #define SCXML_OBJECT_INIT_CLASS(thisclass, parentclass, parentname) \
131  do { \
132  SoType parenttype = SoType::fromName(SO__QUOTE(parentclass)); \
133  assert(parenttype != SoType::badType()); \
134  thisclass::classTypeId = \
135  SoType::createType(parenttype, \
136  SbName(SO__QUOTE(thisclass)), \
137  thisclass::createInstance); \
138  /* ScXMLObject::registerClassType(xmlns, xmlclass, \
139  thisclass::classTypeId); */ \
140  } while ( FALSE )
141 
142 
143 #define SCXML_ELEMENT_REGISTER_READER(thisclass, xmlelement, classname) \
144  do { \
145  thisclass::elementReader = new classname; \
146  } while ( FALSE )
147 
148 #define SCXML_ELEMENT_UNREGISTER_READER(thisclass) \
149  do { \
150  delete thisclass::elementReader; \
151  thisclass::elementReader = NULL; \
152  } while ( FALSE )
153 
154 // *************************************************************************
155 
156 #define SCXML_OBJECT_INIT_ABSTRACT_CLASS(thisclass, parentclass, parentname) \
157  do { \
158  SoType parenttype = SoType::fromName(SO__QUOTE(parentclass)); \
159  assert(parenttype != SoType::badType()); \
160  thisclass::classTypeId = \
161  SoType::createType(parenttype, SbName(SO__QUOTE(thisclass))); \
162  } while ( FALSE )
163 
164 // *************************************************************************
165 
166 #define SCXML_INVOKE_INIT_CLASS(thisclass, parentclass, xmlns, targettype, source) \
167  do { \
168  SoType parenttype = SoType::fromName(SO__QUOTE(parentclass)); \
169  assert(parenttype != SoType::badType()); \
170  thisclass::classTypeId = \
171  SoType::createType(parenttype, \
172  SbName(SO__QUOTE(thisclass)), \
173  thisclass::createInstance); \
174  ScXMLObject::registerInvokeClassType(xmlns, targettype, source, \
175  thisclass::classTypeId); \
176  } while ( FALSE )
177 
178 // *************************************************************************
179 
180 
181 #endif // !COIN_SCXMLSUBOBJECT_H