#ifndef GLTB_REFPTR_H_ #define GLTB_REFPTR_H_ #include namespace gltb { /** * A template class wrapping a pointer to a reference counted * object that transparently performs the required reference * counting for it. * * Implementation note: this class takes ReferencedObject and * ThreadSafeReferencedObject as arguments. Therefore these * classes must stay in sync. */ template class RefPtr { public: RefPtr() { this->object=0; } RefPtr(objectType *object) { this->object=object; if(object!=0) { object->increaseReferenceCount(); } }; RefPtr(RefPtr const &ptr) { object=ptr.object; if(object!=0) { object->increaseReferenceCount(); } } template RefPtr(RefPtr const &ptr, typename std::enable_if::value, int>::type dummy = 0) { object = ptr.getNakedPointer(); if(object != 0) { object->increaseReferenceCount(); } } /// move constructor that steals reference from other RefPtr RefPtr(RefPtr &&ptr) { object=ptr.object; ptr.object=0; } #if 0 // RefPtr is a completely different type; its object pointer is inaccessible /// move constructor that steals reference from other RefPtr template RefPtr(RefPtr &&ptr) { object = static_cast(ptr.object); ptr.object = 0; } #endif ~RefPtr() { if(object!=0) { object->decreaseReferenceCount(); } }; objectType *operator -> () { return object; } const objectType *operator -> () const { return object; } RefPtr &operator =(RefPtr const &refPtr) { if(object!=0) { object->decreaseReferenceCount(); } object=refPtr.object; if(object!=0) { object->increaseReferenceCount(); } return *this; } RefPtr &operator =(RefPtr &&refPtr) { if(object!=0) { object->decreaseReferenceCount(); } object=refPtr.object; refPtr.object=0; return *this; } objectType *getNakedPointer() const { return object; } private: objectType *object; }; template bool operator == (const RefPtr &reference, void *pointer) { return (reference.getNakedPointer()==pointer); } template bool operator == (const RefPtr &reference1, const RefPtr &reference2) { return (reference1.getNakedPointer()==reference2.getNakedPointer()); } template bool operator != (const RefPtr &reference, void *pointer) { return (reference.getNakedPointer()!=pointer); } template bool operator != (const RefPtr &reference1, const RefPtr &reference2) { return (reference1.getNakedPointer()!=reference2.getNakedPointer()); } template bool operator < (const RefPtr &reference1, const RefPtr &reference2) { return reference1.getNakedPointer()