| 20 | |
| 21 | template <typename T> |
| 22 | class Counter { |
| 23 | public: |
| 24 | Counter() { |
| 25 | _count()++; |
| 26 | _increments()++; |
| 27 | } |
| 28 | Counter(const Counter &rhs) { |
| 29 | _count()++; |
| 30 | _increments()++; |
| 31 | } |
| 32 | Counter(Counter &&rhs) {} |
| 33 | ~Counter() { |
| 34 | _count()--; |
| 35 | } |
| 36 | static uint64_t count() { |
| 37 | return _count(); |
| 38 | } |
| 39 | static uint64_t increments() { |
| 40 | return _increments(); |
| 41 | } |
| 42 | static uint64_t decrements() { |
| 43 | return increments()-count(); |
| 44 | } |
| 45 | |
| 46 | private: |
| 47 | static std::atomic<uint64_t> &_count() { |
| 48 | static std::atomic<uint64_t> c; |
| 49 | return c; |
| 50 | } |
| 51 | static std::atomic<uint64_t> &_increments() { |
| 52 | static std::atomic<uint64_t> i; |
| 53 | return i; |
| 54 | } |
| 55 | }; |
| 56 | |
| 57 | #endif |
no outgoing calls