Show
Ignore:
Timestamp:
01/16/08 16:07:40 (1 year ago)
Author:
cneumann
Message:

changed: - factory functions return a TransitPtr? that can not be implicitly

converted to C Ptr. Should help with porting.

added: - GlobalRefPtr?, needed for cases where upon return from main

a RefPtr? goes out of scope (it would attempt to access the
FCFactory which is already shutdown at that point).

status: - vrml loader does not compile (needs porting to ref ptr)

  • tutorials compile, run and exit cleanly
  • multithreading and cluster are untested, yet
Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • branches/Carsten_PtrWork2/Source/System/FieldContainer/Base/OSGReferenceCountPointer.inl

    r1033 r1039  
    5151 
    5252/*-------------------------------------------------------------------------*/ 
    53 /* InternalRefCountPolicy<BaseObjectT>                                     */ 
    54 /*-------------------------------------------------------------------------*/ 
    55  
    56 template <class BaseObjectT> 
    57 inline void 
    58 InternalRefCountPolicy<BaseObjectT>::addRef(BaseObjectPtrConstArg baseObjectPtr) 
    59 
    60     if(baseObjectPtr != NULL) 
    61         baseObjectPtr->addReference(); 
    62 
    63  
    64 template <class BaseObjectT>     
    65 inline void 
    66 InternalRefCountPolicy<BaseObjectT>::subRef(BaseObjectPtrConstArg baseObjectPtr) 
    67 
    68     if(baseObjectPtr != NULL) 
    69         baseObjectPtr->subReference(); 
    70 
    71      
    72 template <class BaseObjectT> 
    73 inline typename InternalRefCountPolicy<BaseObjectT>::BaseObjectPtr 
    74 InternalRefCountPolicy<BaseObjectT>::deref(BaseObjectPtrConstArg baseObjectPtr) 
    75 
    76     return baseObjectPtr; 
    77 
    78  
    79 /*-------------------------------------------------------------------------*/ 
    80 /* RefCountPolicy<BaseObjectT>                                             */ 
    81 /*-------------------------------------------------------------------------*/ 
    82  
    83 template <class BaseObjectT> 
    84 inline void 
    85 RefCountPolicy<BaseObjectT>::addRef(BaseObjectPtrConstArg baseObjectPtr) 
    86 
    87     if(baseObjectPtr != NULL) 
    88         baseObjectPtr->addExternalReference(); 
    89 
    90  
    91 template <class BaseObjectT> 
    92 inline void 
    93 RefCountPolicy<BaseObjectT>::subRef(BaseObjectPtrConstArg baseObjectPtr) 
    94 
    95     if(baseObjectPtr != NULL) 
    96         baseObjectPtr->subExternalReference(); 
    97 
    98  
    99 template <class BaseObjectT> 
    100 inline typename RefCountPolicy<BaseObjectT>::BaseObjectPtr 
    101 RefCountPolicy<BaseObjectT>::deref(BaseObjectPtrConstArg baseObjectPtr) 
    102 
    103     return baseObjectPtr; 
    104 
    105  
    106 /*-------------------------------------------------------------------------*/ 
    107 /* MTRefCountPolicy<BaseObjectT>                                        */ 
    108 /*-------------------------------------------------------------------------*/ 
    109  
    110 template <class BaseObjectT> 
    111 inline void 
    112 MTRefCountPolicy<BaseObjectT>::addRef(BaseObjectPtrConstArg baseObjectPtr) 
    113 
    114     if(baseObjectPtr != NULL) 
    115         baseObjectPtr->addExternalReference(); 
    116 
    117      
    118 template <class BaseObjectT> 
    119 inline void 
    120 MTRefCountPolicy<BaseObjectT>::subRef(BaseObjectPtrConstArg baseObjectPtr) 
    121 
    122     if(baseObjectPtr != NULL) 
    123         baseObjectPtr->subExternalReference(); 
    124 
    125      
    126 template <class BaseObjectT> 
    127 inline typename MTRefCountPolicy<BaseObjectT>::BaseObjectPtr 
    128 MTRefCountPolicy<BaseObjectT>::deref(BaseObjectPtrConstArg baseObjectPtr) 
    129 
    130     BaseObjectPtr retVal = NullFC; 
    131  
    132     if(baseObjectPtr != NullFC) 
    133         retVal = baseObjectPtr->getAspectPtr(Thread::getCurrentAspect()); 
    134          
    135     return retVal; 
    136 
    137  
    138 /*-------------------------------------------------------------------------*/ 
    139 /* MTRefCountPolicy<FieldBundle>                                           */ 
    140 /*-------------------------------------------------------------------------*/ 
    141  
    142 inline void 
    143 MTRefCountPolicy<FieldBundle>::addRef(BaseObjectPtrConstArg baseObjectPtr) 
    144 
    145 //     if(baseObjectPtr != NULL) 
    146 //         baseObjectPtr->addExternalReference(); 
    147 
    148      
    149 inline void 
    150 MTRefCountPolicy<FieldBundle>::subRef(BaseObjectPtrConstArg baseObjectPtr) 
    151 
    152 //     if(baseObjectPtr != NULL) 
    153 //         baseObjectPtr->subExternalReference(); 
    154 
    155      
    156 inline MTRefCountPolicy<FieldBundle>::BaseObjectPtr 
    157 MTRefCountPolicy<FieldBundle>::deref(BaseObjectPtrConstArg baseObjectPtr) 
    158 
    159     return baseObjectPtr; 
    160 
    161  
    162 /*-------------------------------------------------------------------------*/ 
    163 /* WeakRefCountPolicy<BaseObjectT>                                         */ 
    164 /*-------------------------------------------------------------------------*/ 
    165  
    166 template <class BaseObjectT> 
    167 inline void 
    168 WeakRefCountPolicy<BaseObjectT>::addRef(BaseObjectPtrConstArg baseObjectPtr) 
    169 
    170     if(baseObjectPtr != NULL) 
    171         baseObjectPtr->addWeakReference(); 
    172 
    173  
    174 template <class BaseObjectT> 
    175 inline void 
    176 WeakRefCountPolicy<BaseObjectT>::subRef(BaseObjectPtrConstArg baseObjectPtr) 
    177 
    178     if(baseObjectPtr != NULL) 
    179         baseObjectPtr->subWeakReference(); 
    180 
    181  
    182 template <class BaseObjectT> 
    183 inline typename WeakRefCountPolicy<BaseObjectT>::BaseObjectPtr 
    184 WeakRefCountPolicy<BaseObjectT>::deref(BaseObjectPtrConstArg baseObjectPtr) 
    185 
    186     return baseObjectPtr; 
    187 
    188  
    189 /*-------------------------------------------------------------------------*/ 
    190 /* ReferenceCountPointer<ObjectT, RefCountPolicyT>                      */ 
     53/* ReferenceCountPointer<ObjectT, RefCountPolicyT>                         */ 
    19154/*-------------------------------------------------------------------------*/ 
    19255 
     
    22790{ 
    22891    RefCountPolicy::addRef( baseObjectPtr); 
    229     RefCountPolicy::subRef(_baseObjectPtr); 
    230      
    231     _baseObjectPtr = baseObjectPtr; 
     92    RefCountPolicy::subRef(_baseObjPtr); 
     93     
     94    _baseObjPtr = baseObjectPtr; 
    23295} 
    23396 
     
    240103                      RefCountPolicyT, 
    241104                      BaseObjectT     >::ReferenceCountPointer(void) 
    242     : _baseObjectPtr(NullFC) 
     105    : _baseObjPtr(NullFC) 
    243106{ 
    244107} 
     
    250113                      BaseObjectT     >::ReferenceCountPointer( 
    251114    Self const &other) 
    252     : _baseObjectPtr(NullFC) 
    253 { 
    254     internalSet(other._baseObjectPtr); 
     115    : _baseObjPtr(NullFC) 
     116{ 
     117    internalSet(Self::castPtrUp(other.get())); 
    255118} 
    256119     
     
    261124                      BaseObjectT     >::ReferenceCountPointer( 
    262125    ObjectPtrConstArg objectPtr) 
    263     : _baseObjectPtr(NullFC) 
     126    : _baseObjPtr(NullFC) 
    264127{ 
    265128    internalSet(Self::castPtrUp(objectPtr)); 
     
    275138                          OtherRefCountPolicyT, 
    276139                          BaseObjectT          > const &refPtr) 
    277     : _baseObjectPtr(NullFC) 
     140    : _baseObjPtr(NullFC) 
    278141{ 
    279142    internalSet(Self::castPtrUp(refPtr.get())); 
     143} 
     144 
     145template <class ObjectT,      class RefCountPolicyT, class BaseObjectT> 
     146template <class OtherObjectT                                          > 
     147inline 
     148ReferenceCountPointer<ObjectT, 
     149                      RefCountPolicyT, 
     150                      BaseObjectT     >::ReferenceCountPointer( 
     151    TransitPointer<OtherObjectT, BaseObjectT> const &transPtr) 
     152     
     153    : _baseObjPtr(NullFC) 
     154{ 
     155    internalSet(Self::castPtrUp(static_cast<ObjectPtr>(transPtr.getCPtr()))); 
     156     
     157    const_cast<TransitPointer<OtherObjectT, BaseObjectT> &>(transPtr).release(); 
    280158} 
    281159 
     
    291169    detail::StaticCastTag                                      ) 
    292170     
    293     : _baseObjectPtr(NullFC) 
     171    : _baseObjPtr(NullFC) 
    294172{ 
    295173    internalSet(Self::castPtrUp(static_cast<ObjectPtr>(refPtr.get()))); 
     
    307185    detail::ConstCastTag                                       ) 
    308186     
    309     : _baseObjectPtr(NullFC) 
     187    : _baseObjPtr(NullFC) 
    310188{ 
    311189    internalSet(Self::castPtrUp(const_cast<ObjectPtr>(refPtr.get()))); 
     
    323201    detail::DynamicCastTag                                     ) 
    324202     
    325     : _baseObjectPtr(NullFC) 
     203    : _baseObjPtr(NullFC) 
    326204{ 
    327205    internalSet(Self::castPtrUp(dynamic_cast<ObjectPtr>(refPtr.get()))); 
     
    337215                      BaseObjectT     >::~ReferenceCountPointer(void) 
    338216{ 
     217#ifdef OSG_DEBUG 
     218    if((GlobalSystemState == Shutdown) && (_baseObjPtr != NullFC)) 
     219    { 
     220        FWARNING(("ReferenceCountPointer<>::~ReferenceCountPointer (this=%p, _baseObjPtr=%p) [%s]: " 
     221                  "Pointer is live after OpenSG shutdown, can not destroy object.\n", this, _baseObjPtr, get()->getType().getCName())); 
     222                   
     223        OSG_ASSERT(_baseObjPtr == NullFC); // temporary, to help debugging 
     224    } 
     225    else 
     226    { 
     227        internalSet(NullFC); 
     228    } 
     229#else 
    339230    internalSet(NullFC); 
     231#endif 
    340232} 
    341233 
     
    352244                      BaseObjectT     >::operator=(Self const &other) 
    353245{ 
    354     internalSet(other._baseObjectPtr); 
     246    internalSet(Self::castPtrUp(other.get())); 
    355247     
    356248    return *this; 
     
    390282} 
    391283 
     284template <class ObjectT,      class RefCountPolicyT,     class BaseObjectT> 
     285template <class OtherObjectT                                              > 
     286    typename  
     287    ReferenceCountPointer<ObjectT,  
     288                          RefCountPolicyT, 
     289                          BaseObjectT     >::Self & 
     290ReferenceCountPointer<ObjectT,  
     291                      RefCountPolicyT, 
     292                      BaseObjectT     >::operator=( 
     293    TransitPointer<OtherObjectT, BaseObject> const &transPtr) 
     294{ 
     295    internalSet(Self::castPtrUp(static_cast<ObjectPtr>(transPtr.getCPtr()))); 
     296     
     297    const_cast<TransitPointer<OtherObjectT, BaseObject> &>(transPtr).release(); 
     298     
     299    return *this; 
     300} 
     301 
    392302/*-------------------------------------------------------------------------*/ 
    393303/* Conversion                                                              */ 
     
    399309                      BaseObjectT     >::operator ObjectPtr(void) const 
    400310{ 
    401     return Self::castPtrDown(RefCountPolicy::deref(_baseObjectPtr)); 
     311    return Self::castPtrDown(RefCountPolicy::deref(_baseObjPtr)); 
    402312} 
    403313 
     
    414324                      BaseObjectT     >::operator->(void) const 
    415325{ 
    416     return Self::castPtrDown(RefCountPolicy::deref(_baseObjectPtr)); 
     326    return Self::castPtrDown(RefCountPolicy::deref(_baseObjPtr)); 
    417327} 
    418328 
     
    426336                      BaseObjectT     >::operator*(void) const 
    427337{ 
    428     return *(Self::castPtrDown(RefCountPolicy::deref(_baseObjectPtr))); 
     338    return *(Self::castPtrDown(RefCountPolicy::deref(_baseObjPtr))); 
    429339} 
    430340 
     
    438348                      BaseObjectT     >::get(void) const 
    439349{ 
    440     return Self::castPtrDown(RefCountPolicy::deref(_baseObjectPtr)); 
     350    return Self::castPtrDown(RefCountPolicy::deref(_baseObjPtr)); 
    441351} 
    442352 
     
    448358    ObjectPtrConstArg objectPtr) 
    449359{ 
    450     _baseObjectPtr = Self::castPtrUp(objectPtr); 
     360    internalSet(Self::castPtrUp(objectPtr)); 
    451361} 
    452362 
     
    457367                      BaseObjectT     >::swap(Self &other) 
    458368{ 
    459     std::swap(_baseObjectPtr, other._baseObjectPtr); 
     369    std::swap(_baseObjPtr, other._baseObjPtr); 
    460370} 
    461371