http://stxxl.sourceforge.net
<dementiev@mpi-sb.mpg.de>
<singler@ira.uka.de>
http://www.boost.org/LICENSE_1_0.txt
#ifndef STXXL_IO__REQUEST_PTR_H_
#define STXXL_IO__REQUEST_PTR_H_
#include <cassert>
#include <stxxl/bits/namespace.h>
#include <stxxl/bits/io/request.h>
#include <stxxl/bits/verbose.h>
__STXXL_BEGIN_NAMESPACE
#define STXXL_VERBOSE_request_ptr(msg) STXXL_VERBOSE3("[" << static_cast<void *>(this) << "] request_ptr::" << msg << " ptr=" << static_cast<void *>(ptr))
class request_ptr
{
request * ptr;
void add_ref()
{
if (ptr)
{
ptr->add_ref();
}
}
void sub_ref()
{
if (ptr)
{
if (ptr->sub_ref())
{
STXXL_VERBOSE_request_ptr("sub_ref(): the last ref, deleting");
delete ptr;
ptr = NULL;
}
else
{
STXXL_VERBOSE_request_ptr("sub_ref(): more refs left");
}
}
}
public:
request_ptr(request * ptr_ = NULL) : ptr(ptr_)
{
STXXL_VERBOSE_request_ptr("(request*)");
add_ref();
}
request_ptr(const request_ptr & p) : ptr(p.ptr)
{
STXXL_VERBOSE_request_ptr("(request_ptr&)");
add_ref();
}
~request_ptr()
{
STXXL_VERBOSE_request_ptr("~()");
sub_ref();
}
request_ptr & operator = (const request_ptr & p)
{
return (*this = p.ptr);
}
request_ptr & operator = (request * p)
{
STXXL_VERBOSE_request_ptr("operator=(request=" << static_cast<void *>(p) << ") {BEGIN}");
if (p != ptr)
{
sub_ref();
ptr = p;
add_ref();
}
STXXL_VERBOSE_request_ptr("operator=(request=" << static_cast<void *>(p) << ") {END}");
return *this;
}
request & operator * () const
{
assert(ptr);
return *ptr;
}
request * operator -> () const
{
assert(ptr);
return ptr;
}
bool operator == (const request_ptr & rp2) const
{
return ptr == rp2.ptr;
}
request * get() const { return ptr; }
bool valid() const { return ptr != NULL; }
bool empty() const { return ptr == NULL; }
};
__STXXL_END_NAMESPACE
#endif