35template <
typename A> 
class CountedReference {
 
   39  CountedReference(type *m) : p_{m} { Take(); }
 
   40  CountedReference(
const CountedReference &c) : p_{c.p_} { Take(); }
 
   41  CountedReference(CountedReference &&c) : p_{c.p_} { c.p_ = 
nullptr; }
 
   42  CountedReference &operator=(
const CountedReference &c) {
 
   48  CountedReference &operator=(CountedReference &&c) {
 
   55  ~CountedReference() { Drop(); }
 
   56  operator bool()
 const { 
return p_ != 
nullptr; }
 
   57  type *get()
 const { 
return p_; }
 
   58  type &operator*()
 const { 
return *p_; }
 
   59  type *operator->()
 const { 
return p_; }