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

OSGMField.inl

Go to the documentation of this file.
00001 /*---------------------------------------------------------------------------*\
00002  *                                OpenSG                                     *
00003  *                                                                           *
00004  *                                                                           *
00005  *                 Copyright (C) 2000 by the OpenSG Forum                    *
00006  *                                                                           *
00007  *                            www.opensg.org                                 *
00008  *                                                                           *
00009  *   contact: dirk@opensg.org, gerrit.voss@vossg.org, jbehr@zgdv.de          *
00010  *                                                                           *
00011 \*---------------------------------------------------------------------------*/
00012 /*---------------------------------------------------------------------------*\
00013  *                                License                                    *
00014  *                                                                           *
00015  * This library is free software; you can redistribute it and/or modify it   *
00016  * under the terms of the GNU Library General Public License as published    *
00017  * by the Free Software Foundation, version 2.                               *
00018  *                                                                           *
00019  * This library is distributed in the hope that it will be useful, but       *
00020  * WITHOUT ANY WARRANTY; without even the implied warranty of                *
00021  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU         *
00022  * Library General Public License for more details.                          *
00023  *                                                                           *
00024  * You should have received a copy of the GNU Library General Public         *
00025  * License along with this library; if not, write to the Free Software       *
00026  * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.                 *
00027  *                                                                           *
00028 \*---------------------------------------------------------------------------*/
00029 /*---------------------------------------------------------------------------*\
00030  *                                Changes                                    *
00031  *                                                                           *
00032  *                                                                           *
00033  *                                                                           *
00034  *                                                                           *
00035  *                                                                           *
00036  *                                                                           *
00037 \*---------------------------------------------------------------------------*/
00038 
00039 //---------------------------------------------------------------------------
00040 //  Includes
00041 //---------------------------------------------------------------------------
00042 
00043 #include <algorithm>
00044 
00045 OSG_BEGIN_NAMESPACE
00046 
00047 #ifndef STD
00048 #define STD std
00049 #endif
00050 
00051 /*-------------------------------------------------------------------------*/
00052 /*                            Class Get                                    */
00053 
00054 #ifndef WIN32
00055 template <class FieldTypeT, Int32 fieldNameSpace> inline
00056 const FieldType &MField<FieldTypeT, fieldNameSpace>::getClassType(void)
00057 {
00058     return _fieldType;
00059 }
00060 #endif
00061 
00062 /*-------------------------------------------------------------------------*/
00063 /*                            Constructors                                 */
00064 
00065 template <class FieldTypeT, Int32 fieldNameSpace> inline
00066 MField<FieldTypeT, fieldNameSpace>::MField(void) :
00067      Inherited   ( ),
00068     _values      ( ),
00069     _uiSharedWith(0)
00070 {
00071 }
00072 
00073 template <class FieldTypeT, Int32 fieldNameSpace> inline
00074 MField<FieldTypeT, fieldNameSpace>::MField(const MField &obj) :
00075      Inherited   (obj        ),
00076     _values      (obj._values),
00077     _uiSharedWith(          0)
00078 {
00079 }
00080 
00081 template <class FieldTypeT, Int32 fieldNameSpace> inline
00082 MField<FieldTypeT, fieldNameSpace>::MField(const UInt32 size) :
00083      Inherited   ( ),
00084     _values      ( ),
00085     _uiSharedWith(0)
00086 {
00087     _values.resize(size);
00088 }
00089 
00090 /*-------------------------------------------------------------------------*/
00091 /*                             Destructor                                  */
00092 
00093 template <class FieldTypeT, Int32 fieldNameSpace> inline
00094 MField<FieldTypeT, fieldNameSpace>::~MField(void)
00095 {
00096 }
00097 
00098 /*-------------------------------------------------------------------------*/
00099 /*                               Get                                       */
00100 
00104 template <class FieldTypeT, Int32 fieldNameSpace> inline
00105 typename MField<FieldTypeT, fieldNameSpace>::StorageType &
00106     MField<FieldTypeT, fieldNameSpace>::getValues(void)
00107 {
00108     return _values;
00109 }
00110 
00114 template <class FieldTypeT, Int32 fieldNameSpace> inline
00115 const typename MField<FieldTypeT, fieldNameSpace>::StorageType &
00116     MField<FieldTypeT, fieldNameSpace>::getValues(void) const
00117 {
00118     return _values;
00119 }
00120 
00121 #ifndef WIN32
00122 template <class FieldTypeT, Int32 fieldNameSpace> inline
00123 const FieldType &MField<FieldTypeT, fieldNameSpace>::getType(void) const
00124 {
00125     return _fieldType;
00126 }
00127 #endif
00128 
00129 template <class FieldTypeT, Int32 fieldNameSpace> inline
00130 bool MField<FieldTypeT, fieldNameSpace>::isEmpty(void) const
00131 {
00132     return empty();
00133 }
00134 
00135 template <class FieldTypeT, Int32 fieldNameSpace> inline
00136 void MField<FieldTypeT, fieldNameSpace>::operator =(const MField &source)
00137 {
00138     if(this == &source)
00139        return;
00140 
00141     _values = source._values;
00142 }
00143 
00144 /*-------------------------------------------------------------------------*/
00145 /*                                Set                                      */
00146 
00151 template <class FieldTypeT, Int32 fieldNameSpace> inline
00152 void MField<FieldTypeT, fieldNameSpace>::setAbstrValue(const Field &obj)
00153 {
00154     if(getType() == obj.getType())
00155     {
00156         setValues(*((const MField<FieldTypeT, fieldNameSpace> *) &obj));
00157     }
00158 }
00159 
00160 template <class FieldTypeT, Int32 fieldNameSpace> inline
00161 void MField<FieldTypeT, fieldNameSpace>::setValues(const StorageType &value)
00162 {
00163     _values = value;
00164 }
00165 
00166 template <class FieldTypeT, Int32 fieldNameSpace> inline
00167 void MField<FieldTypeT, fieldNameSpace>::setValues(
00168     const StorageTypeParent &value)
00169 {
00170     // Hack probably move it to MFieldVector (GV)
00171 
00172     *(static_cast<StorageTypeParent *>(&_values)) = value;
00173 }
00174 
00175 template <class FieldTypeT, Int32 fieldNameSpace> inline
00176 void MField<FieldTypeT, fieldNameSpace>::setValues(const Self &obj)
00177 {
00178     _values = obj._values;
00179 }
00180 
00181 /*-------------------------------------------------------------------------*/
00182 /*                             STL Interface                               */
00183 
00184 template <class FieldTypeT, Int32 fieldNameSpace> inline
00185 typename MField<FieldTypeT, 
00186                 fieldNameSpace>::iterator MField<FieldTypeT, 
00187                                                  fieldNameSpace>::begin (void)
00188 {
00189     return _values.begin();
00190 }
00191 
00192 template <class FieldTypeT, Int32 fieldNameSpace> inline
00193 typename MField<FieldTypeT, 
00194                 fieldNameSpace>::iterator MField<FieldTypeT, 
00195                                                  fieldNameSpace>::end(void)
00196 {
00197     return _values.end();
00198 }
00199 
00200 template <class FieldTypeT, Int32 fieldNameSpace> inline
00201 typename MField<FieldTypeT, 
00202                 fieldNameSpace>::reverse_iterator 
00203     MField<FieldTypeT, 
00204            fieldNameSpace>::rbegin(void)
00205 {
00206     return _values.rbegin();
00207 }
00208 
00209 template <class FieldTypeT, Int32 fieldNameSpace> inline
00210 typename MField<FieldTypeT, 
00211                 fieldNameSpace>::reverse_iterator 
00212     MField<FieldTypeT, 
00213            fieldNameSpace>::rend(void)
00214 {
00215     return _values.rend();
00216 }
00217 
00218 template <class FieldTypeT, Int32 fieldNameSpace> inline
00219 typename MField<FieldTypeT, 
00220                 fieldNameSpace>::const_iterator MField<FieldTypeT, 
00221                                                        fieldNameSpace>::begin(
00222                                                            void) const
00223 {
00224     return _values.begin();
00225 }
00226 
00227 template <class FieldTypeT, Int32 fieldNameSpace> inline
00228 typename MField<FieldTypeT, 
00229                 fieldNameSpace>::const_iterator MField<FieldTypeT,
00230                                                        fieldNameSpace>::end(
00231                                                            void) const
00232 {
00233     return _values.end();
00234 }
00235 
00236 template <class FieldTypeT, Int32 fieldNameSpace> inline
00237 typename MField<FieldTypeT,
00238                 fieldNameSpace>::const_reverse_iterator 
00239     MField<FieldTypeT, 
00240            fieldNameSpace>::rbegin(void) const
00241 {
00242     return _values.rbegin();
00243 }
00244 
00245 template <class FieldTypeT, Int32 fieldNameSpace> inline
00246 typename MField<FieldTypeT, 
00247                 fieldNameSpace>::const_reverse_iterator 
00248     MField<FieldTypeT, 
00249            fieldNameSpace>::rend(void) const
00250 {
00251     return _values.rend();
00252 }
00253 
00254 template <class FieldTypeT, Int32 fieldNameSpace> inline
00255 typename MField<FieldTypeT, 
00256                 fieldNameSpace>::reference MField<FieldTypeT, 
00257                                                   fieldNameSpace>::front(void)
00258 {
00259     return _values.front();
00260 }
00261 
00262 template <class FieldTypeT, Int32 fieldNameSpace> inline
00263 typename MField<FieldTypeT, 
00264                 fieldNameSpace>::const_reference MField<FieldTypeT, 
00265                                                         fieldNameSpace>::front(
00266                                                             void) const
00267 {
00268     return _values.front();
00269 }
00270 
00271 template <class FieldTypeT, Int32 fieldNameSpace> inline
00272 typename MField<FieldTypeT, 
00273                 fieldNameSpace>::reference MField<FieldTypeT, 
00274                                                   fieldNameSpace>::back(void)
00275 {
00276     return _values.back();
00277 }
00278 
00279 template <class FieldTypeT, Int32 fieldNameSpace> inline
00280 typename MField<FieldTypeT, 
00281                 fieldNameSpace>::const_reference MField<FieldTypeT, 
00282                                                         fieldNameSpace>::back(
00283                                                             void) const
00284 {
00285     return _values.back();
00286 }
00287 
00288 template <class FieldTypeT, Int32 fieldNameSpace> inline
00289 void MField<FieldTypeT, fieldNameSpace>::clear(void)
00290 {
00291     _values.clear();
00292 }
00293 
00294 template <class FieldTypeT, Int32 fieldNameSpace> inline
00295 typename MField<FieldTypeT, 
00296                 fieldNameSpace>::iterator MField<FieldTypeT, 
00297                                                  fieldNameSpace>::insert(
00298     iterator pos, ArgumentType value)
00299 {
00300     return _values.insert(pos, value);
00301 }
00302 
00303 template <class FieldTypeT, Int32 fieldNameSpace> inline
00304 typename MField<FieldTypeT, 
00305                 fieldNameSpace>::iterator MField<FieldTypeT, 
00306                                                  fieldNameSpace>::erase(
00307                                                      iterator pos)
00308 {
00309     return _values.erase(pos);
00310 }
00311 
00312 template <class FieldTypeT, Int32 fieldNameSpace> inline
00313 typename MField<FieldTypeT, 
00314                 fieldNameSpace>::iterator MField<FieldTypeT, 
00315                                                  fieldNameSpace>::find(
00316     ArgumentType value)
00317 {
00318     return STD::find(_values.begin(), _values.end(), value);
00319 }
00320 
00321 template <class FieldTypeT, Int32 fieldNameSpace> inline
00322 typename MField<FieldTypeT, 
00323                 fieldNameSpace>::const_iterator MField<FieldTypeT, 
00324                                                        fieldNameSpace>::find(
00325     ArgumentType value) const
00326 {
00327     return STD::find(_values.begin(), _values.end(), value);
00328 }
00329 
00330 template <class FieldTypeT, Int32 fieldNameSpace> inline
00331 void MField<FieldTypeT, fieldNameSpace>::push_back(ArgumentType value)
00332 {
00333     _values.push_back(value);
00334 }
00335 
00336 template <class FieldTypeT, Int32 fieldNameSpace> inline
00337 void MField<FieldTypeT, fieldNameSpace>::resize(size_t newsize, FieldTypeT t)
00338 {
00339     _values.resize(newsize, t);
00340 }
00341 
00342 template <class FieldTypeT, Int32 fieldNameSpace> inline
00343 void MField<FieldTypeT, fieldNameSpace>::reserve(size_t newsize)
00344 {
00345     _values.reserve(newsize);
00346 }
00347 
00348 template <class FieldTypeT, Int32 fieldNameSpace> inline
00349 UInt32 MField<FieldTypeT, fieldNameSpace>::size(void) const
00350 {
00351     return _values.size();
00352 }
00353 
00354 template <class FieldTypeT, Int32 fieldNameSpace> inline
00355 UInt32 MField<FieldTypeT, fieldNameSpace>::capacity(void) const
00356 {
00357     return _values.capacity();
00358 }
00359 
00360 template <class FieldTypeT, Int32 fieldNameSpace> inline
00361 bool MField<FieldTypeT, fieldNameSpace>::empty(void) const
00362 {
00363     return _values.empty();
00364 }
00365 
00366 /*-------------------------------------------------------------------------*/
00367 /*                           String IO                                     */
00368 
00369 template <class FieldTypeT, Int32 fieldNameSpace> inline
00370 void MField<FieldTypeT, fieldNameSpace>::pushValueByStr(const Char8 *str)
00371 {
00372     FieldTypeT  tmpVal;
00373 
00374     typedef typename osgIF< (MFieldTraits::StringConvertable &
00375                              FieldTraits ::FromStringConvertable), 
00376                             MFieldTraits, 
00377                             ErrorFromToString<FieldTypeT> >::_IRet Converter;
00378     
00379     Converter::getFromString(tmpVal, str);
00380     
00381     push_back(tmpVal);
00382 }
00383 
00384 template <class FieldTypeT, Int32 fieldNameSpace> inline
00385 std::string &MField<FieldTypeT, 
00386                     fieldNameSpace>::getValueByStr(std::string &str) const
00387 {
00388     std::string tmpString;
00389 
00390     typedef typename osgIF< (MFieldTraits::StringConvertable &
00391                              FieldTraits ::ToStringConvertable),
00392                             MFieldTraits,
00393                             ErrorFromToString<FieldTypeT> >::_IRet Converter;
00394 
00395     for(UInt32 i = 0; i < size(); ++i)
00396     {
00397         Converter::putToString(_values[i], tmpString);
00398 
00399         str.append(tmpString);
00400 
00401         if(i < (size()-1))
00402         {
00403             str.append(", ");
00404         }
00405     }
00406 
00407     return str;
00408 }
00409 
00410 template <class FieldTypeT, Int32 fieldNameSpace> inline
00411 std::string &MField<FieldTypeT, 
00412                     fieldNameSpace>::getValueByStr(
00413                         std::string               &outStr,
00414                         StringConversionStateBase &state) const
00415 {
00416     std::string valStr;
00417 
00418     typedef typename osgIF< (MFieldTraits::StringConvertable &
00419                              FieldTraits ::ToStringConvertable),
00420                             MFieldTraits,
00421                             ErrorFromToString<FieldTypeT> >::_IRet Converter;
00422 
00423     state.beginField(this, outStr);
00424 
00425     for(UInt32 i = 0; i < size(); ++i)
00426     {
00427         valStr.erase();
00428         Converter::putToString(_values[i], valStr);
00429 
00430         state.addValueStr(valStr, outStr);
00431     }
00432 
00433     state.endField(this, outStr);
00434     
00435     return outStr;
00436 }
00437 
00438 template <class FieldTypeT, Int32 fieldNameSpace> inline
00439 std::string &MField<FieldTypeT,
00440                     fieldNameSpace>::getValueByStr(
00441                         std::string &str, 
00442                         UInt32       index) const
00443 {
00444     if(index >= size())
00445     {
00446         return str;
00447     }
00448 
00449     std::string tmpString;
00450 
00451     typedef typename osgIF< (MFieldTraits::StringConvertable &
00452                              FieldTraits::ToStringConvertable),
00453                             MFieldTraits,
00454                             ErrorFromToString<FieldTypeT> >::_IRet Converter;
00455 
00456     Converter::putToString(_values[index], tmpString);
00457 
00458     str.append(tmpString);
00459 
00460     return str;
00461 }
00462 
00463 /*-------------------------------------------------------------------------*/
00464 /*                           Index Operator                                */
00465 
00466 template <class FieldTypeT, Int32 fieldNameSpace> inline
00467 typename MField<FieldTypeT, fieldNameSpace>::reference
00468     MField<FieldTypeT, fieldNameSpace>::operator [](UInt32 index)
00469 {
00470     return _values[index];
00471 }
00472 
00473 template <class FieldTypeT, Int32 fieldNameSpace> inline
00474 typename MField<FieldTypeT, fieldNameSpace>::const_reference
00475     MField<FieldTypeT, fieldNameSpace>::operator [](UInt32 index) const
00476 {
00477     return _values[index];
00478 }
00479 
00480 #ifndef OSG_DISABLE_DEPRECATED
00481 template <class FieldTypeT, Int32 fieldNameSpace> inline
00482 typename MField<FieldTypeT, fieldNameSpace>::reference 
00483     MField<FieldTypeT, fieldNameSpace>::getValue (const UInt32 index)
00484 {
00485     return operator[](index);
00486 }
00487 
00488 template <class FieldTypeT, Int32 fieldNameSpace> inline
00489 typename MField<FieldTypeT, fieldNameSpace>::const_reference
00490     MField<FieldTypeT, fieldNameSpace>::getValue (const UInt32 index) const
00491 {
00492     return operator[](index);
00493 }
00494 
00495 template <class FieldTypeT, Int32 fieldNameSpace> inline
00496 void MField<FieldTypeT, fieldNameSpace>::setValue(       ArgumentType value,
00497                                                   const UInt32       index)
00498 {
00499     operator[](index) = value;
00500 }
00501 
00502 template <class FieldTypeT, Int32 fieldNameSpace> inline
00503 void MField<FieldTypeT, fieldNameSpace>::addValue(ArgumentType value)
00504 {
00505     push_back(value);
00506 }
00507 #endif
00508 
00509 template <class FieldTypeT, Int32 fieldNameSpace> inline
00510 UInt32 MField<FieldTypeT, fieldNameSpace>::getSize(void) const
00511 {
00512     return size();
00513 }
00514 
00515 /*-------------------------------------------------------------------------*/
00516 /*                              MT Sync                                    */
00517 
00518 #if !defined(OSG_FIXED_MFIELDSYNC)
00519 template <class FieldTypeT, Int32 fieldNameSpace> inline
00520 void MField<FieldTypeT, fieldNameSpace>::syncWith(Self &source)
00521 {
00522     setValues(source);
00523 }
00524 #else
00525 template <class ValueT, Int32 iNamespace> inline
00526 void MField<ValueT, iNamespace>::syncWith(      Self      &source,
00527                                           const SyncInfo  &sInfo )
00528 
00529 /*
00530                                           BitVector  syncMode,
00531                                           UInt32     uiSyncInfo,
00532                                           UInt32     uiCopyOffset)
00533  */
00534 {
00535     if(sInfo.syncMode != 0x0000)
00536     {
00537         setValues  (source);
00538     }
00539     else
00540     {
00541         UInt32 uiFromAspect  = (sInfo.uiSyncInfo & 0xFF000000) >> 24;
00542         UInt32 uiToAspect    = (sInfo.uiSyncInfo & 0x00FF0000) >> 16;
00543 
00544         bool   bTargetDelete = true;
00545 
00546         if(_uiSharedWith != 0x0000)
00547         {
00548             bTargetDelete = false;
00549 
00550             resolveShare(uiToAspect, sInfo.uiCopyOffset);
00551         }
00552 
00553         Char8  *pOtherMem = reinterpret_cast<Char8 *>(this);
00554         Self   *pOther    = NULL;
00555         UInt32  uiShared  = source._uiSharedWith;
00556         UInt32  uiCheck   = 1;
00557 
00558         pOtherMem -= uiToAspect * sInfo.uiCopyOffset;
00559 
00560         for(UInt32 i = 0; i < 32; ++i)
00561         {
00562             if(0x0000 != (uiShared & uiCheck))
00563             {
00564                 pOther = 
00565                     reinterpret_cast<Self *>(
00566                         pOtherMem + (i * sInfo.uiCopyOffset));
00567 
00568                 pOther->_uiSharedWith |= (1 << uiToAspect);
00569 
00570                 uiShared &= ~uiCheck;
00571             }
00572 
00573             if(0x0000 == uiShared)
00574             {
00575                 break;
00576             }
00577 
00578             uiCheck <<= 1;
00579         }
00580         
00581         _uiSharedWith        |= source._uiSharedWith;
00582         _uiSharedWith        |= (1 << uiFromAspect);
00583 
00584         source._uiSharedWith |= (1 << uiToAspect  );
00585 
00586         _values.shareValues(source._values, bTargetDelete);
00587     }
00588 }
00589 
00590 template <class ValueT, Int32 iNamespace> inline
00591 void MField<ValueT, iNamespace>::beginEdit(UInt32 uiAspect,
00592                                            UInt32 uiCopyOffset)
00593 {
00594     if(_uiSharedWith != 0x0000)
00595     {
00596         Self   *pOther = resolveShare(uiAspect, uiCopyOffset);
00597 
00598         _values.resolveShare();
00599 
00600         setValues(*pOther);
00601     }
00602 }
00603 
00604 template <class ValueT, Int32 iNamespace> inline
00605 typename MField<ValueT, 
00606                 iNamespace>::Self *
00607     MField<ValueT, 
00608            iNamespace>::resolveShare(UInt32 uiAspect, 
00609                                      UInt32 uiCopyOffset)
00610 {
00611     Char8  *pOtherMem = reinterpret_cast<Char8 *>(this);
00612     Self   *pOther    = NULL;
00613     UInt32  uiShared  = _uiSharedWith;
00614     UInt32  uiCheck   = 1;
00615     UInt32  uiOwn     = 1 << uiAspect;
00616     
00617     pOtherMem -= uiAspect * uiCopyOffset;
00618     
00619     for(UInt32 i = 0; i < 32; ++i)
00620     {
00621         if(0x0000 != (uiShared & uiCheck))
00622         {
00623             pOther = 
00624                 reinterpret_cast<Self *>(
00625                     pOtherMem + (i * uiCopyOffset));
00626             
00627             pOther->_uiSharedWith &= ~uiOwn;
00628             _uiSharedWith         &= ~uiCheck;
00629             
00630             uiShared &= ~uiCheck;
00631         }
00632         
00633         if(0x0000 == uiShared)
00634         {
00635             break;
00636         }
00637         
00638         uiCheck <<= 1;
00639     }    
00640 
00641     return pOther;
00642 }
00643 
00644 template <class ValueT, Int32 iNamespace> inline
00645 void MField<ValueT, iNamespace>::terminateShare(UInt32 uiAspect, 
00646                                                 UInt32 uiCopyOffset)
00647 {
00648     if(_uiSharedWith != 0x0000)
00649     {
00650         Char8  *pOtherMem = reinterpret_cast<Char8 *>(this);
00651         Self   *pOther    = NULL;
00652         UInt32  uiShared  = _uiSharedWith;
00653         UInt32  uiCheck   = 1 << (uiAspect + 1);
00654         UInt32  uiOwn     = 1 << uiAspect;
00655 
00656         for(UInt32 i = 1; i < 32; ++i)
00657         {
00658             if(0x0000 != (uiShared & uiCheck))
00659             {
00660                 pOther = 
00661                     reinterpret_cast<Self *>(
00662                         pOtherMem + (i * uiCopyOffset));
00663                 
00664                 pOther->_uiSharedWith &= ~uiOwn;
00665                 _uiSharedWith         &= ~uiCheck;
00666 
00667                 pOther->_values.resolveShare();
00668 
00669                 uiShared &= ~uiCheck;
00670             }
00671             
00672             if(0x0000 == uiShared)
00673             {
00674                 break;
00675             }
00676 
00677             uiCheck <<= 1;
00678         }
00679     }
00680 }
00681 #endif
00682 
00683 /*-------------------------------------------------------------------------*/
00684 /*                         Binary Interface                                */
00685 
00686 template <class FieldTypeT, Int32 fieldNameSpace> inline
00687 UInt32 MField<FieldTypeT, fieldNameSpace>::getBinSize(void) const
00688 {
00689     return sizeof(UInt32) + // num elements
00690            MFieldTraits::getBinSize(&(_values[0]), _values.size());
00691 }
00692 
00693 template <class FieldTypeT, Int32 fieldNameSpace> inline
00694 void MField<FieldTypeT, 
00695             fieldNameSpace>::copyToBin(BinaryDataHandler &pMem) const
00696 {
00697     UInt32 n = _values.size();
00698 
00699     pMem.putValue(n);
00700     MFieldTraits::copyToBin(   pMem, 
00701                             &(_values[0]),
00702                               _values.size());
00703 }
00704 
00705 template <class FieldTypeT, Int32 fieldNameSpace> inline
00706 void MField<FieldTypeT, fieldNameSpace>::copyFromBin(BinaryDataHandler &pMem)
00707 {
00708     UInt32 n;
00709 
00710      pMem  .getValue(n);
00711     _values.clear ( );
00712 
00713 #ifdef __hpux
00714     FieldTypeT tmpVal;
00715 
00716     _values.resize(n, tmpVal);
00717 #else
00718     _values.resize(n);
00719 #endif
00720 
00721     MFieldTraits::copyFromBin(pMem, 
00722                               &(_values[0]),
00723                               n);
00724 }
00725 
00726 /*-------------------------------------------------------------------------*/
00727 /*                               Dump                                      */
00728 
00729 template <class FieldTypeT, Int32 fieldNameSpace> inline
00730 void MField<FieldTypeT, fieldNameSpace>::dump(void) const
00731 {
00732     std::cout << "STMFST : " << std::endl;
00733 
00734     for(UInt32 i = 0; i < _values.size(); i++)
00735     {
00736 //        cout << _values[i] << " , ";
00737     }
00738 
00739     std::cout << std::endl;
00740 }
00741 
00742 /*-------------------------------------------------------------------------*/
00743 /*                             Create                                      */
00744 
00745 template <class FieldTypeT, Int32 fieldNameSpace> inline
00746 Field *MField<FieldTypeT, fieldNameSpace>::create(void) 
00747 {
00748     return new MField<FieldTypeT, fieldNameSpace>(); 
00749 }
00750 
00751 OSG_END_NAMESPACE
00752 
00753 #define OSGMFIELD_INLINE_CVSID "@(#)$Id: $"
00754 
00755 

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