Open Inventor Reference
MeVis/ThirdParty/Sources/Inventor/inventor/lib/database/include/Inventor/elements/SoSubElement.h
Go to the documentation of this file.
00001 /*
00002  *
00003  *  Copyright (C) 2000 Silicon Graphics, Inc.  All Rights Reserved. 
00004  *
00005  *  This library is free software; you can redistribute it and/or
00006  *  modify it under the terms of the GNU Lesser General Public
00007  *  License as published by the Free Software Foundation; either
00008  *  version 2.1 of the License, or (at your option) any later version.
00009  *
00010  *  This library is distributed in the hope that it will be useful,
00011  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
00012  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
00013  *  Lesser General Public License for more details.
00014  *
00015  *  Further, this software is distributed without any warranty that it is
00016  *  free of the rightful claim of any third person regarding infringement
00017  *  or the like.  Any license provided herein, whether implied or
00018  *  otherwise, applies only to this software file.  Patent licenses, if
00019  *  any, provided herein do not apply to combinations of this program with
00020  *  other software, or any other product whatsoever.
00021  * 
00022  *  You should have received a copy of the GNU Lesser General Public
00023  *  License along with this library; if not, write to the Free Software
00024  *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
00025  *
00026  *  Contact information: Silicon Graphics, Inc., 1600 Amphitheatre Pkwy,
00027  *  Mountain View, CA  94043, or:
00028  * 
00029  *  http://www.sgi.com 
00030  * 
00031  *  For further information regarding this notice, see: 
00032  * 
00033  *  http://oss.sgi.com/projects/GenInfo/NoticeExplan/
00034  *
00035  */
00036 
00037 
00038 /*
00039  * Copyright (C) 1990,91   Silicon Graphics, Inc.
00040  *
00041  _______________________________________________________________________
00042  ______________  S I L I C O N   G R A P H I C S   I N C .  ____________
00043  |
00044  |   $Revision: 1.1.1.1 $
00045  |
00046  |   Description:
00047  |      This file defines some macros that implement things common to
00048  |      many subclasses of SoElement. They may be used to make SoElement
00049  |      subclassing easier. In all of the macros, the "className"
00050  |      parameter refers to the name of the element subclass.
00051  |
00052  |   Defined macros:
00053  |
00054  |      Within class header:
00055  |
00056  |              SO_ELEMENT_ABSTRACT_HEADER(className)
00057  |              SO_ELEMENT_HEADER(className)
00058  |
00059  |      Within class source:
00060  |
00061  |          At file scope:
00062  |
00063  |              SO_ELEMENT_ABSTRACT_SOURCE(className)
00064  |              SO_ELEMENT_SOURCE(className)
00065  |
00066  |          Class initialization (in initClass):
00067  |
00068  |              SO_ELEMENT_INIT_ABSTRACT_CLASS()
00069  |              SO_ELEMENT_INIT_CLASS()
00070  |
00071  |
00072  |   Author(s)          : Paul S. Strauss
00073  |
00074  ______________  S I L I C O N   G R A P H I C S   I N C .  ____________
00075  _______________________________________________________________________
00076  */
00077 
00078 #ifndef  _SO_SUB_ELEMENT_
00079 #define  _SO_SUB_ELEMENT_
00080 
00081 #include <Inventor/elements/SoElement.h>
00082 
00083 
00089 
00095 
00099 #define SO_ELEMENT_ABSTRACT_HEADER(className)                                 \
00100   public:                                                                     \
00101     static SoType       getClassTypeId()        { return classTypeId; }       \
00102     static int          getClassStackIndex()    { return classStackIndex; }   \
00103   protected:                                                                  \
00104     static int          classStackIndex;                                      \
00105     className();                                                              \
00106   private:                                                                    \
00107     static SoType       classTypeId
00108 
00112 #define SO_ELEMENT_HEADER(className)                                          \
00113     SO_ELEMENT_ABSTRACT_HEADER(className);                                    \
00114   private:                                                                    \
00115     static void *createInstance()
00116 
00121 
00127 
00128 #define SO__ELEMENT_ABSTRACT_VARS(className)                                  \
00129 SoType  className::classTypeId;                                               \
00130 int             className::classStackIndex
00131 
00132 #define SO__ELEMENT_VARS(className)                                           \
00133 SO__ELEMENT_ABSTRACT_VARS(className)
00134 
00138 #define SO__ELEMENT_ABSTRACT_METHODS(className)                               \
00139                                                                               \
00140 className::className()                                                        \
00141 {                                                                             \
00142 }
00143 
00147 #define SO__ELEMENT_METHODS(className)                                        \
00148                                                                               \
00149 className::className()                                                        \
00150 {                                                                             \
00151     setTypeId(classTypeId);                                                   \
00152     setStackIndex(classStackIndex);                                           \
00153 }                                                                             \
00154                                                                               \
00155 void *                                                                        \
00156 className::createInstance()                                                   \
00157 {                                                                             \
00158     return new className;                                                     \
00159 }
00160 
00166 
00167 #define SO_ELEMENT_ABSTRACT_SOURCE(className)                                 \
00168     SO__ELEMENT_ABSTRACT_VARS(className);                                     \
00169     SO__ELEMENT_ABSTRACT_METHODS(className)
00170 
00171 #define SO_ELEMENT_SOURCE(className)                                          \
00172     SO__ELEMENT_VARS(className);                                              \
00173     SO__ELEMENT_METHODS(className)
00174 
00182 
00183 #define SO_ELEMENT_INIT_ABSTRACT_CLASS(className,parentClass) {               \
00184     int _value_false= 0;                                                      \
00185     do {                                                                      \
00186         classTypeId = SoType::createType(parentClass::getClassTypeId(),       \
00187                                          SO__QUOTE(className),                \
00188                                          NULL);                               \
00189         if (parentClass::classStackIndex < 0)                                 \
00190             classStackIndex = createStackIndex(classTypeId);                  \
00191         else                                                                  \
00192             classStackIndex = parentClass::classStackIndex;                   \
00193     } while (_value_false);                                                   \
00194     }
00195 
00196 #define SO_ELEMENT_INIT_CLASS(className,parentClass) {                        \
00197     int _value_false= 0;                                                      \
00198     do {                                                                      \
00199         classTypeId = SoType::createType(parentClass::getClassTypeId(),       \
00200                                          SO__QUOTE(className),                \
00201                                          &className::createInstance);         \
00202         if (parentClass::classStackIndex < 0)                                 \
00203             classStackIndex = createStackIndex(classTypeId);                  \
00204         else                                                                  \
00205             classStackIndex = parentClass::classStackIndex;                   \
00206     } while (_value_false);                                                   \
00207     }
00208 
00209 
00210 #endif /* _SO_SUB_ELEMENT_ */