#ifndef __BlOP_GARBAGE_COLLECTOR_PTR_H__ #define __BlOP_GARBAGE_COLLECTOR_PTR_H__ #include <map> namespace blop { template <typename T> class garbage_collector_ptr { private: T *ptr_; static std::map<T*,int> &link_count() { static std::map<T*,int> m; return m; } public: garbage_collector_ptr() : ptr_(0) {} garbage_collector_ptr(T *ptr) : ptr_(ptr) { ++link_count()[ptr_]; } garbage_collector_ptr(const garbage_collector_ptr &rhs) : ptr_(rhs.ptr_) { ++link_count()[ptr_]; } ~garbage_collector_ptr() { if(--link_count()[ptr_] == 0) { link_count().erase(ptr_); delete ptr_; } } const garbage_collector_ptr &operator=(const garbage_collector_ptr &rhs) { ptr_ = rhs.ptr_; ++link_count()[ptr_]; return *this; } T *operator->() const { return ptr_; } T &operator*() const { return *ptr_; } }; } #endif