#include // ============================================================================== // basic auto pointer implementation // see also http://ootips.org/yonat/4dev/smart-pointers.html template class dsAutoPtr { public: explicit dsAutoPtr(T* p = NULL) : ptr(p) {} /* prevents cast/conversion */ ~dsAutoPtr() { delete ptr; } T& operator*() { return *ptr; } T* operator->() { return ptr; } private: T* ptr; }; // ============================================================================== // basic reference counting pointer borrowed from: // http://www.codeproject.com/Articles/15351/Implementing-a-simple-smart-pointer-in-c class ReferenceCount { public: ReferenceCount() { count = 0; } void addReference() { count++; } int releaseReference() { return --count; } private: int count; }; template class dsSharedPtr { public: dsSharedPtr(T* pValue = NULL) : pData(pValue) { // Create a new reference counter & increment the count reference = new ReferenceCount(); reference->addReference(); } dsSharedPtr(const dsSharedPtr& sp) : pData(sp.pData), reference(sp.reference) { // use the same reference counter, increment the count reference->addReference(); } dsSharedPtr& operator= (const dsSharedPtr& sp) { if (this != &sp) { // Decrement the old reference count // if reference become zero delete the old data if(reference->releaseReference() == 0) { delete pData; delete reference; } // Copy the data and reference pointer // and increment the reference count pData = sp.pData; reference = sp.reference; reference->addReference(); } return *this; } // destructor ~dsSharedPtr() { if (reference->releaseReference() == 0) { delete pData; delete reference; } } bool operator== (const dsSharedPtr& sp) { return pData == sp.pData; } T& operator* () { return *pData; } T* operator-> () { return pData; } private: // REPRESENTATION T* pData; ReferenceCount* reference; }; // ==============================================================================