00001 #ifndef QPID_REFCOUNTED_H
00002 #define QPID_REFCOUNTED_H
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025 #include <boost/utility.hpp>
00026 #include <boost/detail/atomic_count.hpp>
00027
00028 namespace qpid {
00029
00036 class RefCounted : boost::noncopyable {
00037 mutable boost::detail::atomic_count count;
00038
00039 public:
00040 RefCounted() : count(0) {}
00041 void addRef() const { ++count; }
00042 void release() const { if (--count==0) delete this; }
00043 long refCount() { return count; }
00044
00045 protected:
00046 virtual ~RefCounted() {};
00047 };
00048
00056 struct RefCountedChild {
00057 RefCounted& parent;
00058
00059 protected:
00060 RefCountedChild(RefCounted& parent_) : parent(parent_) {}
00061
00062 public:
00063 void addRef() const { parent.addRef(); }
00064 void release() const { parent.release(); }
00065 };
00066
00067 }
00068
00069
00070 namespace boost {
00071 inline void intrusive_ptr_add_ref(const qpid::RefCounted* p) { p->addRef(); }
00072 inline void intrusive_ptr_release(const qpid::RefCounted* p) { p->release(); }
00073 inline void intrusive_ptr_add_ref(const qpid::RefCountedChild* p) { p->addRef(); }
00074 inline void intrusive_ptr_release(const qpid::RefCountedChild* p) { p->release(); }
00075 }
00076
00077
00078 #endif