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
00038
00039
00040
00041
00042
00043 #include <algorithm>
00044
00045 OSG_BEGIN_NAMESPACE
00046
00047 #ifndef STD
00048 #define STD std
00049 #endif
00050
00051
00052
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
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
00092
00093 template <class FieldTypeT, Int32 fieldNameSpace> inline
00094 MField<FieldTypeT, fieldNameSpace>::~MField(void)
00095 {
00096 }
00097
00098
00099
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
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
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
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
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
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
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
00531
00532
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
00685
00686 template <class FieldTypeT, Int32 fieldNameSpace> inline
00687 UInt32 MField<FieldTypeT, fieldNameSpace>::getBinSize(void) const
00688 {
00689 return sizeof(UInt32) +
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
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
00737 }
00738
00739 std::cout << std::endl;
00740 }
00741
00742
00743
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