diff options
| author | Alan Conway <aconway@apache.org> | 2011-03-15 01:49:37 +0000 |
|---|---|---|
| committer | Alan Conway <aconway@apache.org> | 2011-03-15 01:49:37 +0000 |
| commit | a537010f4dc49fbcb05820eefa132c879f96b7ba (patch) | |
| tree | f2d58ff36aa968d461b284d2b74a534cfaf077eb /cpp/src/qpid/RefCountedBuffer.h | |
| parent | 5f3fc9ce1861acb0ccb912f9a2326c82f0ad760c (diff) | |
| download | qpid-python-a537010f4dc49fbcb05820eefa132c879f96b7ba.tar.gz | |
NO-JIRA: Refactor RefCountedBuffer to be simpler and more flexible.
RefCountedBuffer::pointer is replaced by a separate class BufferRef.
BufferRef is independent of RefCountedBuffer, it can be used to manage other
reference-counted buffer classes e.g. to implement buffer pools.
BufferRef also provides beginning and end of the buffer, not just beginning.
git-svn-id: https://svn.apache.org/repos/asf/qpid/trunk/qpid@1081631 13f79535-47bb-0310-9956-ffa450edef68
Diffstat (limited to 'cpp/src/qpid/RefCountedBuffer.h')
| -rw-r--r-- | cpp/src/qpid/RefCountedBuffer.h | 61 |
1 files changed, 8 insertions, 53 deletions
diff --git a/cpp/src/qpid/RefCountedBuffer.h b/cpp/src/qpid/RefCountedBuffer.h index 75a23862be..f0ea86130b 100644 --- a/cpp/src/qpid/RefCountedBuffer.h +++ b/cpp/src/qpid/RefCountedBuffer.h @@ -22,68 +22,23 @@ * */ -#include <boost/utility.hpp> -#include <boost/detail/atomic_count.hpp> -#include <boost/intrusive_ptr.hpp> +#include <qpid/RefCounted.h> +#include <qpid/BufferRef.h> namespace qpid { /** - * Reference-counted byte buffer. - * No alignment guarantees. + * Reference-counted byte buffer. No alignment guarantees. */ -class RefCountedBuffer : boost::noncopyable { - mutable boost::detail::atomic_count count; - RefCountedBuffer(); - void destroy() const; - char* addr() const; - -public: - /** Smart char pointer to a reference counted buffer */ - class pointer { - boost::intrusive_ptr<RefCountedBuffer> p; - char* cp() const; - pointer(RefCountedBuffer* x); - friend class RefCountedBuffer; - - public: - pointer(); - pointer(const pointer&); - ~pointer(); - pointer& operator=(const pointer&); - - char* get() { return cp(); } - operator char*() { return cp(); } - char& operator*() { return *cp(); } - char& operator[](size_t i) { return cp()[i]; } - - const char* get() const { return cp(); } - operator const char*() const { return cp(); } - const char& operator*() const { return *cp(); } - const char& operator[](size_t i) const { return cp()[i]; } - }; - +class RefCountedBuffer : public RefCounted { + public: /** Create a reference counted buffer of size n */ - static pointer create(size_t n); - - /** Get a pointer to the start of the buffer. */ - char* get() { return addr(); } - const char* get() const { return addr(); } - char& operator[](size_t i) { return get()[i]; } - const char& operator[](size_t i) const { return get()[i]; } + static BufferRef create(size_t n); - void addRef() const { ++count; } - void release() const { if (--count==0) destroy(); } - long refCount() { return count; } + protected: + void released() const; }; } // namespace qpid -// intrusive_ptr support. -namespace boost { -inline void intrusive_ptr_add_ref(const qpid::RefCountedBuffer* p) { p->addRef(); } -inline void intrusive_ptr_release(const qpid::RefCountedBuffer* p) { p->release(); } -} - - #endif /*!QPID_REFCOUNTEDBUFFER_H*/ |
