#ifndef TNL_WEAK_H #define TNL_WEAK_H #include "object.h" struct WeakPeer : public Object { bool object_alive; inline WeakPeer() : object_alive(true) { } }; class Weak { Ptr peer; public: inline Weak() { } inline virtual ~Weak() { if(peer) peer->object_alive=false; }; inline Ptr getPeer() const { if (!peer) { Weak *volatile_this = const_cast(this); volatile_this->peer = new WeakPeer; } return peer; } }; template class WeakPtr { T * p; Ptr peer; public: friend T* ptr(const WeakPtr& arg) {return arg.p;} inline WeakPtr() : p(0) {} template inline WeakPtr(U * obj) : p(static_cast(obj)), peer(obj->getPeer()) { } template inline WeakPtr(const WeakPtr & other) : p(static_cast(other.p)), peer(other.peer) { } template inline WeakPtr(const Ptr & other) : p(static_cast(ptr(other))) , peer(other?other->getPeer():Ptr(0)) { } inline Ptr lock() const { if (valid()) { return p; } else { return 0; } } inline WeakPtr & operator= (T * obj) { p=obj; if(p) peer=obj->getPeer(); return *this; } inline WeakPtr & operator= (const Ptr & pstrong) { p=ptr(pstrong); if(p) peer=p->getPeer(); return *this; }; inline bool valid() const { return p!=0 && peer->object_alive; } inline operator bool() const { return valid(); } inline bool operator==(const WeakPtr & ptr) const { return p == ptr.p; } inline bool operator!=(const WeakPtr & ptr) const { return p != ptr.p; } inline bool operator<(const WeakPtr & ptr) const { return p < ptr.p; } inline bool operator<=(const WeakPtr & ptr) const { return p <= ptr.p; } inline bool operator>(const WeakPtr & ptr) const { return p > ptr.p; } inline bool operator>=(const WeakPtr & ptr) const { return p >= ptr.p; } }; #endif