#ifndef __RAK_SMART_PTR_H #define __RAK_SMART_PTR_H #include "RakSmartObj.h" template class RakSmartPtr { public: RakSmartPtr(Base* input = 0); RakSmartPtr(const RakSmartPtr& ptr); ~RakSmartPtr(); RakSmartPtr& operator=(const RakSmartPtr& ptr); RakSmartPtr& operator=(Base* right); bool operator==(Base* right) const; bool operator!=(Base* right) const; bool operator==(const RakSmartPtr& ptr) const; bool operator!=(const RakSmartPtr& ptr) const; operator Base*() const; Base& operator*() const; Base* operator->() const; protected: Base* object; }; //-------------------------------------------------------------------------- template RakSmartPtr::RakSmartPtr(Base* input) { object = input; if (object) object->IncRefCount(); } //-------------------------------------------------------------------------- template RakSmartPtr::RakSmartPtr(const RakSmartPtr& ptr) { object = ptr.object; // If you see // Error 1 error C2039: 'IncRefCount' : is not a member of 'A' c:\rak3d\source\raksmartptr.h 40 // You forgot to derive from RakSmartObj for the class that uses RakSmartPtr if (object) object->IncRefCount(); } //-------------------------------------------------------------------------- template RakSmartPtr::~RakSmartPtr() { if (object) object->DecRefCount(); } //-------------------------------------------------------------------------- template RakSmartPtr& RakSmartPtr::operator=(const RakSmartPtr& ptr) { if (object != ptr.object) { if (object) object->DecRefCount(); object = ptr.object; if (object) object->IncRefCount(); } return *this; } //-------------------------------------------------------------------------- template RakSmartPtr& RakSmartPtr::operator=(Base* right) { if (object != right) { if (object) object->DecRefCount(); object = right; if (object) object->IncRefCount(); } return *this; } //-------------------------------------------------------------------------- template bool RakSmartPtr::operator==(Base* right) const { return (object == right); } //-------------------------------------------------------------------------- template bool RakSmartPtr::operator!=(Base* right) const { return (object != right); } //-------------------------------------------------------------------------- template bool RakSmartPtr::operator==(const RakSmartPtr& ptr) const { return (object == ptr.object); } //-------------------------------------------------------------------------- template bool RakSmartPtr::operator!=(const RakSmartPtr& ptr) const { return (object != ptr.object); } //-------------------------------------------------------------------------- template RakSmartPtr::operator Base*() const { return object; } //-------------------------------------------------------------------------- template Base& RakSmartPtr::operator*() const { return *object; } //-------------------------------------------------------------------------- template Base* RakSmartPtr::operator->() const { return object; } #endif