/* dtkSmartPointer.h --- * * Author: John Stark * Copyright (C) 2011 - John Stark, Inria. * Created: Wed May 25 14:00:00 2011 (+0100) * Version: $Id: bdc34d1a33b18cca88606cb2e9e34476fadc7588 $ * Last-Updated: Wed Aug 3 09:00:13 2011 (+0200) * By: Thibaud Kloczko * Update #: 55 */ /* Commentary: * */ /* Change log: * */ #ifndef DTKSMARTPOINTER_H #define DTKSMARTPOINTER_H #include template class dtkSmartPointer { public: typedef T ObjectType; dtkSmartPointer(void) : d(0) { } dtkSmartPointer(const dtkSmartPointer& p) : d(p.d) { this->retain(); } template dtkSmartPointer(const dtkSmartPointer& p) : d(dynamic_cast( p.operator->())) { this->retain(); } dtkSmartPointer(T *p) : d(p) { this->retain(); } ~dtkSmartPointer(void) { this->release(); } T *operator->(void) const { return d; } operator T *(void) const { return d; } bool isNull(void) const { return d == 0; } int refCount(void) const { if (d) return d->count(); else return 0; } template bool operator==(TR r) const { return (d == static_cast(r)); } template bool operator==(const dtkSmartPointer& r) const { return (d == static_cast(r.constData())); } template bool operator != (TR r) const { return (d != static_cast(r)); } template bool operator != (const dtkSmartPointer& r) const { return (d != static_cast(r.constData())); } bool operator==(const dtkSmartPointer& r) const { return d == r.d; } bool operator!=(const dtkSmartPointer& r) const { return d != r.d; } bool operator<(const dtkSmartPointer& r) const { return d < r.d; } bool operator<=(const dtkSmartPointer& r) const { return d <= r.d; } bool operator>(const dtkSmartPointer& r) const { return d > r.d; } bool operator>=(const dtkSmartPointer& r) const { return d >= r.d; } T *data(void) { return d; } const T *constData(void) const { return d; } T& operator*(void) { return *d; } const T& operator*(void) const { return *d; } dtkSmartPointer& operator=(const dtkSmartPointer& r) { return this->operator=(r.d); } template dtkSmartPointer& operator=(const dtkSmartPointer& r) { return this->operator=(dynamic_cast(r.operator->())); } dtkSmartPointer& operator=(T *r) { if (d != r) { T *tmp = d; d = r; this->retain(); if (tmp) tmp->release(); } return *this; } void swap(dtkSmartPointer& other) { T *tmp = d; d = other.d; other.d = tmp; } dtkSmartPointer& takePointer(T *r) { if (d != r) { T *tmp = d; d = r; if (tmp) tmp->release(); } return *this; } T *releasePointer(void) { T *tmp = d; d = 0; return tmp; } private: void retain(void) { if (d) d->retain(); } void release(void) { if (d) d->release(); } private: T *d; }; template inline uint qHash(const dtkSmartPointer& key) { return qHash(key.constData()); } #endif