22 #ifndef __DAAL_SHARED_PTR_H__
23 #define __DAAL_SHARED_PTR_H__
25 #include "services/base.h"
26 #include "services/daal_memory.h"
27 #include "services/error_id.h"
28 #include "services/daal_atomic_int.h"
53 virtual ~DeleterIface() {}
59 virtual void operator() (
const void *ptr) = 0;
69 class ObjectDeleter :
public DeleterIface
72 void operator() (
const void *ptr) DAAL_C11_OVERRIDE
74 delete (
const T *)(ptr);
84 class ServiceDeleter :
public DeleterIface
87 void operator() (
const void *ptr) DAAL_C11_OVERRIDE
89 daal::services::daal_free((
void *)ptr);
99 class EmptyDeleter :
public DeleterIface
102 void operator() (
const void *ptr) DAAL_C11_OVERRIDE
112 class DAAL_EXPORT RefCounter:
public AtomicInt
118 RefCounter() : AtomicInt(1){}
120 virtual ~RefCounter() {}
121 virtual void operator() (
const void *ptr) = 0;
130 template<
class Deleter>
131 class RefCounterImp:
public RefCounter
138 RefCounterImp(
const Deleter& d) : _deleter(d){}
140 virtual ~RefCounterImp() {}
141 void operator() (
const void *ptr) DAAL_C11_OVERRIDE
166 typedef T ElementType;
171 SharedPtr() : _ownedPtr(NULL), _ptr(NULL), _refCount(NULL)
180 explicit SharedPtr(U *ptr) : _ownedPtr(ptr), _ptr(ptr), _refCount(NULL)
183 _refCount =
new RefCounterImp<ObjectDeleter<U> >();
193 template<
class U,
class D>
194 explicit SharedPtr(U *ptr,
const D& deleter) : _ownedPtr(ptr), _ptr(ptr), _refCount(NULL)
197 _refCount =
new RefCounterImp<D>(deleter);
200 SharedPtr(
const SharedPtr<T> &ptr);
202 SharedPtr(
const SharedPtr<T> &ptr, T* shiftedPtr);
209 SharedPtr(
const SharedPtr<U> &other);
222 SharedPtr(
const SharedPtr<U> &r, T *ptr, T *shiftedPtr);
228 ~SharedPtr() { _remove(); }
234 SharedPtr<T> &operator=(
const SharedPtr<T> &ptr);
262 template<
class U,
class D>
263 void reset(U* ptr,
const D& deleter);
270 SharedPtr<T> &operator=(
const SharedPtr<U> &ptr)
272 if (((
void *)&ptr != (
void *)
this) && ((
void *)(ptr.get()) != (
void *)(this->_ownedPtr)))
275 _ownedPtr = ptr._ownedPtr;
276 _refCount = ptr._refCount;
288 T *operator->()
const {
return _ptr; }
294 T &operator* ()
const {
return *_ptr; }
300 operator bool()
const {
return (_ptr != NULL); }
306 T *
get()
const {
return _ptr; }
312 T *getStartPtr()
const {
return _ownedPtr; }
318 int useCount()
const {
return _refCount ? _refCount->get() : 0; }
323 RefCounter *_refCount;
331 template<
class U>
friend class SharedPtr;
336 SharedPtr<T>::SharedPtr(
const SharedPtr<U> &other) : _ownedPtr(other._ownedPtr), _ptr(other._ptr), _refCount(other._refCount)
343 SharedPtr<T>::SharedPtr(
const SharedPtr<T> &other) : _ownedPtr(other._ownedPtr), _ptr(other._ptr), _refCount(other._refCount)
350 SharedPtr<T>::SharedPtr(
const SharedPtr<T> &other, T* shiftedPtr) : _ownedPtr(other._ownedPtr), _ptr(shiftedPtr), _refCount(other._refCount)
358 SharedPtr<T>::SharedPtr(
const SharedPtr<U> &other, T *ptr, T* shiftedPtr) : _ownedPtr(ptr), _ptr(shiftedPtr), _refCount(other._refCount)
365 void SharedPtr<T>::_remove()
367 if(_refCount && (_refCount->dec() <= 0))
369 (*_refCount)(_ownedPtr);
376 SharedPtr<T> &SharedPtr<T>::operator=(
const SharedPtr<T> &ptr)
378 if (&ptr !=
this || ptr._ownedPtr != this->_ownedPtr || ptr._ptr != this->_ptr)
381 _ownedPtr = ptr._ownedPtr;
382 _refCount = ptr._refCount;
392 void SharedPtr<T>::reset(U* ptr)
394 if(ptr != this->_ownedPtr)
399 _refCount = (ptr ?
new RefCounterImp<ObjectDeleter<U> >() : NULL);
404 template<
class U,
class D>
405 void SharedPtr<T>::reset(U* ptr,
const D& deleter)
407 if(ptr != this->_ownedPtr)
412 _refCount = (ptr ?
new RefCounterImp<D>(deleter) : NULL);
421 template<
class T,
class U>
422 SharedPtr<T> staticPointerCast(
const SharedPtr<U> &r)
424 T *shifted =
static_cast<T *
>(r.get());
425 T *start =
static_cast<T *
>(r.getStartPtr());
426 return SharedPtr<T>(r, start, shifted);
434 template<
class T,
class U>
435 SharedPtr<T> reinterpretPointerCast(
const SharedPtr<U> &r)
437 T *shifted =
reinterpret_cast<T *
>(r.get());
438 T *start =
reinterpret_cast<T *
>(r.getStartPtr());
439 return SharedPtr<T>(r, start, shifted);
447 template<
class T,
class U>
448 SharedPtr<T> dynamicPointerCast(
const SharedPtr<U> &r)
450 T *shifted =
dynamic_cast<T *
>(r.get());
451 T *start =
dynamic_cast<T *
>(r.getStartPtr());
452 if (!r.get() || start)
454 return SharedPtr<T>(r, start, shifted);
458 return SharedPtr<T>();
463 using interface1::DeleterIface;
464 using interface1::ObjectDeleter;
465 using interface1::EmptyDeleter;
466 using interface1::ServiceDeleter;
467 using interface1::RefCounter;
468 using interface1::RefCounterImp;
469 using interface1::SharedPtr;
470 using interface1::staticPointerCast;
471 using interface1::dynamicPointerCast;
472 using interface1::reinterpretPointerCast;
daal::services::interface1::dynamicPointerCast
SharedPtr< T > dynamicPointerCast(const SharedPtr< U > &r)
Definition: daal_shared_ptr.h:448
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:47
daal::services::interface1::ServiceDeleter::operator()
void operator()(const void *ptr) DAAL_C11_OVERRIDE
Definition: daal_shared_ptr.h:87
daal::services::interface1::SharedPtr::useCount
int useCount() const
Definition: daal_shared_ptr.h:318
daal
Definition: algorithm_base_common.h:31
daal::services::interface1::RefCounterImp
Provides implementations of the operator() method of the RefCounter class.
Definition: daal_shared_ptr.h:131
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:194
daal::services::interface1::RefCounter::~RefCounter
virtual ~RefCounter()
Definition: daal_shared_ptr.h:120
daal::services::interface1::DeleterIface::~DeleterIface
virtual ~DeleterIface()
Definition: daal_shared_ptr.h:53
daal::services::interface1::EmptyDeleter::operator()
void operator()(const void *ptr) DAAL_C11_OVERRIDE
Definition: daal_shared_ptr.h:102
daal::services::interface1::SharedPtr::SharedPtr
SharedPtr(U *ptr)
Definition: daal_shared_ptr.h:180
daal::services::interface1::SharedPtr::operator*
T & operator*() const
Definition: daal_shared_ptr.h:294
daal::services::interface1::ObjectDeleter::operator()
void operator()(const void *ptr) DAAL_C11_OVERRIDE
Definition: daal_shared_ptr.h:72
daal::services::interface1::ObjectDeleter
Implementation of DeleterIface to destroy a pointer by the delete operator.
Definition: daal_shared_ptr.h:69
daal::services::interface1::SharedPtr
Shared pointer that retains shared ownership of an object through a pointer. Several SharedPtr object...
Definition: daal_shared_ptr.h:161
daal::services::interface1::RefCounter
Implementation of reference counter.
Definition: daal_shared_ptr.h:112
daal::services::interface1::SharedPtr::reset
void reset()
Definition: daal_shared_ptr.h:239
daal::services::interface1::RefCounterImp::RefCounterImp
RefCounterImp()
Definition: daal_shared_ptr.h:137
daal::services::interface1::SharedPtr::SharedPtr
SharedPtr()
Definition: daal_shared_ptr.h:171
daal::services::interface1::SharedPtr::_remove
void _remove()
Definition: daal_shared_ptr.h:365
daal::services::interface1::reinterpretPointerCast
SharedPtr< T > reinterpretPointerCast(const SharedPtr< U > &r)
Definition: daal_shared_ptr.h:435
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:84
daal::services::interface1::SharedPtr::~SharedPtr
~SharedPtr()
Definition: daal_shared_ptr.h:228
daal::services::interface1::SharedPtr::operator->
T * operator->() const
Definition: daal_shared_ptr.h:288
daal::services::interface1::SharedPtr::operator=
SharedPtr< T > & operator=(const SharedPtr< T > &ptr)
Definition: daal_shared_ptr.h:376
daal::services::interface1::RefCounter::RefCounter
RefCounter()
Definition: daal_shared_ptr.h:118
daal::services::interface1::RefCounterImp::~RefCounterImp
virtual ~RefCounterImp()
Definition: daal_shared_ptr.h:140
daal::services::interface1::SharedPtr::getStartPtr
T * getStartPtr() const
Definition: daal_shared_ptr.h:312
daal::services::interface1::SharedPtr::operator=
SharedPtr< T > & operator=(const SharedPtr< U > &ptr)
Definition: daal_shared_ptr.h:270
daal::services::interface1::EmptyDeleter
Implementation of DeleterIface without pointer destroying.
Definition: daal_shared_ptr.h:99
daal::services::interface1::staticPointerCast
SharedPtr< T > staticPointerCast(const SharedPtr< U > &r)
Definition: daal_shared_ptr.h:422
daal::services::interface1::SharedPtr::get
T * get() const
Definition: daal_shared_ptr.h:306