14template <
class X>
class counted_ptr
17 typedef X element_type;
19 explicit counted_ptr(X* p = 0)
20 : itsCounter(0) {
if (p) itsCounter =
new counter(p);}
23 counted_ptr(
const counted_ptr& r)
throw()
24 {acquire(r.itsCounter);}
25 counted_ptr& operator=(
const counted_ptr& r)
29 acquire(r.itsCounter);
34#ifndef NO_MEMBER_TEMPLATES
35 template <
class Y>
friend class counted_ptr<Y>;
36 template <
class Y> counted_ptr(
const counted_ptr<Y>& r)
throw()
37 {acquire(r.itsCounter);}
38 template <
class Y> counted_ptr& operator=(
const counted_ptr<Y>& r)
42 acquire(r.itsCounter);
48 X& operator*()
const throw() {
return *itsCounter->ptr;}
49 X* operator->()
const throw() {
return itsCounter->ptr;}
50 X* get()
const throw() {
return itsCounter ? itsCounter->ptr : 0;}
51 bool unique()
const throw()
52 {
return (itsCounter ? itsCounter->count == 1 :
true);}
57 counter(X* p = 0,
unsigned c = 1) : ptr(p), count(c) {}
62 void acquire(counter* c)
throw()
71 if (--itsCounter->count == 0) {
72 delete itsCounter->ptr;