00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
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
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
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
00306
00307 private:
00308
00309 friend class FieldContainerPtrBase;
00310 friend class FieldContainerPtr;
00311
00313 FieldContainer &operator = (const FieldContainer &other);
00314 };
00315
00316
00317
00318
00319
00320 #define OSG_FC_TMPL_VAR_INL
00321
00322 #if 0
00323 #ifdef FMSCOMPILER
00324
00325
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
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
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
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
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
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
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
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
00858
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