Source: ksharedptr.h


Annotated List
Files
Globals
Hierarchy
Index
/* The QSharedPtr class is property of Troll Tech. It's here temporarily
   until it appears in Qt's CVS
*/
/*
   The KShared / KSharedPtr class is Copyright 1999 W. Bastian
*/

#ifndef KSharedPTR_H
#define KSharedPTR_H

#include <qshared.h>

/**
 * Reference counting for shared objects.
 * @author Waldo Bastian <bastian@kde.org>
 * @version $Id: ksharedptr.h,v 1.10 1999/12/21 21:51:03 coolo Exp $
 */
class KShared {
public:
   KShared() : count(0) { }
   KShared( const KShared & ) : count(0) { }
   KShared &operator=(const KShared & ) { return *this; }
   void _KShared_ref() { count++; }
   void _KShared_unref() { if (!--count) delete this; }
   int _KShared_count() { return count; }
protected:
   virtual ~KShared() { }
   int count;
};

/**
 * Can be used to control the lifetime of an object
 * that has derived @ref KShared. As long a someone holds
 * a KSharedPtr on some KShared object it won't become
 * deleted but is deleted once its reference count is 0.
 * This struct emulates C++ pointers perfectly. So just use
 * it like a simple C++ pointer.
 *
 * KShared and KSharedPtr are preferred over QShared /
 * QSharedPtr since they are more safe.
 * @author Waldo Bastian <bastian@kde.org>
 * @version $Id: ksharedptr.h,v 1.10 1999/12/21 21:51:03 coolo Exp $
 */


template< class T >
struct KSharedPtr
{
public:
  KSharedPtr()
    : ptr(0) { }
  KSharedPtr( T* t )
    : ptr(t) { if ( ptr ) ptr->_KShared_ref(); }
  KSharedPtr( const KSharedPtr& p )
    : ptr(p.ptr) { if ( ptr ) ptr->_KShared_ref(); }

  ~KSharedPtr() { if ( ptr ) ptr->_KShared_unref(); }

  KSharedPtr<T>& operator= ( const KSharedPtr<T>& p ) {
    if ( ptr == p.ptr ) return *this;
    if ( ptr ) ptr->_KShared_unref();
    ptr = p.ptr;
    if ( ptr ) ptr->_KShared_ref();
    return *this;
  }
  KSharedPtr<T>& operator= ( T* p ) {
    if ( ptr == p ) return *this;
    if ( ptr ) ptr->_KShared_unref();
    ptr = p;
    if ( ptr ) ptr->_KShared_ref();
    return *this;
  }
  bool operator== ( const KSharedPtr<T>& p ) const { return ( ptr == p.ptr ); }
  bool operator!= ( const KSharedPtr<T>& p ) const { return ( ptr != p.ptr ); }
  bool operator== ( const T* p ) const { return ( ptr == p ); }
  bool operator!= ( const T* p ) const { return ( ptr != p ); }
  bool operator!() const { return ( ptr == 0 ); }
  operator T*() const { return ptr; }

  const T& operator*() const { return *ptr; }
  T& operator*() { return *ptr; }
  const T* operator->() const { return ptr; }
  T* operator->() { return ptr; }

  uint count() const { return ptr->_KShared_count(); } // for debugging purposes
private:
  T* ptr;
};


/**
 * Can be used to control the lifetime of an object
 * that has derived @ref QShared. As long a someone holds
 * a QSharedPtr on some QShared object it won't become
 * deleted but is deleted once its reference count is 0.
 * This struct emulates C++ pointers perfectly. So just use
 * it like a simple C++ pointer.
 */
template< class T >
struct QSharedPtr
{
public:
  QSharedPtr() { ptr = 0; }
  QSharedPtr( T* t ) { ptr = t; }
  QSharedPtr( const QSharedPtr& p ) { ptr = p.ptr; if ( ptr ) ptr->ref(); }
  ~QSharedPtr() { if ( ptr && ptr->deref() ) delete ptr; }

  QSharedPtr<T>& operator= ( const QSharedPtr<T>& p ) {
    if ( ptr && ptr->deref() ) delete ptr;
    ptr = p.ptr; if ( ptr ) ptr->ref();
    return *this;
  }
  QSharedPtr<T>& operator= ( T* p ) {
    if ( ptr && ptr->deref() ) delete ptr;
    ptr = p;
    return *this;
  }
  bool operator== ( const QSharedPtr<T>& p ) const { return ( ptr == p.ptr ); }
  bool operator!= ( const QSharedPtr<T>& p ) const { return ( ptr != p.ptr ); }
  bool operator== ( const T* p ) const { return ( ptr == p ); }
  bool operator!= ( const T* p ) const { return ( ptr != p ); }
  bool operator!() const { return ( ptr == 0 ); }
  operator T*() const { return ptr; }

  const T& operator*() const { return *ptr; }
  T& operator*() { return *ptr; }
  const T* operator->() const { return ptr; }
  T* operator->() { return ptr; }

  uint count() const { return ptr->count; } // for debugging purposes
private:
  T* ptr;
};

#endif

Generated by: root@tantive.terraplex.com on Sun Feb 27 17:39:19 2000, using kdoc 2.0a33.