00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
#ifndef KSharedPTR_H
00019
#define KSharedPTR_H
00020
00039 class KShared {
00040
public:
00045 KShared() : count(0) { }
00046
00051 KShared(
const KShared & ) : count(0) { }
00052
00056 KShared &
operator=(
const KShared & ) {
return *
this; }
00057
00061 void _KShared_ref()
const { count++; }
00062
00067 void _KShared_unref()
const {
if (!--count)
delete this; }
00068
00074 int _KShared_count()
const {
return count; }
00075
00076
protected:
00077
virtual ~
KShared() { }
00078
private:
00079
mutable int count;
00080 };
00081
00099
template<
class T >
00100 struct KSharedPtr
00101 {
00102
public:
00106 KSharedPtr()
00107 : ptr(0) { }
00112 KSharedPtr( T* t )
00113 : ptr(t) {
if ( ptr ) ptr->_KShared_ref(); }
00114
00119 KSharedPtr(
const KSharedPtr& p )
00120 : ptr(p.ptr) {
if ( ptr ) ptr->_KShared_ref(); }
00121
00126 ~KSharedPtr() {
if ( ptr ) ptr->_KShared_unref(); }
00127
00128
KSharedPtr<T>& operator= (
const KSharedPtr<T>& p ) {
00129
if ( ptr == p.
ptr )
return *
this;
00130
if ( ptr ) ptr->_KShared_unref();
00131 ptr = p.
ptr;
00132
if ( ptr ) ptr->_KShared_ref();
00133
return *
this;
00134 }
00135
KSharedPtr<T>& operator= ( T* p ) {
00136
if ( ptr == p )
return *
this;
00137
if ( ptr ) ptr->_KShared_unref();
00138 ptr = p;
00139
if ( ptr ) ptr->_KShared_ref();
00140
return *
this;
00141 }
00142
bool operator== (
const KSharedPtr<T>& p )
const {
return ( ptr == p.
ptr ); }
00143
bool operator!= (
const KSharedPtr<T>& p )
const {
return ( ptr != p.
ptr ); }
00144
bool operator== (
const T* p )
const {
return ( ptr == p ); }
00145
bool operator!= (
const T* p )
const {
return ( ptr != p ); }
00146
bool operator!()
const {
return ( ptr == 0 ); }
00147 operator T*()
const {
return ptr; }
00148
00153 T*
data() {
return ptr; }
00154
00159 const T*
data()
const {
return ptr; }
00160
00161
const T& operator*()
const {
return *ptr; }
00162 T& operator*() {
return *ptr; }
00163
const T* operator->()
const {
return ptr; }
00164 T* operator->() {
return ptr; }
00165
00170 int count()
const {
return ptr->_KShared_count(); }
00171
private:
00172 T* ptr;
00173 };
00174
00175
#endif