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_; }