123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354 |
- #pragma once
- #include <cstddef>
- #include <atomic>
- /**
- * Simple thread-safe per-class counter that can be used to make sure you don't
- * have any leaks in your code, or for statistical purposes.
- *
- * Example usage:
- * \code
- * class TMyClass: public TObjectCounter<TMyClass> {
- * // ...
- * };
- *
- * // In your code:
- * Cerr << "TMyClass instances in use: " << TMyClass::ObjectCount() << Endl;
- * \endcode
- */
- template <class T>
- class TObjectCounter {
- public:
- inline TObjectCounter() noexcept {
- ++Count_;
- }
- inline TObjectCounter(const TObjectCounter& /*item*/) noexcept {
- ++Count_;
- }
- inline ~TObjectCounter() {
- --Count_;
- }
- static inline long ObjectCount() noexcept {
- return Count_.load();
- }
- /**
- * Resets object count. Mainly for tests, as you don't want to do this in
- * your code and then end up with negative counts.
- *
- * \returns Current object count.
- */
- static inline long ResetObjectCount() noexcept {
- return Count_.exchange(0);
- }
- private:
- static std::atomic<intptr_t> Count_;
- };
- template <class T>
- std::atomic<intptr_t> TObjectCounter<T>::Count_ = 0;
|