http://stxxl.sourceforge.net
<R-Steffen@gmx.de>
http://www.boost.org/LICENSE_1_0.txt
#ifndef STXXL_SHARED_OBJECT_HEADER
#define STXXL_SHARED_OBJECT_HEADER
#include <cassert>
#include <stxxl/bits/namespace.h>
__STXXL_BEGIN_NAMESPACE
template <class C>
class shared_object_pointer
{
C * ptr;
void new_reference()
{ new_reference(ptr); }
void new_reference(C * o)
{ if (o) o->new_reference(); }
void delete_reference()
{ if (ptr && ptr->delete_reference()) delete ptr; }
public:
shared_object_pointer()
: ptr(0) {}
shared_object_pointer(C * pointer)
: ptr(pointer)
{ new_reference(); }
shared_object_pointer(const shared_object_pointer & shared_pointer)
: ptr(shared_pointer.ptr)
{ new_reference(); }
shared_object_pointer & operator = (const shared_object_pointer & shared_pointer)
{ return operator = (shared_pointer.ptr); }
shared_object_pointer & operator = (C * pointer)
{
new_reference(pointer);
delete_reference();
ptr = pointer;
return *this;
}
~shared_object_pointer()
{ delete_reference(); }
C & operator * () const
{
assert (ptr);
return *ptr;
}
C * operator -> () const
{
assert(ptr);
return ptr;
}
operator C * () const
{ return ptr; }
C * get() const
{ return ptr; }
bool operator == (const shared_object_pointer & shared_pointer) const
{ return ptr == shared_pointer.ptr; }
operator bool () const
{ return ptr; }
bool valid() const
{ return ptr; }
bool empty() const
{ return ! ptr; }
bool unique() const
{ return ptr && ptr->unique(); }
void unify()
{
if (ptr && ! ptr->unique())
operator = (new C(*ptr));
}
};
template <class C>
class const_shared_object_pointer
{
const C * ptr;
void new_reference()
{ new_reference(ptr); }
void new_reference(const C * o)
{ if (o) o->new_reference(); }
void delete_reference()
{ if (ptr && ptr->delete_reference()) delete ptr; }
public:
const_shared_object_pointer(const shared_object_pointer<C> & shared_pointer)
: ptr(shared_pointer.ptr)
{ new_reference(); }
const_shared_object_pointer()
: ptr(0) {}
const_shared_object_pointer(const C * pointer)
: ptr(pointer)
{ new_reference(); }
const_shared_object_pointer(const const_shared_object_pointer & shared_pointer)
: ptr(shared_pointer.ptr)
{ new_reference(); }
const_shared_object_pointer & operator = (const const_shared_object_pointer & shared_pointer)
{ return operator = (shared_pointer.ptr); }
const_shared_object_pointer & operator = (const C * pointer)
{
new_reference(pointer);
delete_reference();
ptr = pointer;
return *this;
}
~const_shared_object_pointer()
{ delete_reference(); }
const C & operator * () const
{
assert (ptr);
return *ptr;
}
const C * operator -> () const
{
assert(ptr);
return ptr;
}
operator const C * () const
{ return ptr; }
const C * get() const
{ return ptr; }
bool operator == (const const_shared_object_pointer & shared_pointer) const
{ return ptr == shared_pointer.ptr; }
operator bool () const
{ return ptr; }
bool valid() const
{ return ptr; }
bool empty() const
{ return ! ptr; }
bool unique() const
{ return ptr && ptr->unique(); }
};
class shared_object
{
mutable int reference_count;
public:
shared_object()
: reference_count(0) {}
shared_object(const shared_object &)
: reference_count(0) {}
const shared_object & operator = (const shared_object &) const
{ return *this; }
shared_object & operator = (const shared_object &)
{ return *this; }
~shared_object()
{ assert (! reference_count); }
private:
template <class C> friend class shared_object_pointer;
void new_reference() const
{ ++reference_count; }
bool delete_reference() const
{ return (! --reference_count); }
bool unique() const
{ return reference_count == 1; }
};
__STXXL_END_NAMESPACE
#endif