38 ptr_counter(X* p = 0,
unsigned c = 1) : ptr(p), count(c) {}
52 if (p) itsCounter =
new counter(p);
63 acquire<X>(r.itsCounter);
73 acquire<X>(r.itsCounter);
80 acquire<Y>(r.itsCounter);
85 if ((
const void*)
this != (
const void*)(&r))
88 acquire<Y>(r.itsCounter);
93 X& operator*()
const {
return *itsCounter->ptr;}
94 X* operator->()
const {
return itsCounter->ptr;}
95 X*
get()
const {
return itsCounter ? itsCounter->ptr : 0;}
97 return (itsCounter ? itsCounter->count == 1 :
true);
104 template <
typename Y>
107 (void)static_cast<X*>(c->ptr);
108 itsCounter =
reinterpret_cast<counter*
>(c);
118 if (--itsCounter->count == 0) {
119 delete itsCounter->ptr;
140 if (p) itsCounter =
new counter(p);
151 acquire<const X>(r.itsCounter);
154 acquire<const X>(
reinterpret_cast<counter*
>(r.itsCounter));
164 acquire<const X>(r.itsCounter);
175 acquire<Y>(r.itsCounter);
180 if ((
const void*)
this != (
const void*)(&r))
183 acquire<Y>(r.itsCounter);
188 const X& operator*()
const {
return *itsCounter->ptr;}
189 const X* operator->()
const {
return itsCounter->ptr;}
190 const X*
get()
const {
return itsCounter ? itsCounter->ptr : 0;}
191 bool unique()
const {
192 return (itsCounter ? itsCounter->count == 1 :
true);
199 template <
typename Y>
202 (void)static_cast<const X*>(c->ptr);
203 itsCounter =
reinterpret_cast<counter*
>(c);
213 if (--itsCounter->count == 0) {
214 delete itsCounter->ptr;
224 #endif // COUNTED_PTR_H