47 ptr_counter(X* p = 0,
unsigned c = 1) : ptr(p), count(c) {}
54 ptr_counter(
const X* p = 0,
unsigned c = 1) : ptr(p), count(c) {}
58 ptr_counter& operator=(
const ptr_counter<
typename counted_ptr_remove_const<X>::type>& other) {
70 typedef X element_type;
75 if (p) itsCounter =
new counter(p);
95 counted_ptr(
const counted_ptr<Y>& r)
throw() {
96 acquire<Y>(r.itsCounter);
100 counted_ptr& operator=(
const counted_ptr<Y>& r) {
101 if (
const_cast<const counted_ptr<X>*
>(
this) ==
102 reinterpret_cast<const counted_ptr<X>*
>(
103 const_cast<const counted_ptr<Y>*
>(&r)))
106 acquire<Y>(r.itsCounter);
111 X& operator*()
const throw() {
return *itsCounter->ptr;}
112 X* operator->()
const throw() {
return itsCounter->ptr;}
113 X*
get()
const throw() {
return itsCounter ? itsCounter->ptr : 0;}
114 bool unique()
const throw() {
115 return (itsCounter ? itsCounter->count == 1 :
true);
127 template <
typename Y>
128 void acquire(ptr_counter<Y>* c)
throw() {
130 (void)static_cast<X*>(c->ptr);
131 itsCounter =
reinterpret_cast<counter*
>(c);
141 if (--itsCounter->count == 0) {
142 delete itsCounter->ptr;
280 #endif // COUNTED_PTR_H