Main Page | Modules | Namespace List | Class Hierarchy | Alphabetical List | Class List | Directories | File List | Namespace Members | Class Members | File Members | Related Pages

OSGFieldContainerImpl.h

Go to the documentation of this file.
00001 /*---------------------------------------------------------------------------*\
00002  *                                OpenSG                                     *
00003  *                                                                           *
00004  *                                                                           *
00005  *                     Copyright 2000-2002 by OpenSG Forum                   *
00006  *                                                                           *
00007  *   contact: dirk@opensg.org, gerrit.voss@vossg.org, jbehr@zgdv.de          *
00008  *                                                                           *
00009 \*---------------------------------------------------------------------------*/
00010 /*---------------------------------------------------------------------------*\
00011  *                                License                                    *
00012  *                                                                           *
00013  * This library is free software; you can redistribute it and/or modify it   *
00014  * under the terms of the GNU Library General Public License as published    *
00015  * by the Free Software Foundation, version 2.                               *
00016  *                                                                           *
00017  * This library is distributed in the hope that it will be useful, but       *
00018  * WITHOUT ANY WARRANTY; without even the implied warranty of                *
00019  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU         *
00020  * Library General Public License for more details.                          *
00021  *                                                                           *
00022  * You should have received a copy of the GNU Library General Public         *
00023  * License along with this library; if not, write to the Free Software       *
00024  * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.                 *
00025  *                                                                           *
00026 \*---------------------------------------------------------------------------*/
00027 /*---------------------------------------------------------------------------*\
00028  *                                Changes                                    *
00029  *                                                                           *
00030  *                                                                           *
00031  *                                                                           *
00032  *                                                                           *
00033  *                                                                           *
00034  *                                                                           *
00035 \*---------------------------------------------------------------------------*/
00036 
00037 #ifndef _OSGFIELDCONTAINERIMPL_H_
00038 #define _OSGFIELDCONTAINERIMPL_H_
00039 #ifdef __sgi
00040 #pragma once
00041 #endif
00042 
00043 #ifdef OSG_DOC_FILES_IN_MODULE
00044 
00047 #endif
00048 
00049 #include <OSGSystemDef.h>
00050 #include <OSGIDStringLink.h>
00051 
00052 #include <OSGFieldContainerBase.h>
00053 
00054 #if defined(OSG_GV_BETA) && defined(OSG_DBG_MEM)
00055 #include <OSGTime.h>
00056 #include <OSGThread.h>
00057 #endif
00058 
00059 OSG_BEGIN_NAMESPACE
00060 
00061 class Field;
00062 class BinaryDataHandler;
00063 
00067 class FieldContainer 
00068 {
00069     /*==========================  PUBLIC  =================================*/
00070 
00071   public:
00072 
00073     enum { NextFieldId = 1 };
00074 
00075     static const BitVector NextFieldMask   = 
00076                     (TypeTraits<BitVector>::One << NextFieldId);
00077     static const BitVector MTInfluenceMask = 0x00;
00078 
00079     /*---------------------------------------------------------------------*/
00083     static OSG_SYSTEMLIB_DLLMAPPING FieldContainerType &getClassType   (void); 
00084     static OSG_SYSTEMLIB_DLLMAPPING UInt32              getClassTypeId (void);
00085     static OSG_SYSTEMLIB_DLLMAPPING UInt16              getClassGroupId(void);
00086 
00088     /*---------------------------------------------------------------------*/
00092     OSG_SYSTEMLIB_DLLMAPPING 
00093     virtual       FieldContainerType &getType    (void);
00094 
00095     OSG_SYSTEMLIB_DLLMAPPING 
00096     virtual const FieldContainerType &getType    (void) const;
00097 
00098                   OSG_SYSTEMLIB_DLLMAPPING 
00099                   UInt32              getTypeId  (void) const;
00100 
00101                   OSG_SYSTEMLIB_DLLMAPPING 
00102                   UInt16              getGroupId (void) const;
00103 
00104             OSG_SYSTEMLIB_DLLMAPPING 
00105             const Char8              *getTypeName(void) const;
00106 
00108     /*---------------------------------------------------------------------*/
00112     OSG_SYSTEMLIB_DLLMAPPING 
00113     virtual UInt32  getContainerSize(void) const = 0;
00114 
00116     /*---------------------------------------------------------------------*/
00120             OSG_SYSTEMLIB_DLLMAPPING 
00121             Field  *getField        (      UInt32 fieldId  );
00122 
00123             OSG_SYSTEMLIB_DLLMAPPING 
00124             Field  *getField        (const Char8 *fieldName);
00125 
00127     /*---------------------------------------------------------------------*/
00131     virtual FieldContainerPtr shallowCopy(void) const = 0;
00132 
00134     /*---------------------------------------------------------------------*/
00138     OSG_SYSTEMLIB_DLLMAPPING 
00139     virtual UInt32  getBinSize (const BitVector         &whichField);
00140 
00141     OSG_SYSTEMLIB_DLLMAPPING 
00142     virtual void    copyToBin  (      BinaryDataHandler &pMem, 
00143                                 const BitVector         &whichField);
00144 
00145     OSG_SYSTEMLIB_DLLMAPPING 
00146     virtual void    copyFromBin(      BinaryDataHandler &pMem, 
00147                                 const BitVector         &whichField);
00148 
00150     /*---------------------------------------------------------------------*/
00154     OSG_SYSTEMLIB_DLLMAPPING 
00155     virtual void changed        (BitVector whichField, UInt32 origin);
00156 
00158     /*---------------------------------------------------------------------*/
00162     OSG_SYSTEMLIB_DLLMAPPING 
00163     virtual void dump(      UInt32    uiIndent = 0, 
00164                       const BitVector bvFlags  = 0) const = 0;
00165     
00167     /*---------------------------------------------------------------------*/
00176     class attempt_to_create_CoredNodePtr_on_non_NodeCore_FC
00177     {
00178         attempt_to_create_CoredNodePtr_on_non_NodeCore_FC() {}
00179     };
00180     
00181     static const bool isNodeCore = false;
00182     
00184     /*=========================  PROTECTED  ===============================*/
00185 
00186   protected:
00187 
00188     /*---------------------------------------------------------------------*/
00192     static FieldContainerType _type;
00193 
00195     /*---------------------------------------------------------------------*/
00199     UInt32 _shares;
00200 
00202     /*---------------------------------------------------------------------*/
00206     OSG_SYSTEMLIB_DLLMAPPING 
00207     FieldContainer(void);
00208 
00209     OSG_SYSTEMLIB_DLLMAPPING 
00210     FieldContainer(const FieldContainer &obj);
00211 
00213     /*---------------------------------------------------------------------*/
00217     OSG_SYSTEMLIB_DLLMAPPING 
00218     virtual ~FieldContainer (void);
00219 
00221     /*---------------------------------------------------------------------*/
00225     template <class ObjectPtrT>
00226     static void newPtr(      
00227                        ObjectPtrT                   &result, 
00228         const typename ObjectPtrT::StoredObjectType *prototypeP);
00229 
00230     template <class ObjectPtrT>
00231     static void newPtr(ObjectPtrT &result);
00232 
00234     /*---------------------------------------------------------------------*/
00238     template<class FieldTypeT>
00239     void beginEditX(const BitVector &whichField, FieldTypeT &field);
00240 
00241     template<class FieldTypeT>
00242     void endEditX  (const BitVector &whichField, FieldTypeT &field);
00243 
00245     /*---------------------------------------------------------------------*/
00249     OSG_SYSTEMLIB_DLLMAPPING 
00250     void onCreate      (const FieldContainer *source = NULL);
00251 
00252     OSG_SYSTEMLIB_DLLMAPPING 
00253     void onCreateAspect(const FieldContainer *aspect0,
00254                         const FieldContainer *source = NULL);
00255 
00257     /*---------------------------------------------------------------------*/
00261     OSG_SYSTEMLIB_DLLMAPPING 
00262     virtual void onDestroy      (void);
00263 
00264 #if defined(OSG_FIXED_MFIELDSYNC)
00265     OSG_SYSTEMLIB_DLLMAPPING 
00266     virtual void onDestroyAspect(UInt32 uiId, UInt32 uiAspect);
00267 #endif
00268 
00270     /*---------------------------------------------------------------------*/
00274 #if !defined(OSG_FIXED_MFIELDSYNC)
00275     OSG_SYSTEMLIB_DLLMAPPING 
00276     virtual void executeSync    (      FieldContainer &other,
00277                                  const BitVector      &whichField) = 0;
00278 
00279             OSG_SYSTEMLIB_DLLMAPPING 
00280             void executeSyncImpl(      FieldContainer *pOther,
00281                                  const BitVector      &whichField);
00282 #else
00283     OSG_SYSTEMLIB_DLLMAPPING 
00284     virtual void executeSync       (      FieldContainer &other,
00285                                     const BitVector      &whichField,
00286                                     const SyncInfo       &iSinfo    ) = 0;
00287 
00288             OSG_SYSTEMLIB_DLLMAPPING 
00289             void executeSyncImpl   (      FieldContainer *pOther,
00290                                     const BitVector      &whichField,
00291                                     const SyncInfo       &sInfo     );
00292 
00293     OSG_SYSTEMLIB_DLLMAPPING 
00294     virtual void execBeginEdit     (const BitVector &whichField, 
00295                                           UInt32     uiAspect,
00296                                           UInt32     uiContainerSize) = 0;
00297 
00298     OSG_SYSTEMLIB_DLLMAPPING 
00299             void execBeginEditImpl (const BitVector &whichField, 
00300                                           UInt32     uiAspect,
00301                                           UInt32     uiContainerSize);
00302 #endif
00303 
00305     /*==========================  PRIVATE  ================================*/
00306 
00307   private:
00308 
00309     friend class FieldContainerPtrBase;
00310     friend class FieldContainerPtr;
00311 
00313     FieldContainer &operator = (const FieldContainer &other);
00314 };
00315 
00316 //---------------------------------------------------------------------------
00317 //   Exported Types
00318 //---------------------------------------------------------------------------
00319 
00320 #define OSG_FC_TMPL_VAR_INL 
00321 
00322 #if 0
00323 #ifdef FMSCOMPILER
00324 
00325 // Macros used to derive a new fieldcontainer
00326 
00332 #define OSG_FC_FIRST_FIELD_IDM_DECL(OSG_FIELDNAME)                            \
00333     static const OSG::UInt32    OSG_FIELDNAME##Id;                            \
00334     static const OSG::BitVector OSG_FIELDNAME##Mask;
00335 
00341 #define OSG_FC_FIRST_FIELD_IDM_DEF(OSG_CLASS, OSG_FIELDNAME)                  \
00342 const OSG::UInt32    OSG_CLASS::OSG_FIELDNAME##Id   =                         \
00343     Inherited::NextFieldId;                                                   \
00344 const OSG::BitVector OSG_CLASS::OSG_FIELDNAME##Mask =                         \
00345     Inherited::NextFieldMask;
00346 
00352 #define OSG_FC_FIRST_FIELD_IDM_INL_TMPL_DEF(OSG_CLASS,                        \
00353                                             OSG_TMPL_PARAM,                   \
00354                                             OSG_FIELDNAME)                    \
00355 template <class OSG_TMPL_PARAM> OSG_FC_TMPL_VAR_INL                           \
00356 const OSG::UInt32    OSG_CLASS<OSG_TMPL_PARAM>::OSG_FIELDNAME##Id    =        \
00357     Inherited::NextFieldId;                                                   \
00358 template <class OSG_TMPL_PARAM> OSG_FC_TMPL_VAR_INL                           \
00359 const OSG::BitVector OSG_CLASS<OSG_TMPL_PARAM>::OSG_FIELDNAME##Mask  =        \
00360     Inherited::NextFieldMask;
00361 
00367 #define OSG_FC_FIELD_IDM_DECL(OSG_FIELDNAME)                                  \
00368     static const OSG::UInt32    OSG_FIELDNAME##Id;                            \
00369     static const OSG::BitVector OSG_FIELDNAME##Mask;
00370 
00376 #define OSG_FC_FIELD_IDM_DEF(OSG_CLASS, OSG_FIELDNAME, OSG_PREV_FIELDNAME)    \
00377 const OSG::UInt32    OSG_CLASS::OSG_FIELDNAME##Id    =                        \
00378     OSG_PREV_FIELDNAME##Id + 1;                                               \
00379 const OSG::BitVector OSG_CLASS::OSG_FIELDNAME##Mask  =                        \
00380     OSG_PREV_FIELDNAME##Mask << 1;
00381 
00387 #define OSG_FC_FIELD_IDM_INL_TMPL_DEF(OSG_CLASS,                              \
00388                                       OSG_TMPL_PARAM,                         \
00389                                       OSG_FIELDNAME,                          \
00390                                       OSG_PREV_FIELDNAME)                     \
00391 template <class OSG_TMPL_PARAM> OSG_FC_TMPL_VAR_INL                           \
00392 const OSG::UInt32    OSG_CLASS<OSG_TMPL_PARAM>::OSG_FIELDNAME##Id    =        \
00393     OSG_PREV_FIELDNAME##Id + 1;                                               \
00394 template <class OSG_TMPL_PARAM> OSG_FC_TMPL_VAR_INL                           \
00395 const OSG::BitVector OSG_CLASS<OSG_TMPL_PARAM>::OSG_FIELDNAME##Mask  =        \
00396     OSG_PREV_FIELDNAME##Mask << 1;
00397 
00402 #define OSG_FC_LAST_FIELD_IDM_DECL                                            \
00403     static const OSG::UInt32    NextFieldId;                                  \
00404     static const OSG::BitVector NextFieldMask;
00405 
00410 #define OSG_FC_LAST_FIELD_IDM_DEF(OSG_CLASS, OSG_PREV_FIELDNAME)              \
00411 const OSG::UInt32    OSG_CLASS::NextFieldId   =                               \
00412     OSG_PREV_FIELDNAME##Id + 1;                                               \
00413 const OSG::BitVector OSG_CLASS::NextFieldMask =                               \
00414     OSG_PREV_FIELDNAME##Mask << 1;
00415 
00420 #define OSG_FC_LAST_FIELD_IDM_INL_TMPL_DEF(OSG_CLASS,                         \
00421                                            OSG_TMPL_PARAM,                    \
00422                                            OSG_PREV_FIELDNAME)                \
00423 template <class OSG_TMPL_PARAM> OSG_FC_TMPL_VAR_INL                           \
00424 const OSG::UInt32    OSG_CLASS<OSG_TMPL_PARAM>::NextFieldId   =               \
00425     OSG_PREV_FIELDNAME##Id + 1;                                               \
00426 template <class OSG_TMPL_PARAM> OSG_FC_TMPL_VAR_INL                           \
00427 const OSG::BitVector OSG_CLASS<OSG_TMPL_PARAM>::NextFieldMask =               \
00428     OSG_PREV_FIELDNAME##Mask << 1;
00429 
00433 #else
00434 #define OSG_FC_FIRST_FIELD_IDM_DECL(OSG_ELEMNAME)                             \
00435   static const OSG::UInt32    OSG_ELEMNAME##Id   = Inherited::NextFieldId;    \
00436   static const OSG::BitVector OSG_ELEMNAME##Mask = Inherited::NextFieldMask;
00437 
00438 #define OSG_FC_FIELD_IDM_DECL(OSG_ELEMNAME, OSG_PREV_ELEMNAME)                \
00439   static const OSG::UInt32    OSG_ELEMNAME##Id   = OSG_PREV_ELEMNAME##Id + 1; \
00440   static const OSG::BitVector OSG_ELEMNAME##Mask = OSG_PREV_ELEMNAME##Mask <<1;
00441 
00442 #define OSG_FC_LAST_FIELD_IDM_DECL(OSG_PREV_ELEMNAME)                         \
00443   static const OSG::UInt32    NextFieldId   = OSG_PREV_ELEMNAME##Id + 1;      \
00444   static const OSG::BitVector NextFieldMask = OSG_PREV_ELEMNAME##Mask << 1;
00445 
00446  
00447 #define OSG_FC_FIRST_FIELD_IDM_DEF(OSG_CLASS, OSG_ELEMNAME)                   \
00448   const OSG::UInt32    OSG_CLASS::OSG_ELEMNAME##Id;                           \
00449   const OSG::BitVector OSG_CLASS::OSG_ELEMNAME##Mask;
00450 
00451 #define OSG_FC_FIRST_FIELD_IDM_INL_TMPL_DEF(OSG_CLASS,                        \
00452                                             OSG_TMPL_PARAM,                   \
00453                                             OSG_ELEMNAME)                     \
00454   template <class OSG_TMPL_PARAM> OSG_FC_TMPL_VAR_INL                         \
00455   const OSG::UInt32    OSG_CLASS<OSG_TMPL_PARAM>::OSG_ELEMNAME##Id;           \
00456   template <class OSG_TMPL_PARAM> OSG_FC_TMPL_VAR_INL                         \
00457   const OSG::BitVector OSG_CLASS<OSG_TMPL_PARAM>::OSG_ELEMNAME##Mask;
00458 
00459 
00460 #define OSG_FC_FIELD_IDM_DEF(OSG_CLASS, OSG_ELEMNAME, OSG_PREV_ELEMNAME)      \
00461   const OSG::UInt32    OSG_CLASS::OSG_ELEMNAME##Id;                           \
00462   const OSG::BitVector OSG_CLASS::OSG_ELEMNAME##Mask;
00463 
00464 #define OSG_FC_FIELD_IDM_INL_TMPL_DEF(OSG_CLASS,                              \
00465                                       OSG_TMPL_PARAM,                         \
00466                                       OSG_ELEMNAME,                           \
00467                                       OSG_PREV_ELEMNAME)                      \
00468   template <class OSG_TMPL_PARAM> OSG_FC_TMPL_VAR_INL                         \
00469   const OSG::UInt32    OSG_CLASS<OSG_TMPL_PARAM>::OSG_ELEMNAME##Id;           \
00470   template <class OSG_TMPL_PARAM> OSG_FC_TMPL_VAR_INL                         \
00471   const OSG::BitVector OSG_CLASS<OSG_TMPL_PARAM>::OSG_ELEMNAME##Mask;
00472 
00473 #define OSG_FC_LAST_FIELD_IDM_DEF(OSG_CLASS, OSG_PREV_ELEMNAME)               \
00474   const OSG::UInt32    OSG_CLASS::NextFieldId;                                \
00475   const OSG::BitVector OSG_CLASS::NextFieldMask;
00476 
00477 #define OSG_FC_LAST_FIELD_IDM_INL_TMPL_DEF(OSG_CLASS,                         \
00478                                            OSG_TMPL_PARAM,                    \
00479                                            OSG_PREV_FIELDNAME)                \
00480   template <class OSG_TMPL_PARAM> OSG_FC_TMPL_VAR_INL                         \
00481   const OSG::UInt32    OSG_CLASS<OSG_TMPL_PARAM>::NextFieldId;                \
00482   template <class OSG_TMPL_PARAM> OSG_FC_TMPL_VAR_INL                         \
00483   const OSG::BitVector OSG_CLASS<OSG_TMPL_PARAM>::NextFieldMask;
00484 
00485 #endif
00486 #endif
00487 
00488 #define OSG_FC_FIRST_FIELD_IDM_DECL(OSG_ELEMNAME)                             \
00489   enum { OSG_ELEMNAME##Id   = Inherited::NextFieldId };                       \
00490   static const OSG::BitVector OSG_ELEMNAME##Mask;
00491 
00492 #define OSG_FC_FIELD_IDM_DECL(OSG_ELEMNAME, OSG_PREV_ELEMNAME)                \
00493   enum { OSG_ELEMNAME##Id   = OSG_PREV_ELEMNAME##Id + 1 };                    \
00494   static const OSG::BitVector OSG_ELEMNAME##Mask;
00495 
00496 #define OSG_FC_LAST_FIELD_IDM_DECL(OSG_PREV_ELEMNAME)                         \
00497   enum { NextFieldId   = OSG_PREV_ELEMNAME##Id + 1 };                         \
00498 
00499  
00500 #define OSG_FC_FIRST_FIELD_IDM_DEF(OSG_CLASS, OSG_ELEMNAME)                   \
00501   const OSG::BitVector OSG_CLASS::OSG_ELEMNAME##Mask =                        \
00502       (TypeTraits<BitVector>::One << OSG_CLASS::OSG_ELEMNAME##Id);
00503 
00504 #define OSG_FC_FIRST_FIELD_IDM_INL_TMPL_DEF(OSG_CLASS,                        \
00505                                             OSG_TMPL_PARAM,                   \
00506                                             OSG_ELEMNAME)                     \
00507   template <class OSG_TMPL_PARAM> OSG_FC_TMPL_VAR_INL                         \
00508   const OSG::BitVector OSG_CLASS<OSG_TMPL_PARAM>::OSG_ELEMNAME##Mask =        \
00509     (TypeTraits<BitVector>::One <<                                \
00510         OSG_CLASS<OSG_TMPL_PARAM>::OSG_ELEMNAME##Id);
00511 
00512 
00513 #define OSG_FC_FIELD_IDM_DEF(OSG_CLASS, OSG_ELEMNAME, OSG_PREV_ELEMNAME)      \
00514   const OSG::BitVector OSG_CLASS::OSG_ELEMNAME##Mask =                        \
00515     (TypeTraits<BitVector>::One << OSG_CLASS::OSG_ELEMNAME##Id);
00516 
00517 #define OSG_FC_FIELD_IDM_INL_TMPL_DEF(OSG_CLASS,                              \
00518                                       OSG_TMPL_PARAM,                         \
00519                                       OSG_ELEMNAME,                           \
00520                                       OSG_PREV_ELEMNAME)                      \
00521   template <class OSG_TMPL_PARAM> OSG_FC_TMPL_VAR_INL                         \
00522   const OSG::BitVector OSG_CLASS<OSG_TMPL_PARAM>::OSG_ELEMNAME##Mask =        \
00523     (TypeTraits<BitVector>::One <<                                \
00524         OSG_CLASS<OSG_TMPL_PARAM>::OSG_ELEMNAME##);
00525 
00526 #define OSG_FC_LAST_FIELD_IDM_DEF(OSG_CLASS, OSG_PREV_ELEMNAME)
00527 
00528 #define OSG_FC_LAST_FIELD_IDM_INL_TMPL_DEF(OSG_CLASS,                         \
00529                                            OSG_TMPL_PARAM,                    \
00530                                            OSG_PREV_FIELDNAME)
00531 
00532 
00533 #define OSG_FC_FIELD_IDM_DESC(OSG_FIELDNAME)                                  \
00534     OSG_FIELDNAME##Id, OSG_FIELDNAME##Mask
00535 
00536 /*---------------------------- get type -------------------------------------*/
00537 
00538 #define OSG_FC_GET_TYPE_DECL                                                  \
00539     virtual       OSG::FieldContainerType &getType(void);                     \
00540     virtual const OSG::FieldContainerType &getType(void) const;
00541 
00542 #define OSG_FC_GET_TYPE_DEF(OSG_CLASS)                                        \
00543     OSG::FieldContainerType &OSG_CLASS::getType(void)                         \
00544     {                                                                         \
00545         return _type;                                                         \
00546     }                                                                         \
00547     const OSG::FieldContainerType &OSG_CLASS::getType(void) const             \
00548     {                                                                         \
00549         return _type;                                                         \
00550     }
00551 
00552 #define OSG_FC_GET_TYPE_INL_TMPL_DEF(OSG_TMPL_PARAM, OSG_CLASS)               \
00553   template <class OSG_TMPL_PARAM> inline                                      \
00554   OSG::FieldContainerType &OSG_CLASS<OSG_TMPL_PARAM>::getType(void)           \
00555   {                                                                           \
00556       return _type;                                                           \
00557   }                                                                           \
00558   template <class OSG_TMPL_PARAM> inline                                      \
00559   const OSG::FieldContainerType &OSG_CLASS<OSG_TMPL_PARAM>::getType(          \
00560       void) const                                                             \
00561   {                                                                           \
00562       return _type;                                                           \
00563   }
00564 
00565 
00566 #define OSG_FC_GET_STATIC_TYPE_DECL                                           \
00567     static OSG::FieldContainerType & getClassType(void);           
00568 
00569 #define OSG_FC_GET_STATIC_TYPE_INL_DEF(OSG_CLASS)                             \
00570     inline                                                                    \
00571     OSG::FieldContainerType &OSG_CLASS::getClassType(void)                    \
00572     {                                                                         \
00573         return _type;                                                         \
00574     }
00575 
00576 #define OSG_FC_GET_STATIC_TYPE_INL_TMPL_DEF(OSG_TMPL_PARAM,                   \
00577                                             OSG_CLASS)                        \
00578     template <class OSG_TMPL_PARAM> inline                                    \
00579     OSG::FieldContainerType &OSG_CLASS<OSG_TMPL_PARAM>::getClassType(void)    \
00580     {                                                                         \
00581         return _type;                                                         \
00582     }
00583 
00584 #define OSG_FC_GET_STATIC_TYPE_ID_DECL                                        \
00585     static OSG::UInt32 getClassTypeId(void);             
00586 
00587 #define OSG_FC_GET_STATIC_TYPE_ID_INL_DEF(OSG_CLASS)                          \
00588     inline                                                                    \
00589     OSG::UInt32 OSG_CLASS::getClassTypeId(void)                               \
00590     {                                                                         \
00591         return _type.getId();                                                 \
00592     }
00593 
00594 #define OSG_FC_GET_STATIC_TYPE_ID_INL_TMPL_DEF(OSG_TMPL_PARAM,                \
00595                                                OSG_CLASS)                     \
00596     template <class OSG_TMPL_PARAM> inline                                    \
00597     OSG::UInt32 OSG_CLASS<OSG_TMPL_PARAM>::getClassTypeId(void)               \
00598     {                                                                         \
00599         return _type.getId();                                                 \
00600     }
00601 
00602 #define OSG_FC_TYPE_FUNCTIONS_DECL                                            \
00603     OSG_FC_GET_TYPE_DECL                                                      \
00604     OSG_FC_GET_STATIC_TYPE_DECL                                               \
00605     OSG_FC_GET_STATIC_TYPE_ID_DECL                     
00606 
00607 #define OSG_FC_TYPE_FUNCTIONS_DEF(OSG_CLASS)                                  \
00608     OSG_FC_GET_TYPE_DEF(OSG_CLASS)
00609 
00610 #define OSG_FC_TYPE_FUNCTIONS_INL_DEF(OSG_CLASS)                              \
00611     OSG_FC_GET_STATIC_TYPE_INL_DEF   (OSG_CLASS)                              \
00612     OSG_FC_GET_STATIC_TYPE_ID_INL_DEF(OSG_CLASS)
00613 
00614 
00615 #define OSG_FC_TYPE_FUNCTIONS_INL_TMPL_DEF(OSG_TMPL_PARAM, OSG_CLASS)         \
00616     OSG_FC_GET_TYPE_INL_TMPL_DEF          (OSG_TMPL_PARAM, OSG_CLASS)         \
00617     OSG_FC_GET_STATIC_TYPE_INL_TMPL_DEF   (OSG_TMPL_PARAM, OSG_CLASS)         \
00618     OSG_FC_GET_STATIC_TYPE_ID_INL_TMPL_DEF(OSG_TMPL_PARAM, OSG_CLASS)
00619 
00620 #define OSG_FC_ST_TYPE_FUNCTIONS_INL_TMPL_DEF(OSG_TMPL_PARAM, OSG_CLASS)      \
00621     OSG_FC_GET_STATIC_TYPE_INL_TMPL_DEF   (OSG_TMPL_PARAM, OSG_CLASS)         \
00622     OSG_FC_GET_STATIC_TYPE_ID_INL_TMPL_DEF(OSG_TMPL_PARAM, OSG_CLASS)
00623 
00624 
00625 /*---------------------------- create ---------------------------------------*/
00626 
00627 #define OSG_FC_CREATE_DECL(OSG_CLASS_PTR)                                     \
00628     static OSG_CLASS_PTR create(void);
00629 
00630 #define OSG_FC_CREATE_INL_DEF(OSG_CLASS, OSG_CLASS_PTR)                       \
00631     inline                                                                    \
00632     OSG_CLASS_PTR OSG_CLASS::create(void)                                     \
00633     {                                                                         \
00634         OSG_CLASS_PTR fc;                                                     \
00635                                                                               \
00636         if(getClassType().getPrototype() != OSG::NullFC)                      \
00637          fc = OSG_CLASS_PTR::dcast(getClassType().getPrototype()->            \
00638                  shallowCopy());                                              \
00639                                                                               \
00640         return fc;                                                            \
00641     }
00642 
00643 #define OSG_FC_CREATE_INL_TMPL_DEF(OSG_TMPL_PARAM,                            \
00644                                    OSG_CLASS,                                 \
00645                                    OSG_CLASS_PTR)                             \
00646     template <class OSG_TMPL_PARAM> inline                                    \
00647     typename OSG_CLASS<OSG_TMPL_PARAM>::OSG_CLASS_PTR                         \
00648         OSG_CLASS<OSG_TMPL_PARAM>::create(void)                               \
00649     {                                                                         \
00650         OSG_CLASS_PTR fc;                                                     \
00651                                                                               \
00652         if(getClassType().getPrototype() != OSG::NullFC)                      \
00653          fc = OSG_CLASS_PTR::dcast(getClassType().getPrototype()->            \
00654                   shallowCopy());                                             \
00655                                                                               \
00656         return fc;                                                            \
00657     }
00658 
00659 #define OSG_FC_CREATE_EMPTY_DECL(OSG_CLASS_PTR)                         \
00660     static OSG_CLASS_PTR createEmpty(void);
00661 
00662 #define OSG_FC_CREATE_EMPTY_INL_DEF(OSG_CLASS, OSG_CLASS_PTR)           \
00663     inline                                                              \
00664     OSG_CLASS_PTR OSG_CLASS::createEmpty(void)                          \
00665     {                                                                   \
00666         OSG_CLASS_PTR returnValue;                                      \
00667                                                                         \
00668         newPtr(returnValue);                                            \
00669                                                                         \
00670         return returnValue;                                             \
00671     }
00672 
00673 #define OSG_FC_CREATE_EMPTY_INL_TMPL_DEF(OSG_TMPL_PARAM,                \
00674                                          OSG_CLASS,                     \
00675                                          OSG_CLASS_PTR)                 \
00676     template <class OSG_TMPL_PARAM> inline                              \
00677     typename OSG_CLASS<OSG_TMPL_PARAM>::OSG_CLASS_PTR                   \
00678         OSG_CLASS<OSG_TMPL_PARAM>::createEmpty(void)                    \
00679     {                                                                   \
00680         OSG_CLASS_PTR returnValue;                                      \
00681                                                                         \
00682         Self::newPtr(returnValue);                                      \
00683                                                                         \
00684         return returnValue;                                             \
00685     }
00686 
00687 
00688 #define OSG_FC_SHALLOWCOPY_DECL                                         \
00689     virtual OSG::FieldContainerPtr shallowCopy(void) const;
00690 
00691 #define OSG_FC_SHALLOWCOPY_DEF(OSG_CLASS, OSG_CLASS_PTR)                \
00692     OSG::FieldContainerPtr OSG_CLASS::shallowCopy(void) const           \
00693     {                                                                   \
00694         OSG_CLASS_PTR returnValue;                                      \
00695                                                                         \
00696         newPtr(returnValue, this);                                      \
00697                                                                         \
00698         return returnValue;                                             \
00699     } 
00700 
00701 #define OSG_FC_SHALLOWCOPY_INL_TMPL_DEF(OSG_TMPL_PARAM,                       \
00702                                         OSG_CLASS,                            \
00703                                         OSG_CLASS_PTR)                        \
00704     template <class OSG_TMPL_PARAM> inline                                    \
00705     OSG::FieldContainerPtr OSG_CLASS<OSG_TMPL_PARAM>::shallowCopy(void) const \
00706     {                                                                         \
00707         OSG_CLASS_PTR returnValue;                                            \
00708                                                                               \
00709         Self::newPtr(returnValue, this);                                      \
00710                                                                               \
00711         return returnValue;                                                   \
00712     } 
00713 
00714 
00715 #define OSG_FC_CREATE_FUNCTIONS_DECL(OSG_CLASS_PTR)                     \
00716     OSG_FC_CREATE_DECL      (OSG_CLASS_PTR)                             \
00717     OSG_FC_CREATE_EMPTY_DECL(OSG_CLASS_PTR)                             \
00718     OSG_FC_SHALLOWCOPY_DECL
00719 
00720 #define OSG_FC_CREATE_FUNCTIONS_DEF(OSG_CLASS, OSG_CLASS_PTR)           \
00721     OSG_FC_SHALLOWCOPY_DEF(OSG_CLASS, OSG_CLASS_PTR)
00722 
00723 #define OSG_FC_CREATE_FUNCTIONS_INL_DEF(OSG_CLASS, OSG_CLASS_PTR)       \
00724     OSG_FC_CREATE_INL_DEF      (OSG_CLASS, OSG_CLASS_PTR)               \
00725     OSG_FC_CREATE_EMPTY_INL_DEF(OSG_CLASS, OSG_CLASS_PTR)
00726 
00727 #define OSG_FC_CREATE_FUNCTIONS_INL_TMPL_DEF(OSG_TMPL_PARAM,            \
00728                                              OSG_CLASS,                 \
00729                                              OSG_CLASS_PTR)             \
00730     OSG_FC_SHALLOWCOPY_INL_TMPL_DEF       (OSG_TMPL_PARAM,              \
00731                                      OSG_CLASS,                         \
00732                                      OSG_CLASS_PTR)                     \
00733     OSG_FC_CREATE_INL_TMPL_DEF      (OSG_TMPL_PARAM,                    \
00734                                      OSG_CLASS,                         \
00735                                      OSG_CLASS_PTR)                     \
00736     OSG_FC_CREATE_EMPTY_INL_TMPL_DEF(OSG_TMPL_PARAM,                    \
00737                                      OSG_CLASS,                         \
00738                                      OSG_CLASS_PTR)
00739 
00740 /*-------------------------- get size ---------------------------------------*/
00741 
00742 
00743 #define OSG_FC_GET_SIZE_DECL                                           \
00744     virtual OSG::UInt32 getContainerSize(void) const;
00745 
00746 #define OSG_FC_GET_SIZE_DEF(OSG_CLASS)                                 \
00747     OSG::UInt32 OSG_CLASS::getContainerSize(void) const                \
00748     {                                                                  \
00749         return sizeof(OSG_CLASS);                                      \
00750     }
00751 
00752 #define OSG_FC_GET_SIZE_INL_TMPL_DEF(OSG_TMPL_PARAM, OSG_CLASS)         \
00753     template <class OSG_TMPL_PARAM> inline                              \
00754     OSG::UInt32 OSG_CLASS<OSG_TMPL_PARAM>::getContainerSize(void) const \
00755     {                                                                   \
00756         return sizeof(OSG_CLASS);                                       \
00757     }
00758 
00759 #define OSG_FC_SIZE_FUNCTIONS_DECL                                     \
00760     OSG_FC_GET_SIZE_DECL
00761 
00762 #define OSG_FC_SIZE_FUNCTIONS_DEF(OSG_CLASS)                           \
00763     OSG_FC_GET_SIZE_DEF(OSG_CLASS)
00764 
00765 #define OSG_FC_SIZE_FUNCTIONS_INL_TMPL_DEF(OSG_TMPL_PARAM, OSG_CLASS)  \
00766     OSG_FC_GET_SIZE_INL_TMPL_DEF(OSG_TMPL_PARAM, OSG_CLASS)
00767 
00768 
00769 /*------------------------ decl and def macros ------------------------------*/
00770 
00771 #define OSG_FIELD_CONTAINER_DECL(OSG_CLASS_PTR)               \
00772     OSG_FC_TYPE_FUNCTIONS_DECL                                \
00773     OSG_FC_CREATE_FUNCTIONS_DECL(OSG_CLASS_PTR)               \
00774     OSG_FC_SIZE_FUNCTIONS_DECL
00775 
00776 #define OSG_FIELD_CONTAINER_DEF(OSG_CLASS, OSG_CLASS_PTR)     \
00777     OSG_FC_TYPE_FUNCTIONS_DEF  (OSG_CLASS)                    \
00778     OSG_FC_CREATE_FUNCTIONS_DEF(OSG_CLASS, OSG_CLASS_PTR)     \
00779     OSG_FC_SIZE_FUNCTIONS_DEF  (OSG_CLASS)
00780 
00781 #define OSG_FIELD_CONTAINER_INL_DEF(OSG_CLASS, OSG_CLASS_PTR) \
00782     OSG_FC_TYPE_FUNCTIONS_INL_DEF  (OSG_CLASS)                \
00783     OSG_FC_CREATE_FUNCTIONS_INL_DEF(OSG_CLASS, OSG_CLASS_PTR)
00784 
00785 /*--------------------- abstr decl and def macros --------------------------*/
00786 
00787 #define OSG_ABSTR_FIELD_CONTAINER_DECL(OSG_CLASS_PTR)               \
00788     OSG_FC_TYPE_FUNCTIONS_DECL                                      \
00789     OSG_FC_SIZE_FUNCTIONS_DECL
00790 
00791 #define OSG_ABSTR_FIELD_CONTAINER_DEF(OSG_CLASS, OSG_CLASS_PTR)     \
00792     OSG_FC_TYPE_FUNCTIONS_DEF  (OSG_CLASS)                          \
00793     OSG_FC_SIZE_FUNCTIONS_DEF  (OSG_CLASS)
00794 
00795 #define OSG_ABSTR_FIELD_CONTAINER_INL_DEF(OSG_CLASS, OSG_CLASS_PTR) \
00796     OSG_FC_TYPE_FUNCTIONS_INL_DEF  (OSG_CLASS)
00797 
00798 /*------------------ template decl and def macros --------------------------*/
00799 
00800 #define OSG_FIELD_CONTAINER_TMPL_DECL(OSG_CLASS_PTR)                 \
00801     OSG_FC_TYPE_FUNCTIONS_DECL                                       \
00802     OSG_FC_CREATE_FUNCTIONS_DECL(OSG_CLASS_PTR)                      \
00803     OSG_FC_SIZE_FUNCTIONS_DECL
00804 
00805 #ifdef WIN32
00806 #define OSG_FIELD_CONTAINER_INL_TMPL_DEF(OSG_CLASS,                  \
00807                                          OSG_TMPL_PARAM,             \
00808                                          OSG_CLASS_PTR)              \
00809     OSG_FC_SIZE_FUNCTIONS_INL_TMPL_DEF  (OSG_TMPL_PARAM, OSG_CLASS)  \
00810     OSG_FC_CREATE_FUNCTIONS_INL_TMPL_DEF(OSG_TMPL_PARAM,             \
00811                                          OSG_CLASS,                  \
00812                                          OSG_CLASS_PTR)
00813 #else
00814 #define OSG_FIELD_CONTAINER_INL_TMPL_DEF(OSG_CLASS,                  \
00815                                          OSG_TMPL_PARAM,             \
00816                                          OSG_CLASS_PTR)              \
00817     OSG_FC_TYPE_FUNCTIONS_INL_TMPL_DEF  (OSG_TMPL_PARAM, OSG_CLASS)  \
00818     OSG_FC_SIZE_FUNCTIONS_INL_TMPL_DEF  (OSG_TMPL_PARAM, OSG_CLASS)  \
00819     OSG_FC_CREATE_FUNCTIONS_INL_TMPL_DEF(OSG_TMPL_PARAM,             \
00820                                          OSG_CLASS,                  \
00821                                          OSG_CLASS_PTR)
00822 #endif
00823 
00824 
00825 #ifdef WIN32
00826 #define OSG_FIELD_CONTAINER_ST_INL_TMPL_DEF(OSG_CLASS,                  \
00827                                             OSG_TMPL_PARAM,             \
00828                                             OSG_CLASS_PTR)              \
00829     OSG_FC_SIZE_FUNCTIONS_INL_TMPL_DEF     (OSG_TMPL_PARAM, OSG_CLASS)  \
00830     OSG_FC_CREATE_FUNCTIONS_INL_TMPL_DEF   (OSG_TMPL_PARAM,             \
00831                                             OSG_CLASS,                  \
00832                                             OSG_CLASS_PTR)
00833 #else
00834 #define OSG_FIELD_CONTAINER_ST_INL_TMPL_DEF(OSG_CLASS,                  \
00835                                             OSG_TMPL_PARAM,             \
00836                                             OSG_CLASS_PTR)              \
00837     OSG_FC_ST_TYPE_FUNCTIONS_INL_TMPL_DEF  (OSG_TMPL_PARAM, OSG_CLASS)  \
00838     OSG_FC_SIZE_FUNCTIONS_INL_TMPL_DEF     (OSG_TMPL_PARAM, OSG_CLASS)  \
00839     OSG_FC_CREATE_FUNCTIONS_INL_TMPL_DEF   (OSG_TMPL_PARAM,             \
00840                                             OSG_CLASS,                  \
00841                                             OSG_CLASS_PTR)
00842 #endif
00843 
00844 /*---------------abstr template decl and def macros ------------------------*/
00845 
00846 #define OSG_ABSTR_FIELD_CONTAINER_TMPL_DECL(OSG_CLASS_PTR)           \
00847     OSG_FC_TYPE_FUNCTIONS_DECL                                       \
00848     OSG_FC_SIZE_FUNCTIONS_DECL
00849 
00850 #define OSG_ABSTR_FIELD_CONTAINER_INL_TMPL_DEF(OSG_CLASS,            \
00851                                                OSG_TMPL_PARAM,       \
00852                                                OSG_CLASS_PTR)        \
00853     OSG_FC_TYPE_FUNCTIONS_INL_TMPL_DEF  (OSG_TMPL_PARAM, OSG_CLASS)  \
00854     OSG_FC_SIZE_FUNCTIONS_INL_TMPL_DEF  (OSG_TMPL_PARAM, OSG_CLASS)
00855 
00856 
00857 /*--------------experimental--------------*/
00858 /* macros for standard field access functions */
00859 
00860 #define OSG_SFIELD_ACCESS_FUNCTIONS_DECL( OSG_FIELDTYPE, OSG_TYPE,      \
00861         OSG_NAME )                                                      \
00862     inline OSG_FIELDTYPE * getSF##OSG_NAME( void );                         \
00863     inline OSG_TYPE get##OSG_NAME( void );                                  \
00864     inline OSG_TYPE get##OSG_NAME( void ) const;                        \
00865     inline void set##OSG_NAME( const OSG_TYPE value );
00866 
00867 
00868 #define OSG_SFIELD_ACCESS_FUNCTIONS_INL( OSG_CLASS, OSG_FIELDTYPE,      \
00869         OSG_TYPE, OSG_NAME )                                            \
00870     inline OSG_FIELDTYPE * OSG_CLASS::getSF##OSG_NAME( void )           \
00871     {                                                                   \
00872         return &_##OSG_NAME;                                            \
00873     }                                                                   \
00874     inline OSG_TYPE OSG_CLASS::get##OSG_NAME(void)                      \
00875     {                                                                   \
00876         return _##OSG_NAME.getValue();                                  \
00877     }                                                                   \
00878     inline OSG_TYPE OSG_CLASS::get##OSG_NAME(void) const                \
00879     {                                                                   \
00880         return _##OSG_NAME.getValue();                                  \
00881     }                                                                   \
00882     inline void OSG_CLASS::set##OSG_NAME( const OSG_TYPE val)           \
00883     {                                                                   \
00884         _##OSG_NAME.setValue( val );                                    \
00885     }                                                                   
00886 
00887 OSG_END_NAMESPACE
00888 
00889 #define OSGFIELDCONTAINER_HEADER_CVSID "@(#)$Id: $"
00890 
00891 #endif /* _OSGFIELDCONTAINERIMPL_H_ */

Generated on Thu Aug 25 04:04:46 2005 for OpenSG by  doxygen 1.4.3