24 #ifndef __DAAL_SHARED_PTR_H__
25 #define __DAAL_SHARED_PTR_H__
27 #include "services/base.h"
28 #include "services/daal_memory.h"
29 #include "services/error_id.h"
30 #include "services/daal_atomic_int.h"
55 virtual ~DeleterIface() {}
61 virtual void operator() (
const void *ptr) = 0;
71 class ObjectDeleter :
public DeleterIface
74 void operator() (
const void *ptr) DAAL_C11_OVERRIDE
76 delete (
const T *)(ptr);
86 class ServiceDeleter :
public DeleterIface
89 void operator() (
const void *ptr) DAAL_C11_OVERRIDE
91 daal::services::daal_free((
void *)ptr);
101 class EmptyDeleter :
public DeleterIface
104 void operator() (
const void *ptr) DAAL_C11_OVERRIDE
114 class DAAL_EXPORT RefCounter:
public AtomicInt
120 RefCounter() : AtomicInt(1){}
122 virtual ~RefCounter() {}
123 virtual void operator() (
const void *ptr) = 0;
132 template<
class Deleter>
133 class RefCounterImp:
public RefCounter
140 RefCounterImp(
const Deleter& d) : _deleter(d){}
142 virtual ~RefCounterImp() {}
143 void operator() (
const void *ptr) DAAL_C11_OVERRIDE
168 typedef T ElementType;
173 SharedPtr() : _ownedPtr(NULL), _ptr(NULL), _refCount(NULL)
182 explicit SharedPtr(U *ptr) : _ownedPtr(ptr), _ptr(ptr), _refCount(NULL)
185 _refCount =
new RefCounterImp<ObjectDeleter<U> >();
195 template<
class U,
class D>
196 explicit SharedPtr(U *ptr,
const D& deleter) : _ownedPtr(ptr), _ptr(ptr), _refCount(NULL)
199 _refCount =
new RefCounterImp<D>(deleter);
202 SharedPtr(
const SharedPtr<T> &ptr);
204 SharedPtr(
const SharedPtr<T> &ptr, T* shiftedPtr);
211 SharedPtr(
const SharedPtr<U> &other);
224 SharedPtr(
const SharedPtr<U> &r, T *ptr, T *shiftedPtr);
230 ~SharedPtr() { _remove(); }
236 SharedPtr<T> &operator=(
const SharedPtr<T> &ptr);
264 template<
class U,
class D>
265 void reset(U* ptr,
const D& deleter);
272 SharedPtr<T> &operator=(
const SharedPtr<U> &ptr)
274 if (((
void *)&ptr != (
void *)
this) && ((
void *)(ptr.get()) != (
void *)(this->_ownedPtr)))
277 _ownedPtr = ptr._ownedPtr;
278 _refCount = ptr._refCount;
290 T *operator->()
const {
return _ptr; }
296 T &operator* ()
const {
return *_ptr; }
302 operator bool()
const {
return (_ptr != NULL); }
308 T *
get()
const {
return _ptr; }
314 T *getStartPtr()
const {
return _ownedPtr; }
320 int useCount()
const {
return _refCount ? _refCount->get() : 0; }
325 RefCounter *_refCount;
333 template<
class U>
friend class SharedPtr;
338 SharedPtr<T>::SharedPtr(
const SharedPtr<U> &other) : _ownedPtr(other._ownedPtr), _ptr(other._ptr), _refCount(other._refCount)
345 SharedPtr<T>::SharedPtr(
const SharedPtr<T> &other) : _ownedPtr(other._ownedPtr), _ptr(other._ptr), _refCount(other._refCount)
352 SharedPtr<T>::SharedPtr(
const SharedPtr<T> &other, T* shiftedPtr) : _ownedPtr(other._ownedPtr), _ptr(shiftedPtr), _refCount(other._refCount)
360 SharedPtr<T>::SharedPtr(
const SharedPtr<U> &other, T *ptr, T* shiftedPtr) : _ownedPtr(ptr), _ptr(shiftedPtr), _refCount(other._refCount)
367 void SharedPtr<T>::_remove()
369 if(_refCount && (_refCount->dec() <= 0))
371 (*_refCount)(_ownedPtr);
379 SharedPtr<T> &SharedPtr<T>::operator=(
const SharedPtr<T> &ptr)
381 if (&ptr !=
this || ptr._ownedPtr != this->_ownedPtr || ptr._ptr != this->_ptr)
384 _ownedPtr = ptr._ownedPtr;
385 _refCount = ptr._refCount;
395 void SharedPtr<T>::reset(U* ptr)
397 if(ptr != this->_ownedPtr)
402 _refCount = (ptr ?
new RefCounterImp<ObjectDeleter<U> >() : NULL);
407 template<
class U,
class D>
408 void SharedPtr<T>::reset(U* ptr,
const D& deleter)
410 if(ptr != this->_ownedPtr)
415 _refCount = (ptr ?
new RefCounterImp<D>(deleter) : NULL);
424 template<
class T,
class U>
425 SharedPtr<T> staticPointerCast(
const SharedPtr<U> &r)
427 T *shifted =
static_cast<T *
>(r.get());
428 T *start =
static_cast<T *
>(r.getStartPtr());
429 return SharedPtr<T>(r, start, shifted);
437 template<
class T,
class U>
438 SharedPtr<T> reinterpretPointerCast(
const SharedPtr<U> &r)
440 T *shifted =
reinterpret_cast<T *
>(r.get());
441 T *start =
reinterpret_cast<T *
>(r.getStartPtr());
442 return SharedPtr<T>(r, start, shifted);
450 template<
class T,
class U>
451 SharedPtr<T> dynamicPointerCast(
const SharedPtr<U> &r)
453 T *shifted =
dynamic_cast<T *
>(r.get());
454 T *start =
dynamic_cast<T *
>(r.getStartPtr());
455 if (!r.get() || start)
457 return SharedPtr<T>(r, start, shifted);
461 return SharedPtr<T>();
466 using interface1::DeleterIface;
467 using interface1::ObjectDeleter;
468 using interface1::EmptyDeleter;
469 using interface1::ServiceDeleter;
470 using interface1::RefCounter;
471 using interface1::RefCounterImp;
472 using interface1::SharedPtr;
473 using interface1::staticPointerCast;
474 using interface1::dynamicPointerCast;
475 using interface1::reinterpretPointerCast;
daal::services::interface1::reinterpretPointerCast
SharedPtr< T > reinterpretPointerCast(const SharedPtr< U > &r)
Definition: daal_shared_ptr.h:438
daal::services::interface1::EmptyDeleter::operator()
void operator()(const void *ptr) DAAL_C11_OVERRIDE
Definition: daal_shared_ptr.h:104
daal::services::interface1::SharedPtr::operator*
T & operator*() const
Definition: daal_shared_ptr.h:296
daal::services::interface1::dynamicPointerCast
SharedPtr< T > dynamicPointerCast(const SharedPtr< U > &r)
Definition: daal_shared_ptr.h:451
daal::services::interface1::SharedPtr::operator=
SharedPtr< T > & operator=(const SharedPtr< U > &ptr)
Definition: daal_shared_ptr.h:272
daal::services::interface1::ServiceDeleter
Implementation of DeleterIface to destroy a pointer by the daal_free function.
Definition: daal_shared_ptr.h:86
daal::services::interface1::ServiceDeleter::operator()
void operator()(const void *ptr) DAAL_C11_OVERRIDE
Definition: daal_shared_ptr.h:89
daal::services::interface1::SharedPtr::SharedPtr
SharedPtr()
Definition: daal_shared_ptr.h:173
daal::services::interface1::SharedPtr::SharedPtr
SharedPtr(U *ptr)
Definition: daal_shared_ptr.h:182
daal::services::interface1::SharedPtr::get
T * get() const
Definition: daal_shared_ptr.h:308
daal::services::interface1::SharedPtr::~SharedPtr
~SharedPtr()
Definition: daal_shared_ptr.h:230
daal::services::interface1::RefCounterImp::~RefCounterImp
virtual ~RefCounterImp()
Definition: daal_shared_ptr.h:142
daal::services::interface1::DeleterIface::~DeleterIface
virtual ~DeleterIface()
Definition: daal_shared_ptr.h:55
daal::services::interface1::SharedPtr::getStartPtr
T * getStartPtr() const
Definition: daal_shared_ptr.h:314
daal::services::interface1::RefCounterImp::RefCounterImp
RefCounterImp()
Definition: daal_shared_ptr.h:139
daal::services::interface1::SharedPtr::_remove
void _remove()
Definition: daal_shared_ptr.h:367
daal::services::interface1::SharedPtr::useCount
int useCount() const
Definition: daal_shared_ptr.h:320
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:49
daal::services::interface1::SharedPtr
Shared pointer that retains shared ownership of an object through a pointer. Several SharedPtr object...
Definition: daal_shared_ptr.h:163
daal::services::interface1::RefCounter::~RefCounter
virtual ~RefCounter()
Definition: daal_shared_ptr.h:122
daal::services::interface1::DeleterIface::operator()
virtual void operator()(const void *ptr)=0
daal::services::interface1::RefCounter::RefCounter
RefCounter()
Definition: daal_shared_ptr.h:120
daal::services::interface1::ObjectDeleter
Implementation of DeleterIface to destroy a pointer by the delete operator.
Definition: daal_shared_ptr.h:71
daal::services::interface1::SharedPtr::SharedPtr
SharedPtr(U *ptr, const D &deleter)
Definition: daal_shared_ptr.h:196
daal::services::interface1::staticPointerCast
SharedPtr< T > staticPointerCast(const SharedPtr< U > &r)
Definition: daal_shared_ptr.h:425
daal::services::daal_free
DAAL_EXPORT void daal_free(void *ptr)
daal::services::interface1::SharedPtr::operator->
T * operator->() const
Definition: daal_shared_ptr.h:290
daal::services::interface1::SharedPtr::reset
void reset()
Definition: daal_shared_ptr.h:241
daal::services::interface1::ObjectDeleter::operator()
void operator()(const void *ptr) DAAL_C11_OVERRIDE
Definition: daal_shared_ptr.h:74
daal::services::interface1::SharedPtr::operator=
SharedPtr< T > & operator=(const SharedPtr< T > &ptr)
Definition: daal_shared_ptr.h:379
daal::services::interface1::RefCounter
Implementation of reference counter.
Definition: daal_shared_ptr.h:114
daal::services::interface1::EmptyDeleter
Implementation of DeleterIface without pointer destroying.
Definition: daal_shared_ptr.h:101
daal::services::interface1::RefCounterImp
Provides implementations of the operator() method of the RefCounter class.
Definition: daal_shared_ptr.h:133