00001 #ifndef QPID_REFCOUNTEDBUFFER_H
00002 #define QPID_REFCOUNTEDBUFFER_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 #include <boost/intrusive_ptr.hpp>
00028
00029 namespace qpid {
00030
00035 class RefCountedBuffer : boost::noncopyable {
00036 mutable boost::detail::atomic_count count;
00037 RefCountedBuffer();
00038 void destroy() const;
00039 char* addr() const;
00040
00041 public:
00043 class pointer {
00044 boost::intrusive_ptr<RefCountedBuffer> p;
00045 char* cp() const;
00046 pointer(RefCountedBuffer* x);
00047 friend class RefCountedBuffer;
00048
00049 public:
00050 pointer();
00051 pointer(const pointer&);
00052 ~pointer();
00053 pointer& operator=(const pointer&);
00054
00055 char* get() { return cp(); }
00056 operator char*() { return cp(); }
00057 char& operator*() { return *cp(); }
00058 char& operator[](size_t i) { return cp()[i]; }
00059
00060 const char* get() const { return cp(); }
00061 operator const char*() const { return cp(); }
00062 const char& operator*() const { return *cp(); }
00063 const char& operator[](size_t i) const { return cp()[i]; }
00064 };
00065
00067 static pointer create(size_t n);
00068
00070 char* get() { return addr(); }
00071 const char* get() const { return addr(); }
00072 char& operator[](size_t i) { return get()[i]; }
00073 const char& operator[](size_t i) const { return get()[i]; }
00074
00075 void addRef() const { ++count; }
00076 void release() const { if (--count==0) destroy(); }
00077 long refCount() { return count; }
00078 };
00079
00080 }
00081
00082
00083 namespace boost {
00084 inline void intrusive_ptr_add_ref(const qpid::RefCountedBuffer* p) { p->addRef(); }
00085 inline void intrusive_ptr_release(const qpid::RefCountedBuffer* p) { p->release(); }
00086 }
00087
00088
00089 #endif