48 #ifndef __DAAL_SHARED_PTR_H__ 49 #define __DAAL_SHARED_PTR_H__ 51 #include "services/base.h" 52 #include "services/daal_memory.h" 53 #include "services/error_id.h" 54 #include "services/daal_atomic_int.h" 79 virtual ~DeleterIface() {}
85 virtual void operator() (
const void *ptr) = 0;
95 class ObjectDeleter :
public DeleterIface
98 void operator() (
const void *ptr) DAAL_C11_OVERRIDE
100 delete (
const T *)(ptr);
110 class ServiceDeleter :
public DeleterIface
113 void operator() (
const void *ptr) DAAL_C11_OVERRIDE
115 daal::services::daal_free((
void *)ptr);
125 class EmptyDeleter :
public DeleterIface
128 void operator() (
const void *ptr) DAAL_C11_OVERRIDE
138 class DAAL_EXPORT RefCounter:
public AtomicInt
144 RefCounter() : AtomicInt(1){}
146 virtual ~RefCounter() {}
147 virtual void operator() (
const void *ptr) = 0;
156 template<
class Deleter>
157 class RefCounterImp:
public RefCounter
164 RefCounterImp(
const Deleter& d) : _deleter(d){}
166 virtual ~RefCounterImp() {}
167 void operator() (
const void *ptr) DAAL_C11_OVERRIDE
192 typedef T ElementType;
197 SharedPtr() : _ownedPtr(NULL), _ptr(NULL), _refCount(NULL)
206 explicit SharedPtr(U *ptr) : _ownedPtr(ptr), _ptr(ptr), _refCount(NULL)
209 _refCount =
new RefCounterImp<ObjectDeleter<U> >();
219 template<
class U,
class D>
220 explicit SharedPtr(U *ptr,
const D& deleter) : _ownedPtr(ptr), _ptr(ptr), _refCount(NULL)
223 _refCount =
new RefCounterImp<D>(deleter);
226 SharedPtr(
const SharedPtr<T> &ptr);
228 SharedPtr(
const SharedPtr<T> &ptr, T* shiftedPtr);
235 SharedPtr(
const SharedPtr<U> &other);
248 SharedPtr(
const SharedPtr<U> &r, T *ptr, T *shiftedPtr);
254 ~SharedPtr() { _remove(); }
260 SharedPtr<T> &operator=(
const SharedPtr<T> &ptr);
288 template<
class U,
class D>
289 void reset(U* ptr,
const D& deleter);
296 SharedPtr<T> &operator=(
const SharedPtr<U> &ptr)
298 if (((
void *)&ptr != (
void *)
this) && ((
void *)(ptr.get()) != (
void *)(this->_ownedPtr)))
301 _ownedPtr = ptr._ownedPtr;
302 _refCount = ptr._refCount;
314 T *operator->()
const {
return _ptr; }
320 T &operator* ()
const {
return *_ptr; }
326 operator bool()
const {
return (_ptr != NULL); }
332 T *
get()
const {
return _ptr; }
338 T *getStartPtr()
const {
return _ownedPtr; }
344 int useCount()
const {
return _refCount ? _refCount->get() : 0; }
349 RefCounter *_refCount;
357 template<
class U>
friend class SharedPtr;
362 SharedPtr<T>::SharedPtr(
const SharedPtr<U> &other) : _ownedPtr(other._ownedPtr), _ptr(other._ptr), _refCount(other._refCount)
369 SharedPtr<T>::SharedPtr(
const SharedPtr<T> &other) : _ownedPtr(other._ownedPtr), _ptr(other._ptr), _refCount(other._refCount)
376 SharedPtr<T>::SharedPtr(
const SharedPtr<T> &other, T* shiftedPtr) : _ownedPtr(other._ownedPtr), _ptr(shiftedPtr), _refCount(other._refCount)
384 SharedPtr<T>::SharedPtr(
const SharedPtr<U> &other, T *ptr, T* shiftedPtr) : _ownedPtr(ptr), _ptr(shiftedPtr), _refCount(other._refCount)
391 void SharedPtr<T>::_remove()
393 if(_refCount && (_refCount->dec() <= 0))
395 (*_refCount)(_ownedPtr);
402 SharedPtr<T> &SharedPtr<T>::operator=(
const SharedPtr<T> &ptr)
404 if (&ptr !=
this || ptr._ownedPtr != this->_ownedPtr || ptr._ptr != this->_ptr)
407 _ownedPtr = ptr._ownedPtr;
408 _refCount = ptr._refCount;
418 void SharedPtr<T>::reset(U* ptr)
420 if(ptr != this->_ownedPtr)
425 _refCount = (ptr ?
new RefCounterImp<ObjectDeleter<U> >() : NULL);
430 template<
class U,
class D>
431 void SharedPtr<T>::reset(U* ptr,
const D& deleter)
433 if(ptr != this->_ownedPtr)
438 _refCount = (ptr ?
new RefCounterImp<D>(deleter) : NULL);
447 template<
class T,
class U>
448 SharedPtr<T> staticPointerCast(
const SharedPtr<U> &r)
450 T *shifted =
static_cast<T *
>(r.get());
451 T *start =
static_cast<T *
>(r.getStartPtr());
452 return SharedPtr<T>(r, start, shifted);
460 template<
class T,
class U>
461 SharedPtr<T> reinterpretPointerCast(
const SharedPtr<U> &r)
463 T *shifted =
reinterpret_cast<T *
>(r.get());
464 T *start =
reinterpret_cast<T *
>(r.getStartPtr());
465 return SharedPtr<T>(r, start, shifted);
473 template<
class T,
class U>
474 SharedPtr<T> dynamicPointerCast(
const SharedPtr<U> &r)
476 T *shifted =
dynamic_cast<T *
>(r.get());
477 T *start =
dynamic_cast<T *
>(r.getStartPtr());
478 if (!r.get() || start)
480 return SharedPtr<T>(r, start, shifted);
484 return SharedPtr<T>();
489 using interface1::DeleterIface;
490 using interface1::ObjectDeleter;
491 using interface1::EmptyDeleter;
492 using interface1::ServiceDeleter;
493 using interface1::RefCounter;
494 using interface1::RefCounterImp;
495 using interface1::SharedPtr;
496 using interface1::staticPointerCast;
497 using interface1::dynamicPointerCast;
498 using interface1::reinterpretPointerCast;
daal::services::interface1::dynamicPointerCast
SharedPtr< T > dynamicPointerCast(const SharedPtr< U > &r)
Definition: daal_shared_ptr.h:474
daal::services::interface1::DeleterIface
Interface for a utility class used within SharedPtr to delete an object when the object owner is dest...
Definition: daal_shared_ptr.h:73
daal
Definition: algorithm_base_common.h:57
daal::services::interface1::RefCounterImp
Provides implementations of the operator() method of the RefCounter class.
Definition: daal_shared_ptr.h:157
daal::services::interface1::DeleterIface::operator()
virtual void operator()(const void *ptr)=0
daal::services::interface1::SharedPtr::SharedPtr
SharedPtr(U *ptr, const D &deleter)
Definition: daal_shared_ptr.h:220
daal::services::interface1::RefCounter::~RefCounter
virtual ~RefCounter()
Definition: daal_shared_ptr.h:146
daal::services::interface1::DeleterIface::~DeleterIface
virtual ~DeleterIface()
Definition: daal_shared_ptr.h:79
daal::services::interface1::SharedPtr::SharedPtr
SharedPtr(U *ptr)
Definition: daal_shared_ptr.h:206
daal::services::interface1::ObjectDeleter
Implementation of DeleterIface to destroy a pointer by the delete operator.
Definition: daal_shared_ptr.h:95
daal::services::interface1::SharedPtr
Shared pointer that retains shared ownership of an object through a pointer. Several SharedPtr object...
Definition: daal_shared_ptr.h:187
daal::services::interface1::SharedPtr::get
T * get() const
Definition: daal_shared_ptr.h:332
daal::services::interface1::RefCounter
Implementation of reference counter.
Definition: daal_shared_ptr.h:138
daal::services::interface1::SharedPtr::reset
void reset()
Definition: daal_shared_ptr.h:265
daal::services::interface1::RefCounterImp::RefCounterImp
RefCounterImp()
Definition: daal_shared_ptr.h:163
daal::services::interface1::SharedPtr::SharedPtr
SharedPtr()
Definition: daal_shared_ptr.h:197
daal::services::interface1::reinterpretPointerCast
SharedPtr< T > reinterpretPointerCast(const SharedPtr< U > &r)
Definition: daal_shared_ptr.h:461
daal::services::interface1::SharedPtr::operator->
T * operator->() const
Definition: daal_shared_ptr.h:314
daal::services::daal_free
DAAL_EXPORT void daal_free(void *ptr)
daal::services::interface1::ServiceDeleter
Implementation of DeleterIface to destroy a pointer by the daal_free function.
Definition: daal_shared_ptr.h:110
daal::services::interface1::SharedPtr::~SharedPtr
~SharedPtr()
Definition: daal_shared_ptr.h:254
daal::services::interface1::RefCounter::RefCounter
RefCounter()
Definition: daal_shared_ptr.h:144
daal::services::interface1::Atomic
Class that represents an atomic object.
Definition: daal_atomic_int.h:72
daal::services::interface1::SharedPtr::useCount
int useCount() const
Definition: daal_shared_ptr.h:344
daal::services::interface1::RefCounterImp::~RefCounterImp
virtual ~RefCounterImp()
Definition: daal_shared_ptr.h:166
daal::services::interface1::SharedPtr::operator=
SharedPtr< T > & operator=(const SharedPtr< U > &ptr)
Definition: daal_shared_ptr.h:296
daal::services::interface1::SharedPtr::getStartPtr
T * getStartPtr() const
Definition: daal_shared_ptr.h:338
daal::services::interface1::EmptyDeleter
Implementation of DeleterIface without pointer destroying.
Definition: daal_shared_ptr.h:125
daal::services::interface1::staticPointerCast
SharedPtr< T > staticPointerCast(const SharedPtr< U > &r)
Definition: daal_shared_ptr.h:448