summaryrefslogtreecommitdiff
Side-by-side diff
Diffstat (more/less context) (ignore whitespace changes)
-rw-r--r--libopie2/opiecore/osmart_pointer.h4
1 files changed, 2 insertions, 2 deletions
diff --git a/libopie2/opiecore/osmart_pointer.h b/libopie2/opiecore/osmart_pointer.h
index a362a60..2a2518f 100644
--- a/libopie2/opiecore/osmart_pointer.h
+++ b/libopie2/opiecore/osmart_pointer.h
@@ -30,115 +30,115 @@ _;:, .> :=|. This program is free software; you can
*/
#ifndef _osmart_pointer_h
#define _osmart_pointer_h
/*!
* \file osmart_pointer.h
* \brief smart pointer and reference counter
* \author Rajko Albrecht
*
*/
namespace Opie {
//! simple reference counter class
class oref_count {
protected:
//! reference count member
long m_RefCount;
public:
//! first reference must be added after "new" via Pointer()
oref_count() : m_RefCount(0)
{}
virtual ~oref_count() {}
//! add a reference
void Incr() {
++m_RefCount;
}
//! delete a reference
void Decr() {
--m_RefCount;
}
//! is it referenced
bool Shared() { return (m_RefCount > 0); }
};
//! reference counting wrapper class
template<class T> class osmart_pointer {
//! pointer to object
/*!
* this object must contain Incr(), Decr() and Shared()
* methode as public members. The best way is, that it will be a child
* class of RefCount
*/
T *ptr;
public:
//! standart constructor
osmart_pointer() { ptr = NULL; }
//! standart destructor
/*!
* release the reference, if it were the last reference, destroys
* ptr
*/
~osmart_pointer()
{
if (ptr){
ptr->Decr();
if (!ptr->Shared())
delete ptr;
}
}
//! construction
osmart_pointer(T* t) { if (ptr = t) ptr->Incr(); }
//! Pointer copy
- osmart_pointer(const smart_pointer<T>& p)
+ osmart_pointer(const osmart_pointer<T>& p)
{ if (ptr = p.ptr) ptr->Incr(); }
//! pointer copy by assignment
- osmart_pointer<T>& operator= (const smart_pointer<T>& p)
+ osmart_pointer<T>& operator= (const osmart_pointer<T>& p)
{
// already same: nothing to do
if (ptr == p.ptr) return *this;
// decouple reference
if (ptr) { ptr->Decr(); if (!ptr->Shared()) delete ptr; }
// establish new reference
if (ptr = p.ptr) ptr->Incr();
return *this;
}
osmart_pointer<T>& operator= (T*p)
{
if (ptr==p)return *this;
if (ptr) {
ptr->Decr();
if (!ptr->Shared()) delete ptr;
}
if (ptr=p) ptr->Incr();
return *this;
}
//! cast to conventional pointer
operator T* () const { return ptr; }
//! deref: fails for NULL pointer
T& operator* () {return *ptr; }
//! deref: fails for NULL pointer
const T& operator* ()const {return *ptr; }
//! deref with method call
T* operator-> () {return ptr; }
//! deref with const method call
const T* operator-> ()const {return ptr; }
//! supports "if (pointer)"
operator bool () const { return (ptr != NULL); }
//! "if (pointer)" as non const
operator bool () { return ptr != NULL;}
//! support if (!pointer)"
bool operator! () const { return (ptr == NULL); }
//! support if (!pointer)" as non const
bool operator! () { return (ptr == NULL); }
};
}
#endif